> For AI agents: the complete documentation index is available at https://rsdoctor.rs/zh/llms.txt, the full documentation bundle is available at https://rsdoctor.rs/zh/llms-full.txt.

# FAQ

## 如何只使用 Rsdoctor 的某个功能？

当**只需要** Rsdoctor 内的 [Bundle Size](https://rsdoctor.rs/zh/guide/usage/bundle-size.md) 分析产物大小功能时，可以在 Rsdoctor 插件配置时添加对应的 [features](https://rsdoctor.rs/zh/config/options/features.md) 配置项，参考下方代码：

```ts
import { RsdoctorRspackPlugin } from '@rsdoctor/core';

new RsdoctorRspackPlugin({
  features: ['bundle'], // 代表只开启 bundle size 的功能分析
});
```

## Loader 耗时数据不准？

Rsdoctor 提供的 Loader 耗时是**预估耗时**。无法统计到准确耗时是因为 Loader 执行可能是**异步**函数也可能是**同步**函数，打包工具会**并行执行多个**不冲突的 Loader 函数，而 **JavaScript 是单线程**的，多个 Loader 函数均可能**抢占当前的任务队列**，且 Loader 函数内的**异步逻辑无法识别**，导致单个 Loader 函数在执行过程中**可能横跨**多个其他 Loader 的执行过程，因此会存在如下图所示的三种情况：

![](https://assets.rspack.rs/others/assets/rsdoctor/loader-cases.jpeg)
因此，Rsdoctor 提供的 Loader 耗时是一个**预估**的数据，我们给出的耗时数据准确反映了上图中情况 1 和情况 2，对于情况 3 的解决方案，我们目前还在探索中。

## 使用 `Rsdoctor` 构建时出现了 `out of memory` 问题

如果出现了 `out of memory` 的报错，可以尝试下列两个方法，推荐优先使用第一个：

### 方法一

增大 Node.js 内存上限，例如：`NODE_OPTIONS=--max-old-space-size=8096`。

### 方法二

这个问题通常是因为构建过程中存储源码信息，导致内存超限。请将 `output.reportCodeType` 设置为 `noCode` 或 `noAssetsAndModuleSource`，以降低内存占用。详情请参阅 [output.reportCodeType](https://rsdoctor.rs/zh/config/options/output.md#reportcodetype)。

## 产物分析中，Module 都没有 Bundled/Parsed size 怎么办？

### 问题说明

`Source Size` 和 `Bundled Size` 的区别：

- **Source Size**：Module 文件源码的原始大小（如下图青色标识）。
- **Bundled Size**：经过打包及压缩后的 Module 的最终代码大小（如下图蓝色标识）。\\
- **Gzip Size**：经过 gzip 压缩后的 Module 的最终代码大小（如下图黄色标识）。

![](https://assets.rspack.rs/others/assets/rsdoctor/all-in-one-after.png)
### 解决方案

如果缺少模块体积，请依次检查：

1. 确认项目使用的是 Rspack 2，并且已在生成这些产物的编译器中启用 Rsdoctor。
2. 确认已启用[产物分析](https://rsdoctor.rs/zh/config/options/features.md)。
3. 如果将 [`supports.parseBundle`](https://rsdoctor.rs/zh/config/options/supports.md#parsebundle) 设为了 `false`，请恢复为默认值 `true`，以便 Rsdoctor 在没有可用 source map 时解析产物代码。

如果能看到模块体积，但无法查看代码，请检查 [`output.reportCodeType`](https://rsdoctor.rs/zh/config/options/output.md#reportcodetype) 和报告模式。Brief 报告不包含代码。

如果模块体积仍然缺失，请检查是否有插件修改了产物代码却未同步更新 source map。排查时，可以尝试仅在运行 Rsdoctor 时开启 source map：

```js title="rspack.config.mjs"
export default {
  // 将 false 替换为项目原有的 devtool 配置值。
  devtool: process.env.RSDOCTOR === 'true' ? 'source-map' : false,
};
```

## 产物分析界面没有 `Bundled Size` 怎么办？

### 问题说明

`Source Size` 和 `Bundled Size` 的区别：

- **Source Size**：Module 文件源码的原始大小（如下图紫色标识）。
- **Bundled Size**：经过打包及压缩后的 Module 的最终代码大小（如下图青色标识）。

![](https://assets.rspack.rs/others/assets/rsdoctor/bundle-size-overall.png)
### 原因分析

模块串联会将多个模块合并到同一个闭包中，仅靠 AST 解析无法识别其中各个模块的代码。Rsdoctor 2.x 会利用 Rspack 的原生 source map 数据，确定每个模块打包后的代码和体积。

### 解决方案

如果缺少 Bundled Size，请按[上文步骤](#%E4%BA%A7%E7%89%A9%E5%88%86%E6%9E%90%E4%B8%ADmodule-%E9%83%BD%E6%B2%A1%E6%9C%89-bundledparsed-size-%E6%80%8E%E4%B9%88%E5%8A%9E)排查。

## CssExtractRspackPlugin 的 loader 耗时过长问题

在使用 Rsdoctor 对 Rspack 项目进行编译耗时分析时，可能会发现 [CssExtractRspackPlugin](https://rspack.rs/plugins/rspack/css-extract-rspack-plugin) 的 loader 耗时较长。然而，这个数值并不代表 CssExtractRspackPlugin 的 loader 的真实耗时，它还包含了对本模块编译的其他 loader 的耗时。

- 原因：[CssExtractRspackPlugin](https://rspack.rs/plugins/rspack/css-extract-rspack-plugin) 中的 loader 在 pitch 阶段会异步调用其他 loader，并等待这些 loader 执行后的回调结果。因此，CssExtractRspackPlugin 的耗时实际上包括了其他 loader 的执行时间和空闲时间。

![](https://assets.rspack.rs/rsdoctor/css-extract-loader.png)
## 在 Re.Pack 或自定义 Bundle 扩展名项目中使用 Rsdoctor

Rsdoctor 现在支持标准 `.js` 扩展名之外的自定义 JavaScript bundle 文件扩展名。这对于使用 `.bundle` 扩展名的 Re.Pack 等项目特别有用。

### 支持的扩展名

默认情况下，Rsdoctor 识别以下 JavaScript bundle 扩展名：

- `.js` - 标准 JavaScript 文件
- `.bundle` - Re.Pack 和其他自定义打包工具

### 无需配置

如果您的项目生成带有 `.bundle` 扩展名的 bundle 文件（例如 `main.bundle`、`vendor.bundle`），Rsdoctor 将自动：

- 解析和分析 `.bundle` 文件以及 `.js` 文件
- 在 Bundle 分析图表中显示 `.bundle` 文件
- 在 JavaScript 资源统计中包含 `.bundle` 资源
- 支持 `.bundle` 文件的 source map 分析

### 工作原理

检测逻辑已在以下领域更新：

1. **Bundle 解析**：`parseBundle` 函数现在在分析 bundle 内容时接受 `.js` 和 `.bundle` 扩展名。
2. **资源过滤**：资源摘要和过滤函数将 `.bundle` 文件视为 JavaScript 资源。
3. **文件类型检测**：所有文件扩展名匹配工具都包含 `.bundle` 作为公认的 JavaScript 扩展名。

### 用例示例

Re.Pack 项目通常生成带有 `.bundle` 扩展名的 bundle：

```
dist/
  ├── index.bundle        ← 现已支持！
  ├── vendor.bundle       ← 现已支持！
  ├── styles.css
  └── assets/
```

Rsdoctor 将自动检测和分析这些 `.bundle` 文件，无需任何额外配置。
