JS模块化规范

JS模块化规范学习笔记

CommonJS

CommonJS是主要为了JS在后端的表现制定的,Node遵循CommonJS的规范。

CommonJS定义的模块分为:{模块引用(require)} {模块定义(exports)} {模块标识(module)}

require()用来引入外部模块;exports对象用于导出当前模块的方法或变量,唯一的导出口;module对象就代表模块本身。

概述:CommonJS是JS后端模块化规范,该规范定义的模块划分为:{模块标识(module)}(声明)、{模块定义(exports)}(定义)、{模块引用(require)}(使用)

AMD

AMD(异步模块定义)是主要为前端JS的表现制定的,RequireJS就是实现了AMD规范。

异步模块定义规范(AMD)制定了定义模块的规则,这样模块和模块的依赖可以被异步加载。这和浏览器的异步加载模块的环境刚好适应(浏览器同步加载模块会导致性能、可用性、调试和跨域访问等问题)

只定义了一个函数 “define”,它是全局变量。define(id?, dependencies?, factory);

AMD的模块名规范是CommonJS模块名规范的超集。AMD可以作为CommonJS模块一个中转的版本只要CommonJS没有被用来同步的require调用。使用同步require调用的CommonJS代码可以被转换为使用回调风格的AMD模块加载器。

概述:AMD(异步模块定义)是JS前端模块化规范,只定义了一个函数 “define”,并且它是全局变量。

CMD

CMD(Common Module Definition)明确了模块的基本书写格式和基本交互规则,与AMD蛮相近的,不过用起来感觉更加方便些,seajs遵循CMD规范。

Sea.js 是一个成熟的开源项目,核心目标是给前端开发提供简单、极致的模块化开发体验。

在 CMD 规范中,一个模块就是一个文件,代码的书写格式:define(factory); define 是一个全局函数,用来定义模块。具体了解:CMD 模块定义规范

概述:CMD(通用模块定义)是JS前端模块化规范,明确了模块的基本书写格式和基本交互规则,使用更加方便。

SeaJs和RequireJs的异同

共同点:

RequireJS 和 Sea.js 都是模块加载器,倡导模块化开发理念,核心价值是让 JavaScript 的模块化开发变得简单自然。

不同点:

两者的主要区别如下:

1.定位有差异。RequireJS 想成为浏览器端的模块加载器,同时也想成为 Rhino / Node 等环境的模块加载器。Sea.js 则专注于 Web 浏览器端,同时通过 Node 扩展的方式可以很方便跑在 Node 环境中。

2.遵循的规范不同。RequireJS 遵循 AMD(异步模块定义)规范,Sea.js 遵循 CMD (通用模块定义)规范。规范的不同,导致了两者 API 不同。Sea.js 更贴近 CommonJS Modules/1.1 和 Node Modules 规范。

3.推广理念有差异。RequireJS 在尝试让第三方类库修改自身来支持 RequireJS,目前只有少数社区采纳。Sea.js 不强推,采用自主封装的方式来“海纳百川”,目前已有较成熟的封装策略。

4.对开发调试的支持有差异。Sea.js 非常关注代码的开发调试,有 nocache、debug 等用于调试的插件。RequireJS 无这方面的明显支持。

5.插件机制不同。RequireJS 采取的是在源码中预留接口的形式,插件类型比较单一。Sea.js 采取的是通用事件机制,插件类型更丰富。

还有不少差异,涉及具体使用方式和源码实现,欢迎有兴趣者研究并发表看法。

总之,如果说 RequireJS 是 Prototype 类库的话,则 Sea.js 致力于成为 jQuery 类库。

AMD 和 CMD 的区别

执行模块的机制大不一样

SeaJS对模块的态度是懒执行, 而RequireJS对模块的态度是预执行

AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。

对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同)。CMD 推崇 as lazy as possible.2. CMD 推崇依赖就近,AMD 推崇依赖前置
AMD 的 API 默认是一个当多个用,CMD 的 API 严格区分,推崇职责单一。


推荐资料

浅析JS中的模块规范(CommonJS,AMD,CMD)

AMD 模块定义规范
CMD 模块定义规范

AMD 和 CMD 的区别

SeaJS 和 RequireJS 的异同