Seajs作为一款业界比较知名的模块加载库,的确为开发带来了很多便利,当然近期通过对seajs的一些操作,让自己又掉进了一个坑中。
坑的问题
当seajs的模块正常使用时是无需添加dependencies的,也就是前依赖,因为构建工具一般都会自动添加。
What? 不知道什么是前依赖?看看如下代码
//一下为一个seajs的模块基础部分1
2define(id,[dependencies], function(require, exports, module) {
})
以上代码中id为模块ID,dependencies就是前依赖,顾名思义,在执行function时必须会先加载完[]里面的内容。
默认情况下这个值大家是不需要添加的,因为构建工具会自动添加,不压缩的情况下Seajs也会自动抓取require里面的值,来帮忙首先加载前依赖。
坑来了
当你未使用构建工具,并且通过uglify对Seajs模块进行混淆压缩时,代码在调用这个模块时,模块中原本require进来的内容都加载不进来。简言之:报错了。

原因
经过一天的细心排查以及对Seajs的源码的一些阅读,终于找到了问题所在。
因为Seajs在省略前依赖的时候,框架会通过require来捕捉所有前依赖并在代码执行前进行加载。简言之就是,框架帮你添加了前依赖,但是经过了uglify混淆之后,require变成了一个单字母,结果就是Seajs无法检测到require,也就无法帮忙添加前依赖,此时需要自己手动添加。
解决办法
- 压缩前自己手动添加上前依赖
- 可以在uglify压缩时,配置参数来使压缩时不会将require混淆掉。UglifyJS文档
Uglify配置1
2
3
4
5var compressJS = UglifyJS.minify(orig_code,{
mangle: {
reserved: ['require']
}
});