【问题标题】:Requirejs in node executing call twice for no reason?节点中的Requirejs无缘无故执行两次调用?
【发布时间】:2015-06-25 08:45:27
【问题描述】:

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

谁能赐教?

【问题讨论】:

    标签: node.js requirejs sync


    【解决方案1】:

    您必须将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“当依赖项 [] 已加载时,然后执行我的回调”。没有什么可以加载的。 RequireJS 执行打印setup 的回调。

    3. 这是在 Node 中运行 RequireJS 的特殊情况: 因为模块加载失败,RequireJS 然后用你的模块名称调用 Node 的 require 函数。 Node 查找模块并加载它。于是Node第二次执行文件中的代码,再次执行requirejs([],...,这意味着打印setup的回调再次运行。

    您的模块文件中应该始终包含define,而不是require(或requirejs)调用。

    【讨论】:

      猜你喜欢
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      • 2016-02-04
      • 2015-02-21
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多