【问题标题】:How does a NativeModule function and are they cached?NativeModule 是如何发挥作用的,它们是否被缓存?
【发布时间】:2022-01-20 08:07:21
【问题描述】:
require('http')
console.log(require.cache.http) // undefined

我在require.cache 中找不到http 模块?我怎样才能检测到它是必需的?我发现 process.moduleLoadList 包含字符串 NativeModule http 但没有看到对缓存模块的任何引用它在哪里?

【问题讨论】:

    标签: node.js node-modules require built-in


    【解决方案1】:

    NativeModule 表示未缓存:已编译。是这样定义的,

    NativeModule:一个最小的模块系统,用于加载 lib/**/*.jsdeps/**/*.js 中的 JavaScript 核心模块。 所有核心模块都通过js2c.py生成的node_javascript.cc编译成node二进制文件,因此可以更快地加载它们而无需I/O成本。该类使得lib/internal/*、@987654331 @modules 和 internalBinding() 默认可用于核心模块,并让核心模块通过 require('internal/bootstrap/loaders') 要求自身,即使此文件不是以 CommonJS 样式编写的。

    强调“没有 I/O 成本”,因此不需要缓存。

    你可以在lib/internal/bootstrap/loaders.js找到这个系统。您可以找到mapping of native modules to source code here,但请记住它们不是从磁盘读取的。你可以找到js2c.py

    【讨论】:

    • 谢谢,所以我可以看到函数 compileForInternalLoader 返回同一个模块的单例。但是这里没有什么可以丢弃实例(如delete require.cache),因为NativeModule没有被导出,或者有什么办法吗?另外,我想知道我是否可以依赖process.moduleLoadList,因为它没有记录在案。有什么理由吗?它是不稳定的还是他们将来会改变这个?
    • 不,你不能那样做。即使你能做到,它也没有任何意义,因为模块永远不会从 javascript 源加载。在编译时,他们有一个构建脚本,可以将 javascript 源代码转换为一个大字符串,然后烘焙到二进制文件中。当您说require('http') 时,唯一发生的事情是对二进制文件中已经存在的字符串进行解析和评估。
    猜你喜欢
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 2023-02-15
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多