如果我使用内联要求,如下所示:
function something(...paths) {
return require('path').join(...paths);
}
something('etc', 'etc');
Run Code Online (Sandbox Code Playgroud)
引擎在每次调用中都需要吗?例子:
let i = 10;
while (--i)
something(i, 'etc');
Run Code Online (Sandbox Code Playgroud)
谢谢你。
系统将在require()
每次循环中调用,但加载require()
的模块会被缓存,并且模块加载代码仅在第一次加载模块时运行。因此,虽然调用有一点额外的开销require('path')
,但它只是在缓存中查找该模块名称并返回缓存的模块句柄。不需要每次调用时都加载、解析和运行模块require()
。
话虽如此,还是养成这样的习惯会更好:
const pathModule = require('path');
function something(...paths) {
return pathModule.join(...paths);
}
Run Code Online (Sandbox Code Playgroud)
您这样做的方式的另一个缺点是,第一次path
加载模块时,系统将使用同步文件 I/O 来加载它,这在多用户服务器中不是一个好主意。文件 I/O 只是第一次发生,但仍然不是一个很好的实践。最好在服务器初始化时取消同步 I/O。