面试题答案
一键面试- 缓存模块加载结果
- 实现方式:Node.js 本身会对
require
加载的模块进行缓存。对于自定义模块,在第一次加载后,后续的require
调用如果是相同的模块路径,Node.js 会直接从缓存中返回模块导出的对象,而不会再次执行模块代码。例如,假设有一个utils.js
模块:
在其他模块中多次// utils.js const add = (a, b) => a + b; module.exports = { add };
require
该模块:const utils1 = require('./utils'); const utils2 = require('./utils'); console.log(utils1 === utils2); // 输出 true,说明是同一个对象,来自缓存
- 实现方式:Node.js 本身会对
- 减少模块层级嵌套
- 实现方式:尽量避免过深的模块嵌套结构。例如,如果有一个模块
a.js
需要依赖b.js
,b.js
又依赖c.js
,如果可能,让a.js
直接依赖c.js
而简化层级。假设原本的结构:
// c.js const cValue = 'c value'; module.exports = { cValue };
// b.js const c = require('./c'); const bValue = 'b value'; module.exports = { bValue, c };
优化后可以改为:// a.js const b = require('./b'); console.log(b.c.cValue);
// a.js const c = require('./c'); console.log(c.cValue);
- 实现方式:尽量避免过深的模块嵌套结构。例如,如果有一个模块
- 动态加载模块
- 实现方式:在需要的时候才加载模块,而不是在模块初始化时就全部加载。例如,有一个模块根据不同的运行时条件加载不同的模块:
这样在开发环境和生产环境下可以按需加载不同的模块,避免不必要的模块加载开销。function loadModule() { if (process.env.NODE_ENV === 'development') { return require('./dev - utils'); } else { return require('./prod - utils'); } } const utils = loadModule();