深入解析布尔值简化与AST:从代码到抽象语法树的转换过程

// 压缩前
const a = 3;
const b = 4;
// 压缩后
const a = 3, b = 4;

深入解析布尔值简化与AST:从代码到抽象语法树的转换过程

布尔简化的示例如下:

// 压缩前
!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‘前端’中的应用》

你可能想看:
« 上一篇
下一篇 »

相关推荐

FreeBasic:强大免费开源的64位basic编译器及应用优势

2025年05月10日

82阅读

脊柱侧弯矫正方法大盘点:运动康复、支具矫正等多种方式

2025年05月09日

87阅读

如何在winForm标题栏去掉标题文字且任务栏图标正常显示

2025年05月09日

86阅读

十一黄金周促销广告词大全,国庆购物狂欢等你来

2025年05月09日

78阅读

关闭快速编辑模式及插入模式,设置控制台指定文字颜色举例

2025年05月09日

63阅读

黄金搭档低糖高钙饮品包装及成分功效全解析,适合人群要知晓

2025年05月09日

91阅读