导航


HTML

CSS

JavaScript

浏览器 & 网络

版本管理

框架

构建工具

TypeScript

性能优化

算法

UI、组件库

Node

业务技能

针对性攻坚

AI

软实力


一、Node.js 的模块系统本质是什么?

一句话:

每个文件就是一个模块,模块有独立作用域,通过 require / import 建立依赖关系。


Node 里主要有两套:

类型 关键字
CommonJS require / module.exports
ES Module import / export

今天重点说 CommonJS



二、一个模块在 require 时发生了什么?

这是重头戏。

假设:

const a = require('./a');

Node 做了几件事:


① 解析路径

找到真实文件。


② 读取文件内容


③ 包装成一个函数

Node 不会直接执行文件。

而是变成:

(function (exports, require, module, __filename, __dirname) {
  // 你的代码
});

这就是为什么:


④ 执行这个函数


⑤ 把 module.exports 放进缓存

require.cache

⑥ 下次再 require

直接从缓存拿。

不会再执行一次。


三、这会带来什么重要特性?


✅ 模块只会执行一次

// a.js
console.log('run');
module.exports = {};

多次 require:

只打印一次

✅ 模块之间共享同一个实例(单例)

导出的对象:

是同一个引用。


// a.js
module.exports = { count: 0 };

多个模块改:

👉 改的是同一个对象。


四、这就引出了:模块相互影响


举个例子

a.js

exports.count = 0;

b.js

const a = require('./a');
a.count++;

c.js

const a = require('./a');
console.log(a.count);

输出:

1

为什么?

因为:

它们拿到的是同一份缓存引用

CommonJS 导出的是值的引用,而不是拷贝。


五、循环依赖


a.js