尝试使用节点中的requirejs,当我按照Node节点中的RequireJS中的描述运行同步调用时,使用以下内容...
//Retrieves the module value for 'a' synchronously
var a = requirejs('a') )
但是,当我尝试这种方法时,它会执行两次请求吗?
... part0_start.js
var requirejs = require('requirejs');
requirejs.config({
nodeRequire : require
});
var part1_setup = requirejs( 'part1_setup' )
console.log( 'part1_setup complete')
... part1_setup.js
requirejs([], function() {
console.log( 'setup');
})
这应该输出......
setup
part1_setup complete
但是输出......
setup
setup
part1_setup complete
有人可以开导我吗?
答案 0 :(得分:0)
您必须使用requirejs
替换part1_setup.js
中的define
来电。
当你在节点中使用RequireJS时,有一个特点:如果RequireJS无法自己加载模块,它将尝试让Node的require
加载模块。以下是您的代码所发生的情况:
var part1_setup = requirejs( 'part1_setup' )
告诉RequireJS加载part1_setup1
模块。请注意,您使用require
调用的同步形式(嗯,它的名称是requirejs
但它确实是RequireJS'require
调用。而在浏览器中,此类调用不是真正同步(并且您的特定调用将失败),而在Node中它确实是同步的。
RequireJS加载您的模块并执行它。由于您没有匿名define
(未指定模块名称的define
),因此模块加载失败。您需要一个匿名define
来帮助RequireJS确定它应该运行的工厂函数,以便定义模块。但是,文件中的代码是执行的,所以当依赖关系[]
加载时,你告诉RequireJS,然后执行我的回调“。没有什么可加载的。 RequireJS执行打印setup
。
这在节点中运行RequireJS非常特殊:由于模块加载失败,RequireJS会使用您的模块名称调用Node的require
函数。节点查找模块并加载它。因此Node再次执行文件中的代码,并再次执行requirejs([],...
,这意味着打印setup
的回调再次运行。
您的模块文件应始终有define
,而不是require
(或requirejs
)来电。