【发布时间】:2017-09-05 01:08:18
【问题描述】:
如果我使用内联 require,像这样:
function something(...paths) {
return require('path').join(...paths);
}
something('etc', 'etc');
引擎在每次调用中都需要吗?示例:
let i = 10;
while (--i)
something(i, 'etc');
谢谢。
【问题讨论】:
如果我使用内联 require,像这样:
function something(...paths) {
return require('path').join(...paths);
}
something('etc', 'etc');
引擎在每次调用中都需要吗?示例:
let i = 10;
while (--i)
something(i, 'etc');
谢谢。
【问题讨论】:
系统将在每次循环中调用require(),但使用require() 加载的模块会被缓存,并且模块加载代码仅在模块第一次加载时运行。因此,虽然调用require('path') 有一点额外开销,但它只是在缓存中查找该模块名称并返回缓存的模块句柄。无需每次调用require()时加载、解析和运行模块。
也就是说,还是养成这样的习惯会更好:
const pathModule = require('path');
function something(...paths) {
return pathModule.join(...paths);
}
您这样做的另一个缺点是,第一次加载 path 模块时,系统将使用同步文件 I/O 来加载它,这在多用户中不是一个好主意服务器。文件 I/O 只是第一次发生,但仍然不是一个好习惯。最好在服务器初始化时消除同步 I/O。
【讨论】: