今天打开项目群,老大问我们:谁的项目现在在用CommonJS,由于我前段时间接手的项目用到了require来引入新的模块,所以立马说我用到了。之后发现不对经,我好像用的RequireJS模块。越想越觉得模糊,索性在网上找了些文档看了下,下面是我个人的感受。
CommonJS:就是用来规范JS的使用的,主要为了JS在后端的表现制定的,不太适合前端。它定了三个模块:模块引用的require,模块定义的exports和模块标识module。
AMD:是一种异步加载模块的方式,主要为前端JS的表现制定规范。只有一个模块define(id?,dependencies?,factory);
CMD:玉伯写了seaJS,就是遵从他提出的CMD规范。
关于RequireJS和SeaJS的区别和联系。
联系:两者都是js模块的加载器,倡导一种模块化开发的理念。
区别;
A. 定位差别。RequireJS不仅想成为浏览器端模块加载器,同时也设计后端的node部分;SeaJS则专注于WEB前端的。
B. 遵循规范。RequireJS遵循AMD的异步加载;SeaJS遵循CMD的模式,更加简洁。
C. 社区理念。RequireJS尝试让第三方库修改一满足它。而SeaJS则是自主封装来适应。
D. RequireJS的bug不明显,SeaJS若存在bug会很明显。
E. 调试的支持。SeaJS通过插件实现一些RequireJS无法实现的功能。
F. 插件机制。RequireJS在源码中为插件预留接口;SeaJS开放自身,让插件开发者可以访问和修改,非常灵活。
CMD是在国内前端开发人员研究SeaJS的过程中发现的,它和AMD一样属于CommonJS规范的一种实现的定义,requireJS和seaJS是对应AMD和CMD的实践。
其中CMD的seaJS是一种按需加载的模式,定义一个模块的时候不需要立即制定模块之间的依赖模块,在需要用到的时候require就可以了;而AMD的requireJS相反,定义模块的时候需要定制依赖模块,并且所有的依赖模块都是先执行。
对应的seaJS在js程序中的执行顺序是按照顺序结构,从上到下一次加载,当遇到require某模块的时候再去调用某些模块。
对应的requireJS在js程序中的执行顺序是不确定的。在执行前,它会加载本模块依赖的其它模块,先将执行环境给构建好,然后在此基础之上再执行其他的语句。