【问题标题】:How does Node.js load scripts into memory?Node.js 如何将脚本加载到内存中?
【发布时间】:2015-07-04 03:34:30
【问题描述】:

在浏览器中,DOM 被解析,脚本按照定义的顺序被加载和解析。

在 Node.js 中,脚本是如何加载到内存中的?

在初始化时遍历每个文件中的require 语句定义的整个脚本图,生成的对象和值使堆栈和堆水化以准备开始执行吗?

【问题讨论】:

  • 没有。在事情开始要求其他事情之前,它怎么可能在初始化时被遍历?想想吧。
  • require 是一个动态执行的函数,它不是静态分析的。 Read the source!
  • 参见 this detailed breakdown 了解如何加载模块
  • @Bergi 这不是很多更好的复制目标吗?
  • @BenjaminGruenbaum 也许吧。然而,即使答案是奇妙的,那是一个完全不同的问题。我不知道在这种情况下如何进行……随意使用你的锤子。

标签: javascript node.js


【解决方案1】:

同步。每当遇到require 时,它都会同步加载脚本并运行它——然后,当找到其他脚本时,它会同步加载它们。

IIRC 在 0.2 天内有一个异步版本,但它已经很久没有出现了。至于它的实际作用:

基本上,它的作用是fs.readFileSync

更具体地说 - 调用 require 调用 _load 依次首先是 checks the cache 然后是 creates the modulecalls the relevant extension。由于允许多个扩展名(例如.json),它以不同方式加载每个扩展名,在.js 情况下,它只是调用fs.readFileSync 然后compiles it(这涉及包装它,注入导出和运行它)。

【讨论】:

  • 在高层次上说是否正确,一旦检索到脚本,将其拉入缓存,由 JavaScript 运行时解析为抽象语法树;然后对其进行评估,从而导致运行时数据结构(堆栈和堆)的水合
  • @BenAston 是的,但描述性太强,说它已加载、解析、缓存和执行就足够了。
  • 我的描述是否暗示未发生的活动?
  • 不,它没有——它只是对引擎位(如解析、ast、编译等)和实际加载给予同等重视——前者也发生在常规的eval 调用中。如果您了解所有内容,您就可以开始了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 2015-12-24
  • 2011-09-07
相关资源
最近更新 更多