为什么节点上的 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'?
您所看到的正是预期的结果。这是事件的顺序:
requirejs([ 'part1'],
告诉 RequireJS 开始加载 part1
。加载将在未来的某个时间完成。
RequireJS 获取part1
的代码并执行。它找到一个匿名 define
,RequireJS 将其解释为 part1
的定义,因此它执行传递给 define
.
的回调
行fs.readFile
被执行。这将启动读取文件。该操作将在未来的某个时间完成。 这是异步的。
传递给 define
的回调的执行继续并完成。如果在 fs.readFile
之后有一个 console.log
语句,您会在文件内容 之前 看到它的输出。
由于传递给 define
的回调执行完成,RequireJS 然后可以调用传递给 requirejs([ 'part1'],
的回调。 没有理由必须延迟。特别是,fs.readFile
操作与此无关。
最终读取文件并调用传递给 fs.readFile
的回调。
如果您使用 fs.readFileSync
,那么您会得到预期的行为。
旁注:在您的代码中使用 this.text
可能没有按照您认为的那样进行。在你的代码中 this === global
.
更新...
即使没有异步加载文件操作,它仍然不会运行根据您的解释我希望它如何...例如
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'?
您所看到的正是预期的结果。这是事件的顺序:
requirejs([ 'part1'],
告诉 RequireJS 开始加载part1
。加载将在未来的某个时间完成。RequireJS 获取
part1
的代码并执行。它找到一个匿名define
,RequireJS 将其解释为part1
的定义,因此它执行传递给define
. 的回调
行
fs.readFile
被执行。这将启动读取文件。该操作将在未来的某个时间完成。 这是异步的。传递给
define
的回调的执行继续并完成。如果在fs.readFile
之后有一个console.log
语句,您会在文件内容 之前 看到它的输出。由于传递给
define
的回调执行完成,RequireJS 然后可以调用传递给requirejs([ 'part1'],
的回调。 没有理由必须延迟。特别是,fs.readFile
操作与此无关。最终读取文件并调用传递给
fs.readFile
的回调。
如果您使用 fs.readFileSync
,那么您会得到预期的行为。
旁注:在您的代码中使用 this.text
可能没有按照您认为的那样进行。在你的代码中 this === global
.