【问题标题】:How does requiring a module affect performance in Node.js?需要一个模块如何影响 Node.js 中的性能?
【发布时间】:2016-04-29 13:04:51
【问题描述】:

我最近一直在阅读一些关于 Node.js 的文档,试图让我开始从事一些个人工作。在这个过程中,一个念头不断地冒出来,但我并没有得到一个满意的答案。

到目前为止,在我看到的每一段代码中,都有相当多的 require()。我理解它的主要功能是包含模块。但似乎人们也用它来在他们的主文件中包含其他 Javascript 文件。 据我所知,在 Javascript 中没有合适的方法来做到这一点(如此处所述:How do I include a JavaScript file in another JavaScript file?)。

这是我的担忧;根据功能分隔文件显然有利于提高可读性。但是,由于必须通过打开 Javascript 文件等来获取信息,因此 require() 是否会大大减慢程序的速度?如果是这样,在 Web 应用程序中,这种差异是否足以令人担忧?

在提交版本之前编写一个自动化组装过程的程序以获取单个文件(或至少一个更单一的文件)不是更谨慎吗?

【问题讨论】:

  • 是的,主要是开发版和发布版的区别。您可以在开发时保持代码干净整洁,当您准备好发布时,将其打包并在完成后将缩小版本发送到测试/生产服务器;)顺便说一句,您链接到的问题来自 2009,js从那时起,技术已经发生了很大变化,现在有了 commonjs、webpack、gulp、grunt……你可以为你的 javascript 项目拥有一个干净整洁的代码库
  • afaik 所需模块由节点缓存,因此我认为不会因多次require 调用而导致性能大幅下降
  • @VsevolodGoloviznin 是的,模块被缓存:fredkschott.com/post/2014/06/require-and-the-module-system
  • FWIW 节点中的模块缓存不仅仅是缓存文件。所有模块都是单例的。因此它们只编译和执行一次。这很好,因为如果你在 node.js 中需要一个单例,你不需要写任何东西。 module.exports 对象是一个单例。

标签: javascript node.js


【解决方案1】:

在服务器上,相对于服务器正在执行的其他所有操作(例如解释和执行所有这些 javascript!),此处的任何性能影响都将是无关紧要的。当然,如果您遇到性能问题并对这种说法持怀疑态度,那么进行衡量绝不是一个坏主意。

另一方面,如果我们谈论将通过网络发送到浏览器的 javascript,那就另当别论了……有大量的工具用于捆绑和缩小代码,以便浏览器可以下载/执行它更快。也就是说,HTTP 2 稍微改变了这一点 - 使用这个新协议,许多文件通常可以比大包更快地并行下载。

【讨论】:

  • 实际上,当 node.js 遇到未缓存模块的 require() 行时,文件会在同一个线程中加载,服务器的其余部分将等待。如果文件来自慢速资源(例如 NFS),则影响并非无关紧要。这就是为什么以在初始化期间调用所有需求的方式构造代码是好的原因。
猜你喜欢
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 2014-05-30
  • 2012-08-02
  • 2015-10-19
  • 2018-12-01
相关资源
最近更新 更多