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