节点中的 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
来加载模块。以下是您的代码所发生的情况:
var part1_setup = requirejs( 'part1_setup' )
告诉 RequireJS 加载你的 part1_setup1
模块。请注意,您在这里使用的是 require
调用的同步形式(好吧,它的名称是 requirejs
但它实际上是 RequireJS 的 require
调用)。虽然在浏览器中这样的调用不是真正同步的(并且您的特定调用会失败),但在 Node 中它是真正同步的。
RequireJS 加载你的模块并执行它。因为你里面没有匿名的define
(一个没有指定模块名的define
),模块加载失败。您需要一个匿名 define
来让 RequireJS 确定它应该 运行 的工厂函数,以便定义模块。然而,文件 中的代码被执行 所以你告诉 RequireJS "when the dependencies []
have loaded, then execute my callback"。没有什么可加载的。 RequireJS 执行打印 setup
.
的回调
这是Node中运行ning RequireJS的特殊之处:因为模块加载失败,RequireJS再调用Node的require
函数与您的模块名称。 Node 查找模块并加载它。于是Node第二次执行了文件中的代码,再次执行了requirejs([],...
,也就是再次打印了setup
运行s的回调
您的模块文件中应该始终有一个 define
而不是 require
(或 requirejs
)调用。
试图在节点中使用 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
来加载模块。以下是您的代码所发生的情况:
var part1_setup = requirejs( 'part1_setup' )
告诉 RequireJS 加载你的part1_setup1
模块。请注意,您在这里使用的是require
调用的同步形式(好吧,它的名称是requirejs
但它实际上是 RequireJS 的require
调用)。虽然在浏览器中这样的调用不是真正同步的(并且您的特定调用会失败),但在 Node 中它是真正同步的。RequireJS 加载你的模块并执行它。因为你里面没有匿名的
define
(一个没有指定模块名的define
),模块加载失败。您需要一个匿名define
来让 RequireJS 确定它应该 运行 的工厂函数,以便定义模块。然而,文件 中的代码被执行 所以你告诉 RequireJS "when the dependencies[]
have loaded, then execute my callback"。没有什么可加载的。 RequireJS 执行打印setup
. 的回调
这是Node中运行ning RequireJS的特殊之处:因为模块加载失败,RequireJS再调用Node的
require
函数与您的模块名称。 Node 查找模块并加载它。于是Node第二次执行了文件中的代码,再次执行了requirejs([],...
,也就是再次打印了setup
运行s的回调
您的模块文件中应该始终有一个 define
而不是 require
(或 requirejs
)调用。