Node.js中的原生模块是什么?

18

我刚开始阅读Node.js源代码,发现经常使用一个名为primordials的对象。但是我找不到它的定义所在。

例如:/node/lib/events.js

const {
  Array,
  Boolean,
  Error,
  MathMin,
  NumberIsNaN,
  ObjectCreate,
  ObjectDefineProperty,
  ObjectGetPrototypeOf,
  ObjectSetPrototypeOf,
  ObjectKeys,
  Promise,
  PromiseReject,
  PromiseResolve,
  ReflectApply,
  ReflectOwnKeys,
  Symbol,
  SymbolFor,
  SymbolAsyncIterator
} = primordials;

有人能解释一下什么是原生对象(primordials)以及它们在哪里被声明吗?


1
在谷歌搜索“primordials node”后,我只能看到你这里的某些变化似乎会在Gulp和Node.JS不匹配时引起问题。当试图理解primordials应该是什么时,这并不真正有帮助。所有的错误报告都详细说明了如何修复它(删除Gulp,删除使用Gulp的依赖项,获取兼容版本等),但没有一个解释为什么要使用它。 - VLAZ
1
花了更多的时间搜索,找到了这个关于Node.js引导程序的视频(https://youtu.be/bwiLlcGvFEk?t=280),其中她说原始元素是V8上下文的一部分,它仅仅是JavaScript内置对象(数组,对象,globalThis,布尔等)。但如果有其他相关信息,欢迎分享 :) - Ian Guimarães
1个回答

21

简短的研究显示了 这个 GitHub 问题,导向了 这个 Node 源文件,其中有一些关于primordials目的的启示性注释:

// This file subclasses and stores the JS builtins that come from the VM
// so that Node.js's builtin modules do not need to later look these up from
// the global proxy, which can be mutated by users.
因此,如问题中所述,primordials对象旨在确保Node.js内置模块可以访问真正未经篡改的全局变量,而不是可能已被用户修改过的变量。

哇,非常感谢!这就是我在寻找的东西。 - Ian Guimarães
2
谢谢你的回答!你知道如何在没有这个的情况下访问全局变量吗?我得到了一个 primordials is not defined 的错误,我认为我需要用 globals 替换 primordials。谢谢 - imaginate
1
@imaginate 你可能会对这个讨论感兴趣:https://github.com/sinonjs/fake-timers/issues/344。在 Node 15.7 中添加了暴露内部支持。例如:node --expose-internals -r internal/test/binding -p -e 'Object.getOwnPropertyDescriptor(global.primordials, "Date")' - oligofren
我曾经遇到这样的情况,需要安装旧版node才能使某些东西运行。因此,请检查您安装的版本以及package.json中所请求的node版本。在我之前也遇到过“原始值未定义”的消息。您可以考虑使用https://github.com/coreybutler/nvm-windows等工具来安装不同版本的node。 - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接