SPM(SeaJS Package Manager)正是为此而生的,但是本篇暂时不讨论这个,我只讲我所采用的办法。
需要少许 Ruby 以及命令行知识。
项目终于要发布上线,我们当然先得压缩一下代码,完了之后检查一下我们碉堡了的项目……
等等,怎么报错了,莫非是我打开的方式不对?模块的依赖怎么都没加载?
发现模块代码竟然变成了:
require
“关键字” 变成了 a
,SeaJS 不能根据 require
进行正则匹配来找到此模块的依赖了。
先温习一下 define
,它其实可以接收三个参数,写全了的调用应该是这样的:
因此,解决办法很简单,有两种:
- 告诉压缩工具
require
是关键字,不要替换
- 利用工具把模块依赖给解析出来,并在
define
中写上
方法一我并没有尝试,主要的原因是,它并没有解决实际的问题,SeaJS 仍然需要从你的模块代码中解析依赖。
它采用的办法前文有述,正则表达式匹配出来的,势必带来一些线上的性能损耗(事实上不管用什么办法都会有损耗)。
而方法二则相当于用工具帮助你把模块依赖给写了出来:
如此处理后,不管你用什么工具,YUI Compressor 或者 Google Compiler 或者 UglifyJS,都不会有问题了。
但是,我该怎么合并模块呢?写上 id
就好。
总结一下,开发阶段:
- 模块对应文件,因此不需要写模块 ID;
- 依赖由 SeaJS 自动解析,因此省却了手工写明依赖数组。
但上线之后:
- 文件会合并,因此需要提供 ID;
- 自动解析性能差,而且
require
还会被压缩,因此需要写明依赖数组。
所以,任务已经说明,我们需要预处理代码,把这俩更新到模块文件中去。
首先,我们需要安装工具,它是一个 Ruby Gem,叫做 rill
。安装办法很简单:
目前的版本是 0.0.1,比较原始,但它的功能代码,已经在我的项目中跑了1年多,所以质量还是有保证的。
源代码在 dotnil/rill。
装好之后,假设你的伟大项目在 /awsome/
目录,代码结构如下:
只要这么做就好:
它会把 /awesome/modules
目录下的模块文件都搞成这种样子:
变成这样之后,压缩与合并就不再有问题了。