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

Requirejs in node executing call twice for no reason?

试图在节点中使用 requirejs,当我 运行 一个同步调用如 RequireJS in Node 手册中所述时...

//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

谁能赐教吗?

您必须将 part1_setup.js 中的 requirejs 调用替换为 define

当你在 node 中使用 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 "when the dependencies [] have loaded, then execute my callback"。没有什么可加载的。 RequireJS 执行打印 setup.

  3. 的回调
  4. 这是Node中运行ning RequireJS的特殊之处:因为模块加载失败,RequireJS再调用Node的require函数与您的模块名称。 Node 查找模块并加载它。于是Node第二次执行了文件中的代码,再次执行了requirejs([],...,也就是再次打印了setup运行s的回调

您的模块文件中应该始终有一个 define 而不是 require(或 requirejs)调用。