javascript 有没有办法在 nodejs 中只“要求”一个 JS 文件一次?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/8958097/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Is there a way to "require" a JS file only once in nodejs?
提问by atlantis
I have just started working with nodejs. I wonder if there is a way to "require" a file only once in an app. I am using a class framework for getting classic OOPS in my JS project. Each "class" is contained in its own JS file. I want to "require" the class framework in each file so that they can function independently but want the framework's init code to be executed only once.
我刚刚开始使用 nodejs。我想知道是否有办法在应用程序中只“要求”一个文件一次。我正在使用类框架在我的 JS 项目中获取经典的 OOPS。每个“类”都包含在它自己的 JS 文件中。我想在每个文件中“要求”类框架,以便它们可以独立运行,但希望框架的初始化代码只执行一次。
I can use a flag to implement this myself but a built-in way would be nice. Search for "require once" leads me to all PHP related questions.
我可以使用一个标志来自己实现这一点,但内置的方式会很好。搜索“需要一次”会引导我找到所有与 PHP 相关的问题。
回答by timoxley
require
is always "require once". After you call require
the first time, require
uses a cache and will always return the same object.
require
总是“需要一次”。require
第一次调用后,require
使用缓存并将始终返回相同的对象。
Any executable code floating around in the module will only be run once.
模块中浮动的任何可执行代码只会运行一次。
On the other hand, if you do want it to run initialisation code multiple times, simply throw that code into an exported method.
另一方面,如果您确实希望它多次运行初始化代码,只需将该代码放入导出的方法中即可。
edit: Read the 'Caching' section of http://nodejs.org/docs/latest/api/modules.html#modules
编辑:阅读http://nodejs.org/docs/latest/api/modules.html#modules的“缓存”部分
回答by Larry Lawless
If you really want the top level code in your module (code that is not contained within methods or functions in your module) to execute more than once you can delete it's module object that is cached on the require.cache object like this:
如果您真的希望模块中的顶级代码(不包含在模块中的方法或函数中的代码)执行多次,您可以删除它的模块对象,该对象缓存在 require.cache 对象上,如下所示:
delete require.cache[require.resolve('./mymodule.js')];
Do this before you require the module for the second time.
在您第二次需要该模块之前执行此操作。
Most of the time though you probably only want the module's top level code to run once and any other time you require the module you only want to access what that module exports.
大多数时候,虽然您可能只希望模块的顶级代码运行一次,但在任何其他时候,您只需要访问该模块导出的模块。
var myMod = require("./mymodule.js"); //the first time you require the
//mymodule.js module the top level code gets
//run and you get the module value returned.
var myMod = require("./mymodule.js"); //the second time you require the mymodule.js
//module you will only get the module value
//returned. Obviously the second time you
//require the module it will be in another
//file than the first one you did it in.