多文件重复使用require引入模块是否会增加运行时开销?
Node.js模块多次require的性能问题&你的加载代码优化建议
嘿,先给你吃个定心丸:多次在不同文件里var bcrypt = require('bcrypt')完全不会比只在一个文件里引入更慢!
为什么不会变慢?Node.js的模块缓存机制
Node.js有个内置的模块缓存系统:当你第一次require('bcrypt')时,Node会去读取模块文件、执行里面的代码,然后把模块导出的结果存在require.cache这个对象里。之后不管你在多少个其他文件里再require('bcrypt'),Node都会直接从缓存里取已经处理好的结果,不会重复读取文件、重复执行模块的初始化代码。所以性能上和只在一个文件引入是一模一样的,完全不用担心额外的开销。
对你的index.js模块加载代码的小优化建议
看了你贴的自动加载模块的代码片段,这里给你补充几个实用的细节,避免踩小坑:
- 记得排除
index.js本身,不然会不小心把自己也加载进去,可能引发循环引用或者不必要的操作 - 过滤掉非
.js文件,比如目录里的.gitignore、.md文档之类的,只加载真正的模块文件 - 可以用模块文件名(去掉扩展名)作为
modules对象的键,方便后续调用
修改后的完整代码示例:
const fs = require('fs'); const path = require('path'); const modules = {}; const files = fs.readdirSync(__dirname); files.forEach(file => { // 跳过index.js本身 if (file === 'index.js') return; // 只处理.js后缀的文件 const fileExt = path.extname(file); if (fileExt !== '.js') return; // 获取不带扩展名的模块名 const moduleName = path.basename(file, fileExt); // 拼接完整路径加载模块 modules[moduleName] = require(path.join(__dirname, file)); }); // 导出所有加载好的模块 module.exports = modules;
额外提醒
拆分代码到不同文件是非常好的实践,能大幅提升代码的可维护性,而Node.js的缓存机制完全不会让这种做法产生性能损耗。哪怕你的十几个模块都require了bcrypt,也只会在第一次加载时执行一次bcrypt的初始化逻辑,之后全是直接取缓存,放心用就好~
内容的提问来源于stack exchange,提问作者A. L
相关产品推荐
相关产品推荐

