5

我有一组用于浏览器端但用 mocha 测试服务器端的对象。我正在使用 require.js 进行 AMD 加载。Require.js 站点建议在服务器端使用 amdefine 来让定义的模块在 node.js 中使用以下代码:

if (typeof define !== 'function') {
    var define = require('amdefine')(module)
}

好的。但是我必须把它放到我想在 Node.js 中使用的每个模块中。在我的情况下,这意味着我必须将它从我正在使用的客户端(大部分)代码中剥离出来。

我想知道是否有任何方法可以将那段代码放入我的测试中,这样我就不必将它放入我的客户端代码中。在我的文件中包含仅用于测试的代码似乎很愚蠢——将其放入测试代码中更有意义。但是,当我这样做时,我得到一个错误:

Error: amdefine with no module ID cannot be called more than once per file.
    at runFactory (/home/vmplanet/dev/alpha/web/node_modules/amdefine/amdefine.js:159:23)
    at define (/home/vmplanet/dev/alpha/web/node_modules/amdefine/amdefine.js:275:13)
    at Object.<anonymous> (/home/vmplanet/dev/alpha/web/assets/src/coffee/delta/dataLayer.coffee:4:3)
    at Object.<anonymous> (/home/vmplanet/dev/alpha/web/assets/src/coffee/delta/dataLayer.coffee:158:4)
    at Module._compile (module.js:456:26)
    at Object.loadFile (/usr/lib/node_modules/coffee-script/lib/coffee-script/coffee-script.js:179:19)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)

这是一个奇怪的错误,因为 amdefine 代码只在一个地方——测试文件的顶部。有没有办法把这个 amdefine 代码放在我的测试中,并且只放在我的测试中,并且仍然让测试运行服务器端——而不必为客户端剥离 amdefine 代码?

4

1 回答 1

2

如果你使用amd-loader,你可以这样做:

require("amd-loader");
var datatypes = require("../build/dist/lib/salve/datatypes");
var name_resolver = require("../build/dist/lib/salve/name_resolver");

而已。您只需要先使用 amd-loader,然后您就可以随意加载 AMD 样式的模块。(在上面的例子中,在 amd-loader 之后加载的两个模块是 AMD 风格的模块。)并且 AMD 风格的模块可以加载其他 AMD 风格的模块。

上面的代码片段是来自我的一个测试套件的实际代码,它测试了一个设计为 AMD 风格的库,以便可以使用 RequireJS 加载它,但在 Node.js 中进行测试。

于 2014-01-30T02:20:03.437 回答