You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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自动尝试这些扩展名的文件:
    module.exports = {
      // 其他Jest配置...
      moduleFileExtensions: ['js', 'json'],
    };
    
    这个配置会让Jest在遇到不带扩展名的require时,依次尝试.js和.json后缀的文件,和Node原生的行为对齐。
  • 检查模块映射配置:如果你的Jest配置里有moduleNameMapper项,确认它没有把./block这类相对路径错误映射到其他位置,避免干扰正常的模块查找。

另外提一句,Node 8.9.4已经是比较老旧的版本了,后续如果有升级计划,新版本的Node和Jest在模块解析上的兼容性会更好,但就当前场景而言,上面的方法足够解决问题。

内容的提问来源于stack exchange,提问作者Bastien

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:44:04