Peter Mu +

为什么构建CMD模块时需要转换为transport规范?

1. 关于CommonJS的Modules/Transport规范

典型的符合Transport规范的代码就是这样:

define(id, deps, factory)

Transport规范的模块可以随意压缩。

2. CMD 规范

简要说CMD规范就是:一个文件里面只能定义一个 CMD 模块,模块的ID就是文件的全路径。CMD就是一种书写规范,方便编码,尤其是require书写规范的约束。正是因为这个特性,CMD规范的模块不能随意压缩合并,但是Seajs是支持Transport规范的。所以要压缩、合并的话需要转换为Transport规范的模块。如果要究其原因:见 为什么 SeaJS 模块的合并这么麻烦

3. 构建过程

1.提取操作。

用来提取模块的标识 id 和依赖 dependencies。假设模块代码为:

a.js

define(function(require, exports) {
  var b = require('./b');
})

经过提取操作后,a.js 的源码会转换成临时文件:

define('xxx/1.0.0/a', ['./b'], function(require, exports) {
    var b = require('./b');
})

模块的ID一定要用相对路径,与seajs的config中的base组合后就是这个文件的URL。这样require就能正确使用了。

2.压缩操作。

经过上面的提取操作后,构建工具就可以调用任何 JS 压缩工具来进行压缩了,require 参数也可以被压缩成任意字符。

可以看出,和普通压缩工具相比,CMD 模块的构建过程中增加了 id 和 dependencies 的提取操作。