-
Notifications
You must be signed in to change notification settings - Fork 0
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
CommonJS,AMD 和 ES6 模块化的差异 #17
Comments
AMD由于 NodeJs 主要用于服务端,模块文件一般都已经存在于本地硬盘,所以加载起来比较快,不用考虑异步加载的方式,所以 CommonJS 规范比较适用
引用模块的时候,我们将模块名放在 [] 中作为 require 的第一参数,如果 我们定义的模块本身也依赖其他模块,那就需要将它们放在 [] 作为 define 的第一参数,示例:
|
ES6 moduleES6 在语言层面实现了模块化标准(但目前浏览器不能直接识别),目的是成为浏览器和服务器通用的模块解决方案。
ES6 module 只会加载需要的属性和方法
结论:
|
上述三者是我们听得最多的模块化方式,此外还有 CMD,UMD 这些,比较小众的,本次就不单独拿出来说了
模块化,相信任何人多多少少都有接触过,项目到了一定程度,都需要将其拆分成不同的模块,用以解决命名冲突,文件依赖相关问题,因而就催生了上述多种的模块化标准,在 ES6 之前,JavaScript 一直都没有一个官方的模块化标准,而社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种,前者用于服务器,后者用于浏览器。直到 ES6 的推出,终于在语言层面上实现了实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。
ES6 模块化与 CommonJS 和 AMD 最大的不同就是
其中 nodeJs 采用的就是 CommonJs 规范
CommonJS
nodeJs 是 CommonJs 规范的主要实践者,它有4个重要的环境变量为模块化实现提供支持: module, exports, require, global。
实际使用时,推荐使用 module.exports 来输出模块接口,(阮一峰老师规范教程也是不推荐直接使用 exports)
CommonJS 模块输出的是值的拷贝,也就是说,一旦输出一个值,模块内部的变化就影响不到这个值。请看下面这个模块文件lib.js的例子。
上面代码输出内部变量counter和改写这个变量的内部方法incCounter。然后,在main.js里面加载这个模块。
上面代码说明,lib.js模块加载以后,它的内部变化就影响不到输出的mod.counter了。这是因为mod.counter是一个原始类型的值,会被缓存。除非写成一个函数,才能得到内部变动后的值。
上面代码中,输出的counter属性实际上是一个取值器函数。现在再执行main.js,就可以正确读取内部变量counter的变动了。
The text was updated successfully, but these errors were encountered: