我在 html-minify 的Gulp 包装器中使用 UglifyJS 的 Terser 分支,并希望保留并恢复 minifyJS nameCache
。
底层的 Terser 库在此处解释了如何执行此操作,但这种方法是在您直接运行该库时。我通过 HTML-Minifier 嵌入的“minifyJS”选项运行它,并作为流中的一个 gulp 任务,所以最初我在访问库修改的选项对象的时间方面遇到了一些麻烦。
我有点让它工作了一个 gulp 任务,但结果名称缓存几乎是空的。该库正在添加元结构(因此它似乎几乎可以正常工作并正确配置),但没有添加任何内容,即没有名称。
我所做的只是on finish
在管道末尾的流事件中添加示例。
const htmlmin = require('gulp-html-minifier-terser');
function myTask(){
let options = {
...
minifyJS: {
nameCache: {},
},
};
return gulp.src(path1))
.pipe(htmlmin(options))
.pipe(gulp.dest(path2)))
.on('finish', () => {
fs.writeFileSync(cacheFileName, JSON.stringify(options.minifyJS.nameCache), "utf8");
});
}
问题是输出只有:
{"vars":{"props":{}}}
它已经处理了几十个文件,所以我预计会有数百个变量名。
我首先要保留和恢复 nameCache 的原因是因为我发现在监视任务中运行缩小构建(Express 应用程序中的视图模板)时,每次它由某些文件更改触发并运行构建时,它使用不同的变量名,这会在 Git 中创建不必要的提交。我想可能还有其他解决方案,比如在发布或另一个 repo 之前不将缩小的模板提交给 Git。但我不想承担额外的负担,因为必须弄清楚哪些文件是“真正的”更改,或者必须提交数十个不必要的文件。因此,如果有另一种解决方案,我真的不需要持久化名称缓存 - 它似乎只是随机变量名称的直接解决方案。
更新
设置选项时会输出 nameCache 属性mangle.properties: true
。但是,这还会以破坏代码的方式破坏对象属性,因此我无法启用它。
无论如何,这证明该on finish
方法是正确的,因为我想知道管道是否存在一些时间问题,就像我在库将内部缓存复制回来之前访问 nameCache 一样。
因此,似乎只是名称缓存中没有出现的函数和变量名称。(我尝试调试到库中,但编译后的 Terser 库令人困惑,无法通过源映射单步执行。)
如果我将其添加到配置中:
let options = {
...
minifyJS: {
nameCache: {},
mangle: {
properties: false,
}
},
};
这会产生如下文件:
{"vars":{"props":{}},"props":{"props":{"$serverSide":"t","$processing":"i",
"$ajax":"u","$projectId":"l", ... }}}
我不确定为什么有三个props
,但我还没有看到这种缓存格式的工作示例,所以不知道这是否正常。我可以看到没有其他“变量”。