贝利信息

javascript如何实现模块化_ES6模块和CommonJS有什么区别

日期:2026-01-09 00:00 / 作者:紅蓮之龍
ES6模块是静态解析、编译时确定依赖,不可动态加载;CommonJS是运行时执行、支持条件引入;二者在浏览器/Node.js中行为不同,互操作需注意默认导出结构、文件后缀、路径写法及循环引用机制。

ES6模块(import/export)是静态解析的

编译时就确定依赖关系,不能放在if或函数里动态加载。浏览器和Node.js(v12+默认启用)都支持,但行为有差异:

CommonJS(require/module.exports)是运行时执行的

Node.js原生支持(.js文件默认走CommonJS),可以动态调用require,也支持条件加载:

默认导出和命名导出的互操作陷阱

ES6模块的export default在CommonJS里对应module.exports.default,但很多库(如Lodash)把默认导出挂到module.exports本身——这就导致:

Node.js里同时存在两种模块系统时的实际问题

一个项目里.js是CommonJS,.mjs是ES6,但它们不能直接互相import/require

跨模块边界传值时,尤其要注意对象是否被深拷贝、是否共享引用——ES6模块导出的是活绑定,CommonJS是浅拷贝后的值。