深入解析布尔值简化与AST:从代码到抽象语法树的转换过程
// 压缩前
const a = 3;
const b = 4;
// 压缩后
const a = 3, b = 4;
布尔简化的示例如下:
// 压缩前
!b && !c && !d && !e
// 压缩后
b||c||d||e
此示例需要解析 AST。
谷草转氨酶
AST,抽象语法树,js代码解析后的最小词法单元,而这个过程是通过Parser完成的。
那么AST能做什么呢?
我们在日常工作中经常会不经意的接触到,比如eslint、babel,就涉及到js和代码。不同的解析器会生成不同的 AST。 babel最常用的解析器是babylon,而uglify在代码压缩中使用的解析器是UglifyJS。
大家可以在AST Explorer[3]中直观的感受一下,如下图:
压缩代码的过程:code -> AST ->(变换)一个更小的AST -> code,这和babel、eslint的过程一模一样。
UglifyJS
不要重新发明轮子!
于是我找到了一个著名的代码压缩库:UglifyJS3[4],一个用于代码压缩混淆的库。那么它是如何完成一些压缩功能的,比如替换空白字符呢?答案是AST。
webpack中内置的代码压缩插件就使用了它,其工作流程大致如下:
// 原始代码
const code = `const a = 3;`
// 通过 UglifyJS 把代码解析为 AST
const ast = UglifyJS.parse(code);
ast.figure_out_scope();
// 转化为一颗更小的 AST 树
compressor = UglifyJS.Compressor();
ast = ast.transform(compressor);
// 再把 AST 转化为代码
code = ast.print_to_string();
当你真正使用它来压缩代码时,你只需要编程进行配置即可。文档请参考uglify官方文档[5]
{
{
ecma: 8,
},
compress: {
ecma: 5,
warnings: false,
comparisons: false,
inline: 2,
},
output: {
ecma: 5,
comments: false,
ascii_only: true,
}
}
缩小 webpack 中的代码
了解了代码压缩是如何完成的之后,我们终于可以将其搬到生产环境中来压缩代码了。终于到了付诸实践的时候了,虽然只是调用API,调整参数而已。
一切与性能优化相关的事情都可以在优化中找到。 TerserPlugin是一个基于uglifyjs的用于压缩JS的插件。
optimization: {
minimize: isEnvProduction,
minimizer: [
new TerserPlugin({
terserOptions: {
parse: {
ecma: 8,
},
compress: {
ecma: 5,
warnings: false,
comparisons: false,
inline: 2,
},
output: {
ecma: 5,
comments: false,
ascii_only: true,
},
},
sourceMap: true
})
]
}
JavaScript经典实例学习资料推荐文章
《前端开发规范:命名规范、html规范、css规范、js规范》
《【标准】前端团队代码标准最佳实践》
《100个原生JavaScript代码片段知识点详解【练习】》
《前端174个JavaScript知识点总结(一)》
《前端174个JavaScript知识点总结(二)》
《前端174个JavaScript知识点总结(三)》
《几个非常有趣的JavaScript知识点总结[实践]》
“都2020年了,你还不知道JavaScript装饰器?” 》
《JavaScript实现图像合成下载》
《JavaScript 70 个知识点详解(上)【练习】》
《JavaScript 70个知识点详解(下)【练习】》
《开源JavaScript版敏感词过滤库》
《给你43道JavaScript面试题》
“你值得拥有的 3 个优秀的 JavaScript 库”
《手把手教你深度巩固JavaScript知识体系【思维导图】》
“推荐的 7 个很棒的 JavaScript 产品步骤指南”
《Echa哥教你彻底理解JavaScript执行机制》
《合格的中级前端工程师需要掌握的 28 个 JavaScript 技能》
《深入解析高频项目中使用的知识点总结[JS]》
“完整的JavaScript工具功能[新]”
“从 JavaScript 来看设计模式(摘要)”
《正则表达式详解及ID号验证(JavaScript、Regex)》
“在浏览器中实现 JavaScript 定时器的 4 种创新方法”
《Three.js动画解决方案》
《一步一步教你59个常用的JS类方法》
《127个常用JS代码片段,每段代码30秒就能看懂——【第1部分】》
《用简单的话解释js深拷贝与浅拷贝》
《一步步教你如何用JS开发H5游戏【毁灭星星】》
《深入浅出地讲解 JS 中 this/apply/call/bind 的巧妙运用【实践】》
《一步步教你如何在JS中充分解读this的真谛【实践】》
“书用了就少了遗憾,一大波JS开发工具功能来了”
《充满有用的信息!如何优雅简洁地实现时钟翻转器(支持 JS/Vue/React)》
《一步步教你六种JS异步编程解决方案【实践】》
《15个高效JS技巧和知识点总结,帮你减少加班【实践】》
《一步步教你如何用JS开发H5游戏【黄金矿工】》
《一步步教你如何用JS监听浏览器上下左右滚动》
《JS经典实例知识点合集【实践】》
《26000字JS有用资讯分享,带你领略前端魅力【基础知识】》
《26000字JS实用资讯分享,带你领略前端魅力【实践】》
《简单几步,让你的JS写得更漂亮》
“恭喜您获得治疗本病JS的详细处方”
《聊聊前端关于文件上传和下载的那些事[练习]》
《教你如何在面试中绕过 JavaScript 作用域的 5 个陷阱》
《Jquery插件(常用插件库)》
《[JS]如何防止重复的ajax请求》
《JavaScript+Canvas实现自定义画板》
《Continuation在JS‘前端’中的应用》