为什么节点上的 requirejs 在继续之前没有加载指定的要求

why is requirejs on node not loading the require specified before continuing

更新...

即使没有异步加载文件操作,它仍然不会运行根据您的解释我希望它如何...例如

part0_start.js...

var requirejs = require('requirejs');
requirejs.config({
    nodeRequire : require
});
requirejs([ 'part1_setup'], function( part1_setup ) {//this callback executes when part1_setup has been compiled and run
    console.log( 'part1_setup callback called')
})

part1_setup.js...

requirejs( [ 'stopwatchObject' ], function( stopwatch ) {//run the callback function when stopwatchObject is loaded...
    console.log( 'stopwatch object compiled' );
})

stopwatchObject.js...

define ( [], function() {//this anonymous function happens straight away, go straight to the callback function on line below...
    console.log( "stopwatch object");
})

我希望这会输出

stopwatch object
stopwatch object compiled
part1_setup callback called

但它实际上输出...

part1_setup callback called
stopwatch object
stopwatch object compiled

还是我忽略了一些明显的东西?再次感谢您的反馈。


我对 requirejs 的理解是它允许我在继续线程之前指定要加载的模块,允许我在需要时被阻塞。当我以前使用它时,它就是这样工作的。但是,当我将它与节点一起使用时,它的这一方面不再有效。显然我知道节点是非阻塞的,这就是为什么 require 没有像我期望的那样运行的原因。 例如...

test.txt

test text test text test text test text test text test text test text

start.js

var requirejs = require('requirejs');
requirejs.config({
    nodeRequire : require
});
requirejs([ 'part1'], function( part1 ) {
    console.log( 'loaded' )
})

part1.js

define([], function() {
var fs = require('fs'), filename = 'test.txt';
fs.readFile(filename, 'utf8', function(err, data) {
    if (err) throw err;
    this.text = data;
    console.log( this.text );
})

})

按以下顺序输出...

module loaded
test text test text test text test text test text test text test text

但是如果我指定需要 part1.js,它不应该在开始记录之前完全编译并记录加载的文本吗?'loaded'?

您所看到的正是预期的结果。这是事件的顺序:

  1. requirejs([ 'part1'], 告诉 RequireJS 开始加载 part1。加载将在未来的某个时间完成。

  2. RequireJS 获取part1的代码并执行。它找到一个匿名 define,RequireJS 将其解释为 part1 的定义,因此它执行传递给 define.

  3. 的回调
  4. fs.readFile被执行。这将启动读取文件。该操作将在未来的某个时间完成。 这是异步的。

  5. 传递给 define 的回调的执行继续并完成。如果在 fs.readFile 之后有一个 console.log 语句,您会在文件内容 之前 看到它的输出。

  6. 由于传递给 define 的回调执行完成,RequireJS 然后可以调用传递给 requirejs([ 'part1'], 的回调。 没有理由必须延迟。特别是,fs.readFile 操作与此无关。

  7. 最终读取文件并调用传递给 fs.readFile 的回调。

如果您使用 fs.readFileSync,那么您会得到预期的行为。

旁注:在您的代码中使用 this.text 可能没有按照您认为的那样进行。在你的代码中 this === global.