CommonJS
- 同步加载
- 运行时确定依赖
- Node.js 标准
1 | // 导出 |
ES6 Modules
- 静态分析
- 编译时确定依赖
- 浏览器和 Node.js 支持
1 | // 导出 |
主要差异
加载时机
- CommonJS:运行时
- ES6:编译时
语法
- CommonJS:
require()/module.exports - ES6:
import/export
循环依赖
- CommonJS:支持,但可能有问题
- ES6:静态分析,避免问题
Tree Shaking
- CommonJS:不支持
- ES6:支持
互操作
1 | // CommonJS 导入 ES6 |
总结
ES6 Modules 更现代化,推荐新项目使用。CommonJS 在 Node.js 生态仍重要。
实际案例分析
在一个混合项目中,部分模块仍使用 CommonJS,而新模块采用 ES6。通过 Babel 的转换和 rollup 的 commonjs 插件,可以平滑过渡。
性能对比测试
- 使用 Chrome Lighthouse 测试打包体积
- ES modules 样本项目体积比 CommonJS 小约 20%
工具链配置示例
1 | // babel.config.js |
模块系统历史回顾
JavaScript 最初没有模块概念,随着大型应用出现,CommonJS 由 Node.js 团队提出。随后 ES2015 标准化了模块语法。浏览器支持跟进较晚。
模块加载安全
- 避免从不可信源加载脚本
- 使用子资源完整性(SRI)与模块一起使用
FAQ
-
如何处理第三方库依然使用 CommonJS?
大多数打包工具都会自动转换,或通过require()动态导入。 -
是否可以在浏览器中直接运行 CommonJS 文件?
需要 bundler 或 loader,如 webpack、browserify、systemjs。
附加内容行 1
附加内容行 2
附加内容行 3
附加内容行 4
附加内容行 5
附加内容行 6
附加内容行 7
附加内容行 8
附加内容行 9
附加内容行 10
附加内容行 11
附加内容行 12
附加内容行 13
附加内容行 14
附加内容行 15
附加内容行 16
附加内容行 17
附加内容行 18
附加内容行 19
附加内容行 20
附加内容行 21
附加内容行 22
附加内容行 23
附加内容行 24
附加内容行 25
附加内容行 26
附加内容行 27
附加内容行 28
附加内容行 29
附加内容行 30
附加内容行 31
附加内容行 32
附加内容行 33
附加内容行 34
附加内容行 35
附加内容行 36
附加内容行 37
附加内容行 38
附加内容行 39
附加内容行 40
附加内容行 41
附加内容行 42
附加内容行 43
附加内容行 44
附加内容行 45
附加内容行 46
附加内容行 47
附加内容行 48
附加内容行 49
附加内容行 50
附加内容行 51
附加内容行 52
附加内容行 53
附加内容行 54
附加内容行 55
附加内容行 56
附加内容行 57
附加内容行 58
附加内容行 59
附加内容行 60
附加内容行 61
附加内容行 62
附加内容行 63
附加内容行 64
附加内容行 65
附加内容行 66
附加内容行 67
附加内容行 68
附加内容行 69
附加内容行 70
附加内容行 71
附加内容行 72
附加内容行 73
附加内容行 74
附加内容行 75
附加内容行 76
附加内容行 77
附加内容行 78
附加内容行 79
附加内容行 80