节点中的requirejs无缘无故地执行两次调用?

时间:2015-06-24 23:48:47

标签: node.js requirejs sync

尝试使用节点中的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

有人可以开导我吗?

1 个答案:

答案 0 :(得分:0)

您必须使用requirejs替换part1_setup.js中的define来电。

当你在节点中使用RequireJS时,有一个特点:如果RequireJS无法自己加载模块,它将尝试让Node的require加载模块。以下是您的代码所发生的情况:

  1. var part1_setup = requirejs( 'part1_setup' )告诉RequireJS加载part1_setup1模块。请注意,您使用require调用的同步形式(嗯,它的名称是requirejs但它确实是RequireJS'require调用。而在浏览器中,此类调用不是真正同步(并且您的特定调用将失败),而在Node中它确实是同步的。

  2. RequireJS加载您的模块并执行它。由于您没有匿名define(未指定模块名称的define),因此模块加载失败。您需要一个匿名define来帮助RequireJS确定它应该运行的工厂函数,以便定义模块。但是,文件中的代码是执行的,所以当依赖关系[]加载时,你告诉RequireJS,然后执行我的回调“。没有什么可加载的。 RequireJS执行打印setup

  3. 的回调
  4. 这在节点中运行RequireJS非常特殊:由于模块加载失败,RequireJS会使用您的模块名称调用Node的require函数。节点查找模块并加载它。因此Node再次执行文件中的代码,并再次执行requirejs([],...,这意味着打印setup的回调再次运行。

  5. 您的模块文件应始终有define,而不是require(或requirejs)来电。