什么是模块化?
随着代码复杂程度的提高, 项目也变得越来越难维护, 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