产物分析
如果想要分析某个 Module 的引用链路,可以查看 👉🏻Module 引用链分析。
⭐️ 功能概览
Rsdoctor 提供了 Bundle Size 模块,该模块主要用于分析 Webpack 或 Rspack 构建产物的信息,包括当前编译产物的资源大小、重复包、模块引用关系等:
- 产物概览:展示产物总数、各类型文件数目、大小以及占比,以及重复包和重复包的引用链,👉🏻 产物概览
- 产物分析(
Bundle Analysis)模块:分析构建产物资源(Assets)以及所包含的 Modules 的大小和代码信息。在该模块中,可以查看 Assets 中 Module 打包后的实际代码大小、模块的原始代码、打包后的代码段以及模块引用关系。
其中,产物分析展示了两种视图模式,Tree Map 和 Tree Graph:
- 👉🏻 Tree Map
Tree Map 是一种经典的构建产物分析视图,能帮助开发者更直观地可视化并分析 bundle 的构成,以及资源(Assets)和模块(Modules)的占比。同时支持搜索模块资源,点击模块资源可以放大到该模块区域。
- 👉🏻 Tree Graph
Tree Graph 是一种基于文件树形式的构建产物分析视图,能帮助开发者更直观地可视化并分析产物的构成,以及产物(Assets)和模块(Modules)的占比。同时支持搜索模块资源,点击模块还可以查看模块详情和代码。
🪐 名词解释
Assets:资源是最终存在于输出文件夹内的文件,包括 JavaScript、CSS、图像、字体、媒体等文件类型。每个 Chunk 都 有对应的 Assets 资源。Module:多个 Module 组合成了 Chunk。有关 Module 类型的详细信息,请参阅 Rspack Modules 和 Webpack Modules。Source Size:文件的原始大小,未经过任何转换和压缩。Bundle Size:文件最终输出的大小。如果开启了压缩,这个值代表压缩后的大小。Gzip Size:文件经过 gzip 压缩后的大小。Package Count:第三方包的数量。Initial Chunk: initial(初始化) 是入口起点的主 Chunk,该 Chunk 包含入口起点指定的所有模块及其依赖项,与「按需加载」的 Chunk 资源不同。- 有关 Initial Chunk 的详细信息,请参阅 Initial Chunk 介绍。
Duplicate Packages: 打包到项目中的重复的第三方包。不包括未打包进产物的第三方包,请参阅重复第三方包。Concatenated Module: 串联模块是将多个模块在打包时提升或串联到一个闭包中。在过去,Webpack 在打包时会将每个模块都打包到单独的闭包中,这种封装函数会导致 JavaScript 在浏览器中执行时较慢。可以通过开 启optimization.concatenateModules参数来进行优化。
🪐 产物概览
产物信息卡
产物概览显示了 Total Files 等文件数目和大小信息。点击卡片可以展开资源详情,如下图所示:
- 点击详情图标,右侧会展示对应的资源树,并标明资源大小:
- 点击标签切换资源信息查看,例如:「Total JS | Initial JS」。同时,卡片上展示了资源的体积占比、体积大小以及资源数目。同样,点击右下图标可以展开资源列表。
重复第三方包
- Duplicate Packages 卡片上展示了项目中重复的第三方包数量。点击图片可以查看重复第三方包的具体详情。请注意,这里的第三方包是被打包的第三方包。
更多信息,请参阅重复第三方包
🪐 Tree map
如果一个 Asset 区块中没有 Module 分块,则需要手动开启 SourceMap。注意只在 Rsdoctor 开启时打开 SourceMap,不要影响线上产物。FAQ
Tree Map 视图可以直观展示各个模块之间的占比和关系,如下图所示。点击模块资源可以放大到该模块区域。
- Tree Map 视图也支持搜索模块资源,左侧的侧边栏可以过滤资源(Assets)和搜索模块(Modules)。点击模块的搜索结果可以放大到该模块区域。
- 双击某个区块可以展示其 Module 详情卡片,如下图所示。更多信息请参阅 Module 详情。
🪐 Tree graph
如果一个 Asset 区块中没有 Module 分块,则需要手动开启 SourceMap。注意只在 Rsdoctor 开启时打开 SourceMap,不要影响线上产物。FAQ
Tree Graph 是一种基于文件树形式的构建产物分析视图,用于分析构建产物资源(Assets)以及所包含的 Modules 的大小和代码信息。在该模块中,可以查看 Assets 中 Module 打 包后的实际代码大小、模块的原始代码、打包后的代码段以及模块引用关系。
点击导航栏的「Bundle Size」选项,即可查看 Bundle 分析报告。请注意,要展示此页面,需要开启构建产物分析能力 features。
如果项目基于 Rspack 且版本低于 0.5.1,无法查看代码信息。
资源与模块关系展示
Bundle Analysis 模块用于分析构建产物资源(Assets)以及所包含的 Modules 的大小和代码信息。示例图如下:
- 左侧是 Assets 资源列表,按照资源大小降序排列,可以点击 「expand all」 按钮展开全部节点。
- 右侧是 Assets 对应的 Modules 列表,同样按照打包后模块大小降序排列。
搜索筛选框
顶部工具栏从左到右依次是:搜索 Assets 工具、筛选 Assets 大小工具、筛选 Module 大小工具。
- 搜索 Entry 输入框:在输入框中输入 Entry 的关键词,可以搜索对应的 Entry,只展示该 Entry 下的 Assets 等。
- 搜索 Assets 输入框:在输入框中输入
Assets的关键词,可以搜索对应的Assets。 - Assets Size 筛选工具:填写数字,单位为:KB、MB,可以过滤掉小于所填
Size的Assets资源。 - Module Size 筛选工具:填写数字,单位为:KB、MB,可以过滤掉小于所填
Size的Module资源。
模块搜索功能
支持模块搜索功能,用户可以通过点击「Search Module」按钮,打开模块搜索弹窗。输入模块名称来快速定位和查看模块所在的 Assets,从而更方便地分析模块的引用关系和大小。
如下图,可以看到匹配搜索 Module 关键字的结果:
模块标签说明
Assets 标签如左图所示,从左到右依次代表:资源体积、Initial Chunk 和 代码查看。


