Javascript 为什么不是';t CommonJS';需要异步函数吗?

Javascript 为什么不是';t CommonJS';需要异步函数吗?,javascript,node.js,commonjs,Javascript,Node.js,Commonjs,加载CommonJS模块时,我们使用同步的require语句。 但是加载模块不需要从磁盘上读取并解释它们吗。那么在我们提倡非阻塞I/O的设置中,require为什么是同步的呢 更新: 我在客户机中见过并使用过requireJS,并且能够欣赏它的异步特性。我想知道的是,为什么在服务器上做这种事情并不普遍(我知道requireJS可以在Node中使用,但这不是重点) 此外,我还想知道在我的代码中要求内联模块是否会导致代码阻塞,这是否是一种不好的做法,应该避免。requireing模块通常是您在程序开

加载CommonJS模块时,我们使用同步的
require
语句。 但是加载模块不需要从磁盘上读取并解释它们吗。那么在我们提倡非阻塞I/O的设置中,
require
为什么是同步的呢

更新:

我在客户机中见过并使用过requireJS,并且能够欣赏它的异步特性。我想知道的是,为什么在服务器上做这种事情并不普遍(我知道requireJS可以在Node中使用,但这不是重点)


此外,我还想知道在我的代码中要求内联模块是否会导致代码阻塞,这是否是一种不好的做法,应该避免。

require
ing模块通常是您在程序开始时做的事情。如果在程序开始时不这样做,结果将被缓存。启动这样的程序:

var fs = require('fs');
var http = require('http');
var oranges = require('oranges');

// Do stuff
require('async', function(err, async) {
    async.map(['fs', 'http', 'oranges'], function(err, modules) {
        var fs = modules[0], http = modules[1], oranges = modules[2];

        // Do stuff
    });
});
其工作原理与启动以下程序相同:

var fs = require('fs');
var http = require('http');
var oranges = require('oranges');

// Do stuff
require('async', function(err, async) {
    async.map(['fs', 'http', 'oranges'], function(err, modules) {
        var fs = modules[0], http = modules[1], oranges = modules[2];

        // Do stuff
    });
});

不同之处在于,其中一个是不必要的复杂。是的,可能实现了某种语法糖,但它仍然没有任何好处,除非是在一些很小的边缘情况下。

通常,
require
用于加载依赖项。依赖项必须存在,以便其依赖项发挥作用。因此同步加载。@MichaelBerkowski是的,但我可以在函数体中内联执行以下操作:
require('crypto')。createHash('md5')。update(pwd+salt)。digest(“hex”)
inline。这会使我的代码阻塞吗?@lorefnon第一次会被阻塞,所有后续的代码都会从缓存中提供服务(但node.js docu没有说明这到底是如何工作的)。但你为什么要这么做?只需要像其他人一样将加密库放在文件的顶部即可。相关:@Prinzhorn感谢您对缓存的指导。。。如果你能把它作为答案贴出来,我很乐意接受。