Skip to content

TreeShaking是什么及其原理 #12

Open
@jynba

Description

@jynba

TreeShaking是什么?

  • Tree Shaking 指基于 ES Module 进行静态分析,通过 AST 将用不到的函数进行移除,从而减小打包体积。
  • 当使用语法 import * 时,Tree Shaking 依然生效。
    可在 https://rollupjs.org/repl/ 中演示
    项目优化:为了减小生产环境体积,我们可以使用一些支持 ES 的 package,比如使用 lodash-es 替代 lodash
    可以在 https://npm.devtool.tech 中查看某个库是否支持 Tree Shaking

AST是什么?

AST 是 Abstract Syntax Tree 的简称,是前端工程化绕不过的一个名词。它涉及到工程化诸多环节的应用,比如:

  • 如何将 Typescript 转化为 Javascript (typescript)
  • 如何将 SASS/LESS 转化为 CSS (sass/less)
  • 如何将 ES6+ 转化为 ES5 (babel)
  • 如何将 Javascript 代码进行格式化 (eslint/prettier)
  • 如何识别 React 项目中的 JSX (babel)
  • GraphQL、MDX、Vue SFC 等等

而在语言转换的过程中,实质上就是对其 AST 的操作,核心步骤就是 AST 三步走

  1. Code -> AST (Parse)
  2. AST -> AST (Transform)
  3. AST -> Code (Generate)

在 AST Explorer( https://astexplorer.net/ ) 中,列举了诸多语言的解析器(Parser),及转化器(Transformer)

词法分析 (Lexical Analysis)

词法分析用以将代码转化为 Token 流,维护一个关于 Token 的数组
词法分析后的 Token 流也有诸多应用,如:

  • 代码检查,如 eslint 判断是否以分号结尾,判断是否含有分号的 token
  • 语法高亮,如 highlight/prism 使之代码高亮
  • 模板语法,如 ejs 等模板也离不开

语法分析 (Syntactic Analysis)

语法分析将 Token 流转化为结构化的 AST,方便操作

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions