For AI agents: the complete documentation index is available at /zh/llms.txt, the full documentation bundle is available at /zh/llms-full.txt, and this page is available as Markdown at /zh/guides/advanced-features/page-performance/optimize-bundle.md.
  • 简体中文
  • 产物体积优化

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

    减少重复依赖

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

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

    • 如果你在使用 pnpm >= 7.26.0,可以使用 pnpm 自带的 pnpm dedupe 命令来升级和消除其中的重复依赖。
    pnpm dedupe
    • 如果你在使用 pnpm < 7.26.0 版本,可以使用 pnpm-deduplicate 来分析出所有的重复依赖,并通过升级依赖或声明 pnpm overrides 进行版本合并。
    npx pnpm-deduplicate --list
    • 如果你在使用 yarn,可以使用 yarn-deduplicate 来自动合并重复依赖:
    npx yarn-deduplicate && yarn

    使用更轻量的库

    建议将项目中体积较大的三方库替换为更轻量的库,比如将 moment 替换为 day.js。

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

    BUNDLE_ANALYZE=true pnpm build

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

    提升 Browserslist 范围

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

    Modern.js 默认的 output.overrideBrowserslist 配置为:

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

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

    ['Chrome >= 100'];
    Tip

    请阅读 Browserslist 配置 章节来了解更多关于 Browserslist 的用法。

    按需引入 polyfill

    在明确第三方依赖不需要额外 polyfill 的情况下,你可以将 output.polyfill 设置为 usage。

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

    export default {
      output: {
        polyfill: 'usage',
      },
    };
    Tip

    请阅读 浏览器兼容性 章节来了解更多关于 polyfill 的用法。

    使用图片压缩

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

    modern.config.ts
    import { pluginImageCompress } from '@rsbuild/plugin-image-compress';
    
    export default {
      builderPlugins: [pluginImageCompress()],
    };

    详见 Image Compress 插件。

    代码拆包

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

    在 Modern.js 中内置了多种拆包策略,可以满足大部分应用的需求,你也可以根据自己的业务场景,自定义拆包配置。