Node 8.9.4+Jest环境下,require未加.js扩展名为何失效?
解决Jest测试中省略.js扩展名导致模块引入为undefined的问题
这问题我之前维护旧Node项目时也碰到过,结合你用的Node 8.9.4版本,咱们来拆解下原因和解决办法:
问题根源
Node.js的CommonJS模块机制本身允许省略.js扩展名——当你用require('./block')时,Node会自动尝试查找./block.js、./block.json甚至./block目录下的入口文件。但Jest的模块解析逻辑和Node原生有差异,尤其是在旧版本Jest配合Node 8.x的场景下,它可能不会自动补全.js扩展名,导致找不到对应模块,最终返回undefined。
可行解决方案
- 显式添加
.js扩展名:这是最直接的临时解决办法,就像你已经发现的,在Jest测试文件里把引入语句改成const Block = require('./block.js');,明确指定文件后缀,让Jest能精准找到模块文件。 - 配置Jest的模块扩展名列表:在项目根目录的
jest.config.js(如果没有就新建一个)里,添加moduleFileExtensions配置,告诉Jest自动尝试这些扩展名的文件:
这个配置会让Jest在遇到不带扩展名的module.exports = { // 其他Jest配置... moduleFileExtensions: ['js', 'json'], };require时,依次尝试.js和.json后缀的文件,和Node原生的行为对齐。 - 检查模块映射配置:如果你的Jest配置里有
moduleNameMapper项,确认它没有把./block这类相对路径错误映射到其他位置,避免干扰正常的模块查找。
另外提一句,Node 8.9.4已经是比较老旧的版本了,后续如果有升级计划,新版本的Node和Jest在模块解析上的兼容性会更好,但就当前场景而言,上面的方法足够解决问题。
内容的提问来源于stack exchange,提问作者Bastien
相关产品推荐
相关产品推荐

