logo
  • 指南
  • 配置
  • 插件
  • API
  • 示例
  • 社区
  • Modern.js 2.x 文档
  • 简体中文
    • 简体中文
    • English
    • 开始
      介绍
      快速上手
      版本升级
      名词解释
      技术栈
      核心概念
      页面入口
      构建工具
      Web 服务器
      基础功能
      路由
      路由基础
      配置式路由
      数据管理
      数据获取
      数据写入
      数据缓存
      渲染
      服务端渲染(SSR)
      服务端流式渲染(Streaming SSR)
      渲染缓存
      静态站点生成(SSG)
      渲染预处理 (Render Preprocessing)
      样式开发
      引入 CSS
      使用 CSS Modules
      使用 CSS-in-JS
      使用 Tailwind CSS
      HTML 模板
      引用静态资源
      引用 JSON 文件
      引用 SVG 资源
      引用 Wasm 资源
      调试
      数据模拟(Mock)
      网络代理
      使用 Rsdoctor
      使用 Storybook
      测试
      Playwright
      Vitest
      Jest
      Cypress
      路径别名
      环境变量
      构建产物目录
      部署应用
      进阶功能
      使用 Rspack
      使用 BFF
      基础用法
      运行时框架
      扩展 BFF Server
      扩展一体化调用 SDK
      文件上传
      跨项目调用
      优化页面性能
      代码分割
      静态资源内联
      产物体积优化
      React Compiler
      提升构建性能
      浏览器兼容性
      配置底层工具
      源码构建模式
      服务端监控
      Monitors
      日志事件
      指标事件
      国际化
      基础概念
      快速开始
      配置说明
      语言检测
      资源加载
      路由集成
      API 参考
      高级用法
      最佳实践
      自定义 Web Server
      专题详解
      模块联邦
      简介
      开始使用
      应用级别模块
      服务端渲染
      部署
      集成国际化能力
      常见问题
      依赖安装问题
      命令行问题
      构建相关问题
      热更新问题
      已下线功能
      📝 编辑此页面
      上一页静态资源内联下一页React Compiler

      #产物体积优化

      产物体积的优化在生产环境中是非常重要的,因为它直接影响到了线上的用户体验。在这篇文档中,我们将介绍在 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

      详见 performance.bundleAnalyze 配置项。

      #提升 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 中内置了多种拆包策略,可以满足大部分应用的需求,你也可以根据自己的业务场景,自定义拆包配置。

      比如将 node_modules 下的 axios 库拆分到 axios.js 中:

      export default {
        performance: {
          chunkSplit: {
            strategy: 'split-by-experience',
            forceSplitting: {
              axios: /node_modules\/axios/,
            },
          },
        },
      };