javascript - 如何在 Gulp 任务流管道之后从 minify-html minifyJs (UglifyJS / Terser) 中检索 nameCache
问题描述
我在 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
,但我还没有看到这种缓存格式的工作示例,所以不知道这是否正常。我可以看到没有其他“变量”。
解决方案
推荐阅读
- wordpress - WPML 插件重定向
- here-api - HERE Route Match Extension 的意外行为
- android - 从 android 设置中撤销相机权限后,ARCore 应用程序终止
- javascript - 相同系列名称的不同数据
- node.js - 环回:在更新中使用 isValid()
- python - 无法在 Lotus Note DB 的 PYODBC SQL 查询中使用 sql 内置函数
- node.js - MongoDB:如果小于 10,则将字段值设置为 10,否则递增 1
- python - 中断后重新启动for循环
- spring-integration - Spring Integration - 如何将参数传递到服务激活器的方法中
- python - 更改数据框日期列的日期格式