我想添加一个重要的功能,使我可以在工作中使用它,而不必每次都使用require()。因此,我认为修改内置对象可以使这种情况发生,但是我无法找到那些对象的位置来进行修改。
NodeJS二进制文件中的那些对象吗?那是否意味着我必须分叉整个NodeJS仓库才能实现这一目标?
请,我不想使用与要求相同的原型编辑等。我需要有一种本土的感觉。
首先,我同意之前的评论,这听起来像是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,这样它将始终运行将事物添加到全局对象的启动模块。
同样,您只需要在启动文件中保存一行输入即可。真的值得这么做吗?