我有一组使用浏览器端但使用mocha测试服务器端的对象。我正在使用require.js进行AMD加载。 Require.js站点建议在服务器端使用amdefine来使用这段代码在node.js中使用定义的模块:
if (typeof define !== 'function') {
var define = require('amdefine')(module)
}
行。但我必须把它放到我想在Node中使用的每个模块中。在我的情况下,这意味着我必须将其从我使用客户端(大部分)的任何代码中删除。
我想知道是否有办法在我的测试中放入那一大块代码,这样我就不必把它放在我的客户端代码中了。在我的文件中只有测试所需的代码似乎很愚蠢 - 将它放在测试代码中更有意义。但是,当我这样做时,我收到一个错误:
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代码?
答案 0 :(得分: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风格的模块。
上面的代码段是来自one of my test suites的实际代码,它测试了一个设计为AMD风格的库,以便可以使用RequireJS加载它,但是在Node.js中进行了测试。