Node环境下RequireJS+Mocha+JSDom测试报Shim config不支持错误如何解决?
问题根源
Node 环境下运行的 RequireJS 原生不支持 shim 配置,shim 是专门为浏览器环境设计的兼容能力,这也是你收到Shim config not supported in Node报错的直接原因。r.js -convert转换失效是因为转换脚本仅能识别固定格式的 CommonJS 或简单全局挂载模块,对自定义导出逻辑的非标准非 AMD 模块识别率很低。
可行解决方案
方案1:手动预注册非 AMD 模块(无侵入业务代码,最推荐)
不需要修改原有业务代码和依赖声明,只需要在测试启动时、加载业务组件前,手动给 RequireJS 注册对应模块即可,修改Component.test.js代码如下:
const requirejs = require('requirejs'); const { JSDOM } = require('jsdom'); requirejs.config({ baseUrl: "dist/app", paths: { jquery: "lib/jquery", component: "path_to_component" } // 删掉不生效的shim配置 }); const { window } = new JSDOM("<html></html>"); global.window = window; global.document = window.document; global.$ = requirejs('jquery'); // 新增:提前用Node原生require加载非AMD模块 const nonAMDModule = require('path_to_module'); // 此处路径为相对于测试文件的Node可识别路径 // 新增:手动给RequireJS注册对应名称的模块,匹配组件中声明的依赖名 requirejs.define('non_AMD_Module', [], () => nonAMDModule); // 如果该模块依赖window全局挂载,额外加一句 global.window.non_AMD_Module = nonAMDModule; const Component = requirejs('component'); describe('test', () => { it('is a simple test', () => { // 注意:Component导出的是普通对象,不需要new操作符 Component.foo(); }); });
方案2:封装 AMD 兼容包装层
如果多个测试文件都需要用到该非 AMD 模块,可以单独封装一个 AMD 格式的包装文件,例如新建wrappers/non_AMD_Module.js:
define([], function() { // 直接返回Node原生require加载的模块实例 return require('path_to_your_non_amd_module'); })
之后修改 RequireJS 配置的 paths 指向该包装文件即可:
paths: { // ...其他配置 non_AMD_Module: "wrappers/non_AMD_Module" }
方案3:直接挂载到全局对象
如果你的非 AMD 模块原本就是浏览器环境下直接挂载到window的第三方库,可以在初始化 JSDOM 之后直接用 Node 原生 require 加载该模块,模块会自动挂载到你提前绑定到 global 的 window 对象上,RequireJS 加载时会自动读取对应全局变量:
const { window } = new JSDOM("<html></html>"); global.window = window; // 直接加载非AMD模块,自动完成全局挂载 require('path_to_non_amd_module');
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

