什么是模块化?
随着代码复杂程度的提高, 项目也变得越来越难维护, JavaScript模块化 也因此油然而生, 本文主要介绍 JavaScript模块化 的一些发展历程。
传统的开发
这应该是大家最熟悉的一种加载方式, 但是缺点也比较明显
- 所有的模块都处于全局作用域下, 容易造成命名冲突
- 依赖关系不明显, 比如
main.js中有使用jquery, 那么jquery就一定要先加载, 但是从引入方式中我们无法直观的察觉依赖关系, 不利于维护
1 | <script src="jquery.js"></script> |
CommonJs
一个文件就是一个模块, 其内部定义的变量, 方法都处于该模块内, 不会对外暴露.
主要语法:
- 使用
require来加载模块 - 使用
exports或者module.exports暴露模块中的内容
demo
- 新建
a.js, 导出name和sayHello
1 | // a.js |
- 在
b.js中引入a并调用
1 | // b.js |
由于
CommonJs是同步加载的模块的, 在服务端(node), 文件都在硬盘上, 所以同步加载也 无所谓, 但是在 浏览器端, 同步加载就体验不好了. 所以CommonJs主要使用于node环境下.
AMD
AMD全称为Asynchromous Module Definition(异步模块定义), 实现了异步加载模块.require.js实现了AMD规范
主要语法:
1 | require([module], callback) // 导入 |
demo
- 新建
a.js, 输入以下内容
1 | define(function() { |
- 在
test.html中调用a模块
1 |
|
能够异步加载模块, 适合在浏览器中运行, 但是不能够按需加载, 必须提前加载模块
CMD
CMD规范是阿里的玉伯提出,sea.js实现。 实现了按需加载
与 AMD 的区别:
- 对于依赖的模块
AMD提前执行,而CMD是延迟执行 CMD推崇依赖就近,AMD推崇依赖前置
1 | // AMD |
ES6
ES6模块化方案是最规范的方案, 未来也是主流, 对于我们来说也是经常使用与熟悉的. 不过现在的浏览器还不兼容, 使用需要babel转码
- 使用
export导出模块 - 使用
import导入模块
1 | import Vue from 'vue' |
参考
http://www.hangge.com/blog/cache/detail_1686.html
https://www.imooc.com/article/20057