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, and this page is available as Markdown at https://rsdoctor.rs/zh/guide/more/faq.md.
close
  • 简体中文
  • FAQ

    如何只使用 Rsdoctor 的某个功能?

    当只需要 Rsdoctor 内的 Bundle Size 分析产物大小功能时,可以在 Rsdoctor 插件配置时添加对应的 features 配置项,参考下方代码:

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

    Loader 耗时数据不准?

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

    因此,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。

    产物分析中,Module 都没有 Bundled/Parsed size 怎么办?

    问题说明

    Source Size 和 Bundled Size 的区别:

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

    解决方案

    如果缺少模块体积,请依次检查:

    1. 确认项目使用的是 Rspack 2,并且已在生成这些产物的编译器中启用 Rsdoctor。
    2. 确认已启用产物分析。
    3. 如果将 supports.parseBundle 设为了 false,请恢复为默认值 true,以便 Rsdoctor 在没有可用 source map 时解析产物代码。

    如果能看到模块体积,但无法查看代码,请检查 output.reportCodeType 和报告模式。Brief 报告不包含代码。

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

    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 的最终代码大小(如下图青色标识)。

    原因分析

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

    解决方案

    如果缺少 Bundled Size,请按上文步骤排查。

    CssExtractRspackPlugin 的 loader 耗时过长问题

    在使用 Rsdoctor 对 Rspack 项目进行编译耗时分析时,可能会发现 CssExtractRspackPlugin 的 loader 耗时较长。然而,这个数值并不代表 CssExtractRspackPlugin 的 loader 的真实耗时,它还包含了对本模块编译的其他 loader 的耗时。

    • 原因:CssExtractRspackPlugin 中的 loader 在 pitch 阶段会异步调用其他 loader,并等待这些 loader 执行后的回调结果。因此,CssExtractRspackPlugin 的耗时实际上包括了其他 loader 的执行时间和空闲时间。

    在 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 文件,无需任何额外配置。