Gatsby项目调用不存在函数,原项目未报错原因咨询
这种情况我碰到过好多次,本质上大多是依赖版本或构建环境不一致导致的,下面给你拆解几个最可能的原因,以及对应的排查方向:
1. 缺失依赖版本锁定文件(yarn.lock)
原项目里的yarn.lock文件是用来锁定依赖精确版本的,如果你复制项目时没把它一起拷贝过去,运行yarn install就会按照package.json里的版本范围(比如^1.0.0)去安装最新的兼容版本。
举个例子:原项目用的是some-package@1.2.3,这个版本里有你调用的函数,但package.json里写的是"some-package": "^1.0.0",新安装时可能拿到1.5.0——刚好这个版本移除了那个函数,自然就报错了。而原项目因为有yarn.lock,始终安装的是1.2.3,所以没任何问题。
排查:把原项目的yarn.lock拷贝到新项目,重新执行yarn install后再运行试试。
2. Gatsby缓存掩盖了问题
原项目运行时,Gatsby会生成.cache和public文件夹缓存编译结果。如果某个依赖包后来更新了接口,但原项目的缓存还保留着旧的编译代码,就会出现“依赖已经变了,但项目还能正常跑”的假象。
而新项目没有这些缓存,需要重新编译所有代码,依赖的最新版本(或者正确版本)的问题就直接暴露出来了。
排查:删除原项目的.cache和public文件夹,然后重新运行gatsby develop,看原项目会不会也出现同样的错误——如果会,就说明缓存是“背锅侠”。
3. 隐性依赖未被记录
原项目可能存在一些没被package.json记录的隐性依赖:比如你曾经手动把某个包放进node_modules,或者全局安装了某个依赖(比如gatsby-cli的特定版本),但新项目里没有这些。
举个例子:你调用的函数来自一个没加到package.json的小工具包,原项目里有这个包,但复制时没带,yarn install自然不会安装它,运行时就会提示函数不存在。
排查:对比原项目和新项目的node_modules文件夹,看有没有缺失的包;或者检查原项目的全局依赖(用yarn global list),看是否有项目依赖的全局包。
4. 环境配置差异
原项目可能有.env环境变量文件,或者gatsby-config.js里的配置开启了某些特性、禁用了某些错误检查,而新项目没有这些配置,导致错误显现。
比如某些Gatsby插件在特定配置下会动态加载模块,或者忽略一些缺失的函数调用;原项目配置了这些,新项目没配置就直接报错了。
排查:把原项目的.env(如果有)拷贝到新项目,对比两个项目的gatsby-config.js、gatsby-node.js等配置文件,看是否有差异。
快速排查步骤总结
- 拷贝原项目的
yarn.lock到新项目,重新yarn install; - 删除原项目的
.cache和public,重新运行,验证是否是缓存问题; - 对比两个项目的依赖版本,重点排查涉及那个不存在函数的包;
- 检查是否有隐性依赖或环境配置差异。
内容的提问来源于stack exchange,提问作者userjmillohara

