使用内联要求

Joã*_*vin 3 require node.js

如果我使用内联要求,如下所示:

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)

谢谢你。

jfr*_*d00 6

系统将在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。