在Node.js中要求重复使用同一文件会有什么后果?

9

如果我两次要求同一个文件,会遇到任何问题吗?

require('myclass.js');
require('myclass.js');
3个回答

16

没有任何影响。模块会被缓存,所以第二次调用只是一个空操作。


除非模块在 require 时执行某些操作,但这可能是不好的实践方式。 - knownasilya
@Knownasilya 所需模块中的代码仅在第一次调用“require”时运行,或者您是在引用其他内容? - JohnnyHK
即使你的模块中有IIFE,它也会缓存结果并在后续调用时返回。 - knownasilya
1
@Knownasilya 对的,第一次调用创建的模块的 module.exports 对象被缓存并在第二次调用中返回。在这方面,IIFE 没有什么特别之处。 - JohnnyHK

3
我发现一个小问题,因为要求两次是无效操作:要求文件、改变该文件返回的对象,并再次要求该文件将不会撤销这些更改。
例如:
let path;
path = require('path');
console.log(path.asdf);

path.asdf = 'foo';
console.log(path.asdf);

path = require('path');
console.log(path.asdf);

最初的回答。这将产生以下输出:
undefined
foo
foo

0
不,你不应该遇到任何问题。Node使用的模块系统不会有全局问题,如果这是你的问题的话。真正的问题是...为什么你想要两次require呢?

1
我正在动态地包含文件,因此有可能需要两次使用同一个文件。 - Kirk Ouimet
你是否正在尝试根据函数的结果动态加载模块?如果是的话,以下链接可能会有所帮助:https://dev59.com/6mgv5IYBdhLWcg3wBMEK - user3467440
2
我想要两次引入同一个文件,因为这个文件本身包含了一个我在测试中模拟的函数。但是,我有不同的测试用例,它们以不同的方式模拟该函数,而且由于该文件只能被引入一次,所以它无法正常工作。 - David Torres
@DavidTorres,你可以使用jest.isolateModules来实现,参见https://dev59.com/A1cO5IYBdhLWcg3wkin2 - ChelowekKot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接