-
Notifications
You must be signed in to change notification settings - Fork 7
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
JavaScript模块化发展的演进历史 CommonJS、AMD、CMD、ES6模块的演进历史 #122
Comments
手写commonjs的简单实现
test.js的代码
|
How the module system, CommonJS & require works https://blog.risingstack.com/node-js-at-scale-module-system-commonjs-require/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
1. 没有模块化的时候
我们不划分模块,一个个js的写,然后放入html。
缺点:
2. 命名空间的阶段
简单的封装。每个模块的代码放到某个命名空间之下
优点:减少了global上的变量的数量
缺点: 本质上是对象,从外部谁都可以改变其值,并不安全。
3. 立即执行函数表达式(IIFE)
利用立即执行函数表达式创建一个闭包。对外只暴露特定的值和对象。
此种方式不仅仅可以通过创建一个隔绝的作用域来实现一个模块。还能通过函数传参来实现模块的依赖。
这就是模块模式,也是现代模块实现的基石
优点:封装良好,实现了初级真正意义上的模块化
缺点:只有封装,但是我们不仅仅是需要封装,我们还需要加载。我们还需要能够想加载什么就能加载什么模块。 并且这种封装只能算是初级意义上的封装。可读性并不是太强。
4. CommonJS
nodejs 是CommonJS规范的主要实践者,他有几个环境变量, module,exports,require,global。实际使用时,用module.exports定义当前模块对外输出的接口(不推荐直接用exports),用require加载模块。
CommonJS 用同步的方式加载模块。在服务端,模块文件都存在本地磁盘,读取非常快。所以这样做不会有什么问题。但是在浏览器端。由于网络传输的时间过长。这种同步的方式不大适合于客户端。更合理的方案应该是使用异步的方式加载。
5. AMD 和CMD
AMD规范采用异步方式加载模块,模块的加载不影响它后边的语句的运行。依赖某些模块的语句。都会放到这些模块加载完成之后的回调函数里去执行。由于require.js是AMD规范的主要实践者。我们讲述一下require.js的使用方法,之后我们再试着写写AMD规范的实现。
require.js的使用: 用require.config()制定引用路径,用define()定义模块,用require()加载模块。
定义模块和引用模块
AMD实现了浏览器端的模块化的管理,相比较与CommonJS的同步加载,AMD使用了异步加载。解决了同步加载因为网络环境而无法被接受的问题。
but问题来了。AMD存在的一点问题是什么呢。就是所依赖的模块会全部先加载完并且执行完再执行回调。不管这个模块是否在接下来的回调中是否会被使用。
CMD在AMD的基础上解决了这个问题。玉伯在这篇文章里在现了当年十字路子的争辩过程。CMD比AMD更近一步,推崇依赖就近,延迟执行。CMD规范也是伴随着sea.js的推广过程中而产生。
用一句话总结一下AMD和CMD的差异吧。AMD推崇依赖前置,所有的依赖提前执行。CMD推崇依赖就近。依赖拿到之后并不会立即执行。而是在需要执行的地方才开始执行(延迟执行)
6. ES6 module
ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。
ES6 模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 模块,都只能在运行时确定这些东西。比如,CommonJS 模块就是对象,输入时必须查找对象属性。
对比CommonJS和ES6 module的区别
截图如下:
The text was updated successfully, but these errors were encountered: