umijs / mako

An extremely fast, production-grade web bundler based on Rust.
https://makojs.dev
MIT License
1.9k stars 74 forks source link

TreeShaking 思路 #124

Closed heden9 closed 1 year ago

heden9 commented 1 year ago

TreeShaking module

实现思路

  1. module_graph.toposort() 拓扑排一下,主要是看看哪些模块被用到了,以及分析循环依赖
  2. 针对循环依赖的模块设置为 sideEffects
  3. 针对入口模块设置为 sideEffects
  4. 针对不是JS的模块、以及他们的依赖也设置为 sideEffects
  5. 包含了 external 的模块也设置为 sideEffects
  6. 将原始模块重新创建为 treeShaking 模块
  7. 针对不是 esm 的模块,默认全部导出(commonjs的),(没法treeShaking)
  8. 针对有副作用的模块,分析 export、import
    1. 分析 import 语句的过程:
      1. 找到当前依赖的模块
        1. 如果当前模块不是JS、或者是external的,则跳过处理
        2. 如果当前使用模块的姿势是 import “xxx”,这里有可能是 specifiers.is_empty 或者是 Namespace,则认为当前模块是 UsedExports:ALL 并且包含副作用
        3. 如果是 named export,则提取当前的 specifiers
        4. 如果是 default export,则提取当前的 specifiers 为 default
    2. 分析 export 语句的过程(这里只包含重新导出的部分,re-export)
      1. ….
  9. 分析不含副作用的模块
    1. 如果当前模块不包含任何 usedexport,则认为当前模块是可以被删除的
    2. 开始删除无用的声明
    3. 类似上面的分析过程,对删除声明后的代码进行分
  10. 动态加载的模块
    1. 入口模块设置为副作用模块,usedexport:all
  11. 删除刚刚分析出来的无用模块
sorrycc commented 1 year ago
image

转一个相关资讯,来自 @fz6m 。

heden9 commented 1 year ago

Top Level Statement graph 思路

heden9 commented 1 year ago

标记和删除

heden9 commented 1 year ago

模块连接 ModuleConcatenation

ConcatenatedModule

实现思路