【问题标题】:Why isn't CommonJS's require function asynchronous?为什么 CommonJS 的 require 函数不是异步的?
【发布时间】:2012-12-16 16:22:32
【问题描述】:

在加载 CommonJS 模块时,我们使用 require 语句,这是同步的。 但是加载模块不涉及从磁盘读取它们并解释它们。那么在我们提倡非阻塞 I/O 的设置中,require 怎么会是同步的呢?

更新:

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

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

【问题讨论】:

  • 大多数情况下,require 用于加载依赖项。并且依赖项必须存在,以便它们的依赖项起作用。因此同步加载。
  • @MichaelBerkowski 是的,但我可以做类似的事情:require('crypto').createHash('md5').update(pwd+salt).digest("hex") 在函数体内内联。它会让我的代码阻塞吗?
  • @lorefnon 第一次将被阻塞,所有后续的将从缓存中提供(但 node.js 文档没有说明这到底是如何工作的)。但你为什么要这样做?只需像其他人一样需要文件顶部的加密库。
  • @Prinzhorn 感谢您对缓存的关注...如果您可以将其发布为答案,我很乐意接受。

标签: javascript node.js commonjs


【解决方案1】:

requireing 模块通常是您在程序开始时执行的操作。如果您不在程序开始时执行此操作,则结果无论如何都会被缓存。启动这样的程序:

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
    });
});

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

【讨论】:

    猜你喜欢
    • 2021-02-03
    • 2022-10-12
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2021-08-07
    • 2018-10-07
    相关资源
    最近更新 更多