JavaScript模块化是解决全局污染、依赖混乱和构建不可控的核心机制;ES6模块静态且浏览器原生支持,CommonJS动态且Node.js默认使用,二者不兼容,需工具链转换或适配层实现互操作。
JavaScript模块化就是把代码拆成可复用、可独立加载的单元
它不是语法糖,而是解决全局污染、依赖混乱和构建不可控的核心机制。
浏览器
原生支持
/
之前,社区靠打包工具(如 Webpack)和运行时模拟(如
)来实现模块隔离。现在 ES6 模块是标准,但 CommonJS 仍在 Node.
js
默认环境中广泛存在——二者不能混用,强行混用会直接报错,比如
或
。
ES6模块是静态的,CommonJS是动态的
这是根本差异,直接影响代码能否被 Tree-shaking、是否支持循环引用、以及能否在顶层
作用域
外使用导入导出。
和
只能出现在模块顶层,不能写在
或函数里;
可以随时调用,甚至拼接路径字符串
ES6 模块在编译期就确定依赖关系,所以打包工具能安全地移除未使用的导出(Tree-shaking);CommonJS 的
是运行时执行,无法静态分析
ES6 模块默认是只读引用(
导出的是绑定,不是值拷贝),而 CommonJS 导出的是对象属性的浅拷贝(
)
ES6 支持命名导出(
)、默认导出(
)、重命名导出(
);CommonJS 只有单一的
对象
Node.js 中
和
不能共存于同一文件
哪怕只是写了一句
,整个文件就被视为 ES 模块;此时再用
就会抛出
。反过来也一样:含
的文件若没显式声明为 ES 模块,就不能用
。
要让 Node.js 正确识别模块类型,必须满足以下任一条件:
立即学习
“
Java免费学习笔记(深入)
”;
Comet AI 浏览器
下载 Comet AI 浏览器,体验由 Perplexity AI 驱动的革命性上网方式。内置 AI 助手可实时总结网页、跨标签页对比信息、自动执行任务。告别繁琐操作,让 AI 成为你的浏览副驾,大幅提升研究与工作效率。支持 Windows、macOS、Android 和 iOS。
下载
文件扩展名为
所在目录的
中设置了
启动时加参数
(仅限字符串输入)
注意:
扩展名强制为 CommonJS,即使
设了
也无效。
跨环境互操作必须靠构建工具或适配层
浏览器不支持
,Node.js 默认不支持顶层
(除非启用模块模式)。想在同一个项目中同时用两种风格,不能靠手动改写,得靠工具链转换:
Webpack/Vite/Rollup 会把
和
统一处理成闭包内联函数,自动做兼容
如果要用 ES 模块语法写 Node.js 脚本,又依赖一个只提供 CommonJS 的包(比如早期版本的
),就得用
手动桥接:
这种写法只在 Node.js 环境有效,且必须确保该文件本身是 ES 模块(
或
)。漏掉任何一环,就会卡在解析阶段。
最常被忽略的一点:ES6 模块的
在 CommonJS 里对应的是
,而不是
本身——很多老库导出的是
,ES6 中写
没问题,但写
就会是
。
importexportrequireReferenceError: require is not definedCannot use import statement outside a moduleimportexportifrequire()require()export const x = 1module.exports.x = 1export function foo(){}export default function(){}export { foo as bar }module.exportsimportrequireimport fs from 'fs'require('path')ReferenceError: require is not definedrequireimport.mjspackage.json"type": "module"node --input-type=module.cjspackage.json"type": "module"require()importimportrequirelodashcreateRequireimport { createRequire } from 'module';
const require = createRequire(import.meta.url);
const lodash = require('lodash');.mjs"type": "module"export defaultmodule.exports.defaultmodule.exportsmodule.exports = function(){}import xxx from 'pkg'import { xxx } from 'pkg'undefined