RequireJS + Mocha + JSDom + Node -> Node 不支持 Shim 配置

RequireJS + Mocha + JSDom + Node -> Shim config not supported in Node

我正在尝试使用 JSDom 和 RequireJS 设置一个 Mocha 测试框架。因为我 运行 在节点上测试而不是使用浏览器(因为我使用的是 JSDom),所以所有非 AMD 模块似乎都没有被导入并且正在抛出 Shim config not supported in Node。有谁知道我如何将这些模块导出到 AMD 或者正确的方法是什么? (也就是我做错了什么)

我的设置示例

Component.js

define(["jquery", "non_AMD_Module", ... ], function($, NonAMDModule, ...) {
  let component = {
    ...
    foo = () => {
      NonAMDModule.bar();
    };
  };
  return component;
});

Component.test.js

const requirejs = require('requirejs');
const { JSDOM }  = require('jsdom');

requirejs.config({
  baseUrl: "dist/app",
  paths: {
    jquery: "lib/jquery",
    component: "path_to_component",
    non_AMD_Module: "path_to_module"
  },
  shim: {
    non_AMD_Module: { exports: "non_AMD_Module" } // This doesn't work
  }
});

const { window } = new JSDOM("<html></html>");
global.window = window;
global.document = window.document;
global.$ = requirejs('jquery');

const Component = requireJS('component');
describe('test', () => {
  it('is a simple test', () => {
     const testComponent = new Component();
     testComponent.foo();
  }
});

当我 运行 测试套件时,我得到:

Mocha Exploded!
  TypeError: Cannot read property 'bar' of undefined

运行ning r.js -convert "path_to_module" 不适用于此模块

查看 jQuery 的源代码,我发现有这个样板代码可以将其导出到 AMD。

这可以添加到非 AMD 模块的底部,以便将其导出到 RequireJS 可访问的 AMD 模块

if ( typeof define === "function" && define.amd ) {
  define([], function {
    return non_AMD_Module;
  });
}

其他资源:

Shim a module in Require.js that uses module.exports possible?

https://github.com/requirejs/requirejs/wiki/Updating-existing-libraries#anon