Modules 标签如右图所示,从左到右依次代表:
- Bundled Size
- 模块打包进产物的最终大小。一些标有
concatenated的模块是串联模块,对此值有一定影响,请参阅下方的concatenated module解释。
- 模块打包进产物的最终大小。一些标有
- Concatenated Module 串联模块:将多个模块在打包时提升或串联到一个闭包中。有两种类型:
- 一种是串联主模块,标明串联了多少个
Modules; - 另一种是被串联的子模块,标明被聚合到了哪个
Module内。这种子模块无法继续拆解打包后的代码,因此无法得知具体的Bundled Size,只能得知整个串联模块的大小,该大小标注在主模块尾部。
- 一种是串联主模块,标明串联了多少个
- Module Explorer 标签:点击可打开
Module之间的依赖关系分析页面。 - 代码查看 标签,点击可展开代码段,包括
Source(源码)、Transformed(编译后代码)和Bundled(打包后代码)。
支持 concatenated module 分析
Concatenated Module 是多个 Modules 被合并在了一个闭包中,无法通过 AST 语法分析拆解。但 concatenated module 中可能包含不同 Package 的代码,分析 concatenated module 内部子 Modules 也成为了重点,尤其是采用 "all-in-one" 方式打包的项目。
Rsdoctor 支持了对 Concatenated Module 的拆解并精确计算 concatenated module 中子 modules 的真实的打包后的体积,帮助开发者准确识别 Tree Shaking 后的实际构建体积,分析合并模块对最终 bundle 大小的影响以及优化分包策略。
- Rspack 项目:Rspack(>=1.4.11)内部的 Rsdoctor native 插件增强了 sourcemap 相关能力,可以在不开启 source map 的情况下,无痛分析 concatenate module。
可以看到下图,是 'all-in-one' 的打包分析,上图为之前无法分析的情况,下图为可分析情况
- 不支持分析
- 支持分析
- webpack 项目:需要开启 sourcemap,才可以准确拆解并分析 concatenated module,配置如下。
- Rsdoctor 对 Concatenated Module 分析支持如下 Sourcemap 配置:
- source-map
- hidden-source-map
- inline-source-map
- cheap-source-map
- cheap-module-source-map
- nosources-source-map
🪐 Module 详情
点击模块标签,可以查看模块详情,如下图所示:
- Reasons:顾名思义是 [原因] 的意思,即某个 Module 存在的原因。Reasons 就是该 Module 被哪些 Module 引入,而整个 Reasons Tree 就是这个 Module 的整个上游引用链,包括直接父级和间接父级。即 Rspack 的 stats.reasons。
- Dependencies:是该 Module 依赖了哪些 Module。
- Bailout Reason:Tree shaking 时,该 Module Tree shaking 失败的原因。
更多可查看详情:Module 详情
🪐 支持 BannerPlugin
supports.banner 选项仅用于调试,请勿将其用于生产。
由于 Rspack 和 webpack 都支持 BannerPlugin,BannerPlugin 是一个可在生成的 chunk 顶部或尾部添加指定内容的内置插件。
添加的代码段将会影响到对 Bundle 的解析能力。
Rsdoctor 兼容了 BannerPlugin 这种添加代码的逻辑,但因为 Rsdoctor 需要添加标记代码,所以没有默认开启。以下两种情况会开启 Rsdoctor BannerPlugin 能力:
-
项目在
rspack.config.(js|ts)或webpack.config.(js|ts)中使用了 BannerPlugin; -
通过 Rsdoctor options 配置
supports.banner来开启:

