如何修改NodeJS内置全局对象?

问题描述 投票:0回答:1

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

NodeJS二进制文件中的那些对象吗?那是否意味着我必须分叉整个NodeJS仓库才能实现这一目标?

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

node.js global
1个回答
0
投票

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


NodeJS二进制文件中的那些对象吗?

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

这是否意味着我必须分叉整个NodeJS存储库才能实现这一目标?

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

“原生感觉”?听起来您还没有真正购买到node.js模块体系结构。它与许多其他环境不同。随着时间的流逝,这很容易适应。 IMO,最好还是使用平台的流程和体系结构,而不是仅仅自定义一行node.js版本以节省启动代码中的一行输入。

而且,添加可以在任何地方使用的全局变量的整个概念表明,您还没有完全了解node.js中模块设计的设计,体系结构,代码重用和可测试性优势。如果有的话,您将不会尝试编写大量无法以您现在不期望的其他方式重用的代码。


也就是说,在Github上搜索node.js源代码时,我发现了此源文件node.js,在该文件中,很多东西都添加到了node.js全局对象中,例如setTimeout()clearTimeout()setImmediate()clearImmediate()等。因此,该源文件似乎是node.js设置全局对象的地方。如果您想在那儿添加自己的东西,那是要做的地方。

提供该代码的示例(您可以在上面的链接中找到完整的代码):

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);
}

此代码已内置到node.js可执行文件中,因此我知道直接对其进行修改(不对可执行文件本身进行修补)的唯一方法是修改文件,然后将平台的node.js重建为自定义建立。


更实际一点,您也可以在启动主脚本之前使用-r module command line argument告诉node.js运行require(module)。因此,您可以采用其他方法从始终将-r fullPathToYourModule参数传递给node.js的shell文件中启动node.js,这样它将始终运行将事物添加到全局对象的启动模块。

同样,您只需要在启动文件中保存一行输入即可。真的值得这么做吗?

© www.soinside.com 2019 - 2024. All rights reserved.