MST
星途 面试题库

面试题:Node.js 中 require 加载自定义模块的优化

假设你有一个包含多个自定义模块的大型 Node.js 项目,如何利用 require 方法进行模块加载的优化,以提升项目性能?请列举至少两种优化策略并说明实现方式。
22.8万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试
  1. 缓存模块加载结果
    • 实现方式: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,说明是同一个对象,来自缓存
    
  2. 减少模块层级嵌套
    • 实现方式:尽量避免过深的模块嵌套结构。例如,如果有一个模块 a.js 需要依赖 b.jsb.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);
    
  3. 动态加载模块
    • 实现方式:在需要的时候才加载模块,而不是在模块初始化时就全部加载。例如,有一个模块根据不同的运行时条件加载不同的模块:
    function loadModule() {
        if (process.env.NODE_ENV === 'development') {
            return require('./dev - utils');
        } else {
            return require('./prod - utils');
        }
    }
    const utils = loadModule();
    
    这样在开发环境和生产环境下可以按需加载不同的模块,避免不必要的模块加载开销。