JavaScript之无题之让人烦躁的模块化( 三 )


2、CMD规范与SeaJs由于RequireJs的一些问题,又出现了基于CMD规范的SeaJs,SeaJs和RequireJs有一个最大的不同就是RequireJs希望可以通吃 , 但是SeaJs则更专注于浏览器,哦对了,CMD的全称叫做:Common Module Definition , 即通用模块规范 。
SeaJs的简单用法如下:
// 所有模块都通过 define 来定义define(function(require, exports, module) {// 通过 require 引入依赖var a = require('xxx')var b = require('yyy')// 通过 exports 对外提供接口exports.doSomething = ...// 或者通过 module.exports 提供整个接口module.exports = ...})// a.jsdefine(function(require, exports, module){var name = 'morrain'var age = 18exports.name = nameexports.getAge = () => age})// b.jsdefine(function(require, exports, module){var name = 'lilei'var age = 15var a = require('a.js')console.log(a.name) // 'morrain'console.log(a.getAge()) //18exports.name = nameexports.getAge = () => age})上面的代码是从网上抄的,大概说明白了基本的使用方法 。我们可以看到 , SeaJs的导入和导出的方式,跟NodeJs好像~~而SeaJs从书写形式上,更像是CommonJs和AMD的结合 。当然,我只是说书写形式上 。
而AMD和CMD , RequireJs和SeaJs,都是由社区发起的,并没有语言层面的规范,包括CommonJs以及NodeJs,所以,这个时代还是一个百花争艳,没有统一的时代 , 不过在现在,这些都不重要了 。如果非要我说些什么,那就是,忘记这两个东西 , 去学下面的重点 。
四、大一统百花争艳的时代确实有些烦人,这个那个那个这个,又都不被官方认可 , 还好,官方终于还是出手了,ES6的出现,在语言层面上就提出了对于模块化的规范,也就是ES6 Module 。它太重要了,具体语法我就不多说了,文末的链接附上了阮一峰大神的《ES6入门指南》关于ES6 Module的地址 。
所以到了ES6的时候,你要学习的就是ES6 Module,NodeJs也在逐步实现对ES6 Module的支持 。最终,秦始皇会一统天下 , 这是必然的结果 。
这篇文章到这里就结束了,说实话,模块化的问题和历史由来已久 , 从萌芽到统一 , 至少十几年的过程,而市面上也已有大量的文章介绍彼此的区别和各自的特点,我写来写去,也不过是复制一遍,毫无意义 。
但是我又想学一下模块化 , 以及模块化的历史,额……,请原谅我的无知,所以才有了这篇文章 , 但是写着写着,发现我能表达出来的东西并不多,因为都是故事,都是历史,并且对于未来的开发好像也没什么实际的意义和价值 。
所以,在如此纠结的心态下有了这篇文章,原谅我无知又想逼逼的心情吧 。
最后的最后,如果你想学习模块化,在现阶段 , 只需要去深入学习ES6 Module,和学习一下NodeJs的CommonJs,以及了解一下各模块化的区别即可,因为现在是即将统一 , 还未完全统一的时候 。
参考资料:https://wiki.commonjs.org/wiki/CommonJS
https://github.com/seajs/seajs/issues/242
https://es6.ruanyifeng.com/#docs/module

推荐阅读