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

# 产物体积优化

产物体积的优化在生产环境中是非常重要的，因为它直接影响到了线上的用户体验。在这篇文档中，我们将介绍在 Modern.js 中一些常见的产物体积优化方式。

## 减少重复依赖

在业务项目中，会存在某些第三方依赖被安装了多个版本的现象。重复依赖会导致包体积变大、构建速度变慢。

我们可以通过社区中的一些工具来检测或消除重复依赖。

- 如果你在使用 `pnpm >= 7.26.0`，可以使用 pnpm 自带的 [pnpm dedupe](https://pnpm.io/cli/dedupe) 命令来升级和消除其中的重复依赖。

```bash
pnpm dedupe
```

- 如果你在使用 `pnpm < 7.26.0` 版本，可以使用 [pnpm-deduplicate](https://github.com/ocavue/pnpm-deduplicate) 来分析出所有的重复依赖，并通过升级依赖或声明 [pnpm overrides](https://pnpm.io/package_json#pnpmoverrides) 进行版本合并。

```bash
npx pnpm-deduplicate --list
```

- 如果你在使用 `yarn`，可以使用 [yarn-deduplicate](https://github.com/scinos/yarn-deduplicate) 来自动合并重复依赖：

```bash
npx yarn-deduplicate && yarn
```

## 使用更轻量的库

建议将项目中体积较大的三方库替换为更轻量的库，比如将 [moment](https://momentjs.com/) 替换为 [day.js](https://day.js.org/)。

如果你需要找出项目中体积较大的三方库，可以在执行构建时添加 `BUNDLE_ANALYZE=true` 环境变量：

```bash
BUNDLE_ANALYZE=true pnpm build
```

这将生成一个打包分析报告，帮助你识别体积较大的依赖。

## 提升 Browserslist 范围

Modern.js 会根据项目的 Browserslist 配置范围进行代码编译，并注入相应的 Polyfill。如果项目不需要兼容旧版浏览器，可以根据实际情况来提升 Browserslist 范围，从而减少在语法和 Polyfill 上的编译开销。

Modern.js 默认的 [`output.overrideBrowserslist`](/zh/configure/app/output/override-browserslist.md) 配置为：

```js
['chrome >= 87', 'edge >= 88', 'firefox >= 78', 'safari >= 14'];
```

比如只兼容 Chrome 100 以上的浏览器，可以改成：

```js
['Chrome >= 100'];
```

:::tip
请阅读 [Browserslist 配置](/zh/guides/advanced-features/compatibility.md) 章节来了解更多关于 Browserslist 的用法。
:::

## 按需引入 polyfill

在明确第三方依赖不需要额外 polyfill 的情况下，你可以将 [output.polyfill](/zh/configure/app/output/polyfill.md) 设置为 `usage`。

在 `usage` 模式下，Modern.js 会分析源代码中使用的语法，按需注入所需的 polyfill 代码，从而减少 polyfill 的代码量。

```js
export default {
  output: {
    polyfill: 'usage',
  },
};
```

:::tip
请阅读 [浏览器兼容性](/zh/guides/advanced-features/compatibility.md) 章节来了解更多关于 polyfill 的用法。
:::

## 使用图片压缩

在一般的前端项目中，图片资源的体积往往是项目产物体积的大头，因此如果能尽可能精简图片的体积，那么将会对项目的打包产物体积起到明显的优化效果。你可以在 Modern.js 中注册插件来启用图片压缩功能:

```js title="modern.config.ts"
import { pluginImageCompress } from '@rsbuild/plugin-image-compress';

export default {
  builderPlugins: [pluginImageCompress()],
};
```

详见 [Image Compress 插件](https://github.com/rstackjs/rsbuild-plugin-image-compress)。

## 代码拆包

良好的拆包策略对于提升应用的加载性能是十分重要的，可以充分利用浏览器的缓存机制，减少请求数量，加快页面加载速度。

在 Modern.js 中内置了[多种拆包策略](https://v2.rsbuild.rs/zh/guide/optimization/code-splitting)，可以满足大部分应用的需求，你也可以根据自己的业务场景，自定义拆包配置。
