Node.js应用部署Heroku报错Cannot find module './Utilities'
故障根因
Error: Cannot find module './Utilities'报错和手写的index.js业务代码、Heroku平台配置无关,是第三方依赖兼容问题叠加运行环境差异导致的:
- 本地开发环境为Windows或macOS,这两个系统的文件系统默认大小写不敏感,依赖里就算引用路径和实际文件名大小写不匹配,也能正常加载模块,所以本地运行完全正常
- Heroku运行环境为Linux,文件系统大小写严格敏感,只要引用路径的文件名大小写写错、或者依赖包发布时漏打了对应文件,就会直接抛出模块找不到的错误
- 你安装的
@dovakiin0/anime-data@1.6.3版本本身存在发布缺陷:包内代码写的是引用./Utilities,但实际发布到npm的包中,对应文件要么是全小写命名的utilities.js,要么根本没被打包进发布版本,本地靠大小写不敏感的机制能正常运行,到Linux环境就直接触发报错。
修复步骤
按优先级执行以下方案即可:
- 替换存在问题的依赖版本
先在本地项目目录执行命令卸载现有问题版本:
安装修复了该路径问题的版本,优先选择最新稳定版:npm uninstall @dovakiin0/anime-data
安装完成后本地启动项目验证接口功能正常,再把更新后的npm install @dovakiin0/anime-data@latestpackage.json和package-lock.json提交到Git重新部署即可。 - 如果最新版本仍存在该问题,用补丁方式修复
打开本地项目的node_modules/@dovakiin0/anime-data目录,全局搜索代码里所有require('./Utilities')的引用,把路径改成和目录下实际文件名完全一致的大小写(比如实际文件为小写就改成require('./utilities')),之后用patch-package生成依赖补丁提交到仓库,Heroku部署时安装完依赖会自动应用补丁,不会再出现路径错误。 - 规避额外配置问题
当前的.gitignore配置是正确的,不要把本地的node_modules目录提交到Git,Heroku会自动根据依赖清单安装适配Linux环境的依赖包,上传本地node_modules反而会因为系统二进制不兼容触发更多运行错误。现有的Procfile、package.json里的Node版本配置、启动脚本都没有问题,不需要调整。
内容的提问来源于stack exchange,提问作者Dat Tran
相关产品推荐
相关产品推荐

