Drupal 7.x中D3模块示例无法显示,报'Uncaught TypeError'求助
这个错误Uncaught TypeError: Cannot read property 'linear' of undefined通常有两个核心原因:要么D3库根本没被加载(路径/缓存问题),要么加载的D3版本和模块不兼容。我帮你一步步排查:
先确认D3文件结构是否符合模块要求
Drupal的库系统对路径要求很严格。Drupal 7的D3模块默认期望的路径是sites/all/libraries/d3/d3.js(或者压缩版d3.min.js)。检查你的目录:- 不要把d3.js放在子目录里(比如
d3/dist/d3.js),直接移到d3目录根下 - 确保文件名是
d3.js或d3.min.js,模块会自动识别这两个文件名
- 不要把d3.js放在子目录里(比如
检查D3版本是否兼容
你遇到的linear方法是D3 v3.x的API,从v4开始这个方法改名为scaleLinear()了。Drupal 7的D3模块(包括D3 Views和Examples)只支持D3 v3.x版本,如果你上传的是v4+版本,肯定会出这个错。建议下载D3 v3.5.17(最后一个v3稳定版)替换当前文件,再测试。强制清除Drupal缓存
Drupal不会自动检测新添加的库,必须手动清除缓存才能让系统识别到新的库文件:- 后台操作:进入
配置 -> 性能,点击"清除所有缓存" - 命令行(如果用Drush):执行
drush cc all
- 后台操作:进入
确认D3核心模块已启用
D3 Views和D3 Examples都是依赖D3核心模块的,如果你只启用了这两个子模块,没启用d3核心模块,库根本不会被加载。去模块页面检查,确保D3模块处于启用状态。检查浏览器网络请求是否有404错误
打开浏览器开发者工具(F12),切换到Network标签,刷新示例页面,搜索d3.js:- 如果看到404状态码,说明路径不对,回到第一步调整文件位置
- 如果根本没有这个请求,说明模块没触发库的加载,检查模块是否启用、缓存是否清除
检查文件权限
确保sites/all/libraries/d3目录和里面的文件权限正确,Web服务器用户(比如www-data)需要有读取权限。Linux系统下通常设置目录权限为755,文件权限为644。暂时禁用JS聚合/优化模块
如果你的站点用了类似Advanced CSS/JS Aggregation这类模块,可能会干扰D3.js的加载。暂时禁用这类模块,刷新页面测试是否恢复正常。
内容的提问来源于stack exchange,提问作者user299791

