Node.js require 模块加载函数
require 是 Node.js 的全局函数,用于加载和导入模块。
基本用法
JavaScript
// 加载核心模块
const fs = require('fs');
const path = require('path');
const http = require('http');
// 加载第三方模块
const express = require('express');
const lodash = require('lodash');
// 加载本地模块
const utils = require('./utils');
const config = require('../config');
模块加载规则
核心模块
JavaScript
// 直接使用模块名
const fs = require('fs');
const crypto = require('crypto');
const events = require('events');
文件模块
JavaScript
// 相对路径
const mod = require('./module');
const parent = require('../parent');
// 绝对路径
const config = require('/home/user/config');
// 可省略扩展名
const utils = require('./utils'); // 自动尝试 .js, .json, .node
目录模块
JavaScript
// 加载目录下的 index.js
const routes = require('./routes');
// 等同于
const routes = require('./routes/index');
node_modules 查找
JavaScript
// 从当前目录向上查找 node_modules
const lodash = require('lodash');
// 查找顺序: ./node_modules -> ../node_modules -> ../../node_modules
require.resolve
JavaScript
// 解析模块的完整路径,不加载模块
const modulePath = require.resolve('lodash');
console.log(modulePath);
// /home/user/project/node_modules/lodash/lodash.js
const localPath = require.resolve('./utils');
console.log(localPath);
require.cache
JavaScript
// 查看模块缓存
console.log(require.cache);
// 删除缓存(重新加载模块)
delete require.cache[require.resolve('./config')];
const config = require('./config'); // 重新加载
模块缓存机制
JavaScript
// config.js
let count = 0;
module.exports = {
getCount: () => count,
increment: () => ++count
};
// app.js
const config1 = require('./config');
config1.increment(); // count = 1
const config2 = require('./config');
console.log(config2.getCount()); // 1(同一实例)
// require 返回缓存的模块实例
console.log(config1 === config2); // true
循环依赖
JavaScript
// a.js
const b = require('./b');
exports.name = 'a';
// b.js
const a = require('./b');
exports.name = 'b';
// Node.js 会返回 a.js 的未完成副本
Node.js 通过返回未完成副本处理循环依赖,应尽量避免循环引用。
条件加载
JavaScript
// 根据环境加载不同配置
const config = require(process.env.NODE_ENV === 'production'
? './config.prod'
: './config.dev');
要点总结
- require 加载核心模块、文件模块、第三方模块
- 相对路径以 ./ 或 ../ 开头,绝对路径以 / 开头
- require 返回缓存实例,重复 require 不会重新加载
- require.resolve 解析路径但不加载模块
- 避免循环依赖,会导致不可预期的行为
📝 发现内容有误?点击此处直接编辑