最近在我们的项目的构建流程中加了一个小脚本,作用是把多个 js 文件压缩成一个,这样可以减少启动时的资源请求数目。
主要用到了uglify.js这个库,在本地以及我们 window 构建服务器上,这个脚本都运行的不错,但是在 linux 服务上发现出错了。
脚本代码
首先会有一个配置文件,用到描述压缩合并哪些文件,压缩合并后的文件放在哪里。
uglify-3rd-party-lib.config.js
:
1 | var uglify3rdPartyLibConfig = { |
uglify-3rd-party-lib.js
- 用于压缩合并的脚本
1 | var UglifyJS = require('uglify-js'); |
上面的脚本还会自动把压缩合并后的文件添加到index.html
中,并添加 md5 值作为版本号来防止缓存。
BUG 描述及原因
其中最关键的一句代码
1 | var result = UglifyJS.minify(uglify3rdPartyLibConfig.fileList); |
minify
可以传入一个文件路径数组,然后压缩合并这个数组中的所有文件。
在 linux 上,文件路径都是形如/var/home/path/to/js
,而偏偏minify
会把这个路径当做正则表达式来匹配,结果其中的home
会被当做正则表达式的flag
,就会报这个正则有非法的 flag。
在 window 上,文件路径都是D:\path\to\js
,是不会当做正则的。
解决方案
linux 上的文件路径估计是不能改了,在各种 google 无果之后的苦恼时,突然灵光一现,在我的项目 cli 中,也有利用uglify.js
压缩脚本的流程,而它们没有报错。看了它们的源码之后,发现他们并不是把文件路径传给minify
,而是把文件内容的字符串直接传给他,即:
1 | var fileContentList = []; |
灯登等凳 ☺️☺️☺️,问题解决啦~