日期:2014-05-16  浏览次数:20315 次

为什么 SeaJS 模块的合并这么麻烦

引自:http://chaoskeh.com/blog/why-its-hard-to-combo-seajs-modules.html

?

为什么 SeaJS 模块的合并这么麻烦

前端技术 seajs Javascript spm js合并

引子

最近看到身边很多同学开始抛弃传统的 <script> 而改用 SeaJS 这样的 JS 模块加载器了,这是件好事,也是一种趋势。
但是任何事物都有两面性,使用模块加载器虽然对于代码的可维护性带来了较大的提升,但是也引入了更多的复杂度,所以肯定会给某些方面带来麻烦——比如这篇文章要探讨的 JS 文件合并。
不少人知道 SeaJS 有个配套的文件压缩合并工具 Spm,可是这个工具似乎一直各种调整、跳票,而且目前版本的使用、配置也很复杂,很多人对此怨声载道,比如我见过有人提 issue 说: “我感觉 SeaJS 非常轻量、好用,可是那个 Spm 怎么搞的那么复杂呢?”
其实 Spm 的复杂,有一部分原因正是由于 SeaJS 造成的,请往下看

传统的 JS 合并

如果采用 <script> 标签的话,JS 合并非常简单,比如

<script src="/js/util.js"></script>
<script src="/js/index.js"></script>
// util.js
function add (a,b) {
  return a + b;
}

// index.js
var c = add(1, 2);
alert(c);

这时候要合并的话,只需要按照 html 上 JS 文件的引入顺序,将相应的文件拼合即可,这一步甚至可以通过一些工具来自动化实现,比如启用 nginx 的 concat 模块后可以这样

<script src="/js/??util.js,index.js"></script>
// 合并后的 JS
function add(a,b) {
  return a + b;
}
var c = add(1,2);
alert(c);

使用 SeaJS 后的合并

上面的例子改用 SeaJS 的话会是这样

<script src="/js/sea.js"></script>
<script>
seajs.use("/js/index");
</script>
// util.js
define(function (require, exports) {
    exports.add = function (a, b) {
        return a + b;
    };
});