Node.js 如何修改NodeJS内置的全局对象?

Node.js 如何修改NodeJS内置的全局对象?,node.js,global,Node.js,Global,我想添加一个重要的功能,我可以在工作中使用它,而不必每次都使用require()。因此,我认为修改内置对象可以实现这一点,但我无法找到这些对象的位置来进行修改 这些对象是二进制的吗?这是否意味着我必须为实现这一目标付出全部代价 请,我不想使用原型编辑等相同的要求。我需要有本土的感觉。首先,我同意之前的评论,即这听起来像是一个XY问题,如果你描述你真正想要解决的问题,我们可以更好地帮助你。可移植的node.js程序可以在任何地方工作,也可以与node.js的任何未来版本一起工作,它不依赖于某种自定

我想添加一个重要的功能,我可以在工作中使用它,而不必每次都使用require()。因此,我认为修改内置对象可以实现这一点,但我无法找到这些对象的位置来进行修改

这些对象是二进制的吗?这是否意味着我必须为实现这一目标付出全部代价


请,我不想使用原型编辑等相同的要求。我需要有本土的感觉。

首先,我同意之前的评论,即这听起来像是一个XY问题,如果你描述你真正想要解决的问题,我们可以更好地帮助你。可移植的node.js程序可以在任何地方工作,也可以与node.js的任何未来版本一起工作,它不依赖于某种自定义配置的环境来运行。它们使用node.js的内置功能,并且需要/导入想要添加到环境中的外部内容


这些对象是二进制的吗

是的,它们在可执行文件中

这是否意味着我必须为实现这一目标付出全部代价

请,我不想使用原型编辑等相同的要求。我需要有本土的感觉

“本土感觉”?这听起来好像您还没有真正了解node.js模块体系结构。它与许多其他环境不同。随着时间的推移,这很容易习惯。在我看来,遵循平台的流程和体系结构确实比定制node.js版本更好,因为只需在启动代码中保存一行输入

而且,添加大量可以在任何地方使用的global的整个概念表明,您还没有完全理解node.js中模块设计的设计、架构、代码重用和可测试性优势。如果有,您就不会试图编写大量无法以其他方式重用的代码,而这些方式是您现在无法预料的


也就是说,在Github上搜索node.js源代码时,我找到了这个源文件,其中有很多东西被添加到node.js全局对象中,比如
setTimeout()
clearTimeout()
setImmediate()
cleartimmediate()
等等。因此,源文件似乎就是node.js设置全局对象的地方。如果你想在那里添加你自己的东西,那是一个可以完成的地方

要提供该代码的示例(完整代码请参见上面的链接):

这段代码内置于node.js可执行文件中,因此我所知道的直接修改它的唯一方法(无需对可执行文件本身进行黑客补丁)是修改该文件,然后将您平台的node.js重建为自定义版本


更实用的是,您还可以使用
-r模块
在启动主脚本之前告诉node.js运行
require(module)
。因此,您可以使用另一种方式从shell文件启动node.js,该shell文件始终将
-r fullPathToYourModule
参数传递给node.js,以便它始终运行向全局对象添加内容的启动模块


同样,您这样做只是为了在启动文件中保存一行键入内容。这样做真的值得吗?

首先,我同意前面的评论,即这听起来像是一个XY问题,如果您描述您真正想要解决的问题,我们可以更好地帮助您。可移植的node.js程序可以在任何地方工作,也可以与node.js的任何未来版本一起工作,它不依赖于某种自定义配置的环境来运行。它们使用node.js的内置功能,并且需要/导入想要添加到环境中的外部内容


这些对象是二进制的吗

是的,它们在可执行文件中

这是否意味着我必须为实现这一目标付出全部代价

请,我不想使用原型编辑等相同的要求。我需要有本土的感觉

“本土感觉”?这听起来好像您还没有真正了解node.js模块体系结构。它与许多其他环境不同。随着时间的推移,这很容易习惯。在我看来,遵循平台的流程和体系结构确实比定制node.js版本更好,因为只需在启动代码中保存一行输入

而且,添加大量可以在任何地方使用的global的整个概念表明,您还没有完全理解node.js中模块设计的设计、架构、代码重用和可测试性优势。如果有,您就不会试图编写大量无法以其他方式重用的代码,而这些方式是您现在无法预料的


也就是说,在Github上搜索node.js源代码时,我找到了这个源文件,其中有很多东西被添加到node.js全局对象中,比如
setTimeout()
clearTimeout()
setImmediate()
cleartimmediate()
等等。因此,源文件似乎就是node.js设置全局对象的地方。如果你想在那里添加你自己的东西,那是一个可以完成的地方

要提供该代码的示例(完整代码请参见上面的链接):

这段代码内置于node.js可执行文件中,因此我所知道的直接修改它的唯一方法(无需对可执行文件本身进行黑客补丁)是修改该文件,然后将您平台的node.js重建为自定义版本


更实用的是,您还可以使用
-r模块
在启动主脚本之前告诉node.js运行
require(module)
。因此,您可以使用另一种方式从始终传递
if (!config.noBrowserGlobals) {
  // Override global console from the one provided by the VM
  // to the one implemented by Node.js
  // https://console.spec.whatwg.org/#console-namespace
  exposeNamespace(global, 'console', createGlobalConsole(global.console));

  const { URL, URLSearchParams } = require('internal/url');
  // https://url.spec.whatwg.org/#url
  exposeInterface(global, 'URL', URL);
  // https://url.spec.whatwg.org/#urlsearchparams
  exposeInterface(global, 'URLSearchParams', URLSearchParams);

  const {
    TextEncoder, TextDecoder
  } = require('internal/encoding');
  // https://encoding.spec.whatwg.org/#textencoder
  exposeInterface(global, 'TextEncoder', TextEncoder);
  // https://encoding.spec.whatwg.org/#textdecoder
  exposeInterface(global, 'TextDecoder', TextDecoder);

  // https://html.spec.whatwg.org/multipage/webappapis.html#windoworworkerglobalscope
  const timers = require('timers');
  defineOperation(global, 'clearInterval', timers.clearInterval);
  defineOperation(global, 'clearTimeout', timers.clearTimeout);
  defineOperation(global, 'setInterval', timers.setInterval);
  defineOperation(global, 'setTimeout', timers.setTimeout);

  defineOperation(global, 'queueMicrotask', queueMicrotask);

  // Non-standard extensions:
  defineOperation(global, 'clearImmediate', timers.clearImmediate);
  defineOperation(global, 'setImmediate', timers.setImmediate);
}