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
      专题详解
      模块联邦
      简介
      开始使用
      应用级别模块
      服务端渲染
      部署
      集成国际化能力
      常见问题
      依赖安装问题
      命令行问题
      构建相关问题
      热更新问题
      已下线功能
      📝 编辑此页面
      上一页部署应用下一页使用 BFF

      #使用 Rspack

      Rspack - 高性能 Web 构建工具

      Rspack 是一个基于 Rust 编写的高性能 JavaScript 打包工具, 它提供对 webpack 生态良好的兼容性,能够无缝替换 webpack, 并提供闪电般的构建速度。

      相较于 webpack,Rspack 的构建性能有明显提升,除了 Rust 带来的语言优势,这也来自于它的并行架构和增量编译等特性。经过 benchmark 验证,Rspack 可以带来 5 ~ 10 倍编译性能的提升。

      Modern.js 提供开箱即用的 Rspack 支持,你可以在成熟的 webpack 和更快的 Rspack 之间进行切换。

      这篇文档会向你介绍如何在 Modern.js 中开启 Rspack 构建模式。

      #初始化 Rspack 项目

      Modern.js 新项目已默认启用 Rspack 构建,只需执行 初始化项目,即可创建一个 Rspack 项目:

      $ npx @modern-js/create@latest myapp
      ? 请选择开发语言:TS
      ? 请选择包管理工具:pnpm

      项目创建完成后,在项目中执行 pnpm run dev 即可体验项目,更多信息可参考快速上手。

      #注意事项

      在使用 Rspack 前,你需要了解以下事项:

      • Rspack 能够兼容大部分 webpack 插件和几乎所有的 loaders,但仍有少数 webpack 插件暂时无法使用,详见 Plugin 兼容。
      • Rspack 默认基于 SWC 进行代码编译和压缩,在个别情况下,你可能会遇到 SWC 在边界场景的 bug,可以通过 SWC 的 issue 反馈。

      #配置迁移

      Modern.js 中 tools.rspack 和 tools.bundlerChain 配置在 Rspack 模式下生效。如果你之前使用的是 webpack 模式,开启 Rspack 构建能力后,可根据实际使用场景决定是否修改为 tools.rspack 或 tools.bundlerChain。

      export default {
        tools: {
      -   webpack: (config, { env }) => {
      +   rspack: (config, { env }) => {
            if (env === 'development') {
              config.devtool = 'cheap-module-eval-source-map';
            }
            return config;
          },
      -   webpackChain: (chain, { env }) => {
      +   bundlerChain: (chain, { env }) => {
            if (env === 'development') {
              chain.devtool('cheap-module-eval-source-map');
            }
          },
        },
      };

      #修改转译配置

      Modern.js 在 Rspack 模式下使用 Rspack builtin:swc-loader 进行代码转译。

      Modern.js 已对 builtin:swc-loader 的常见配置提供了更方便的配置方式,如:通过 source.transformImport 配置组件库按需引入。如果对 builtin:swc-loader 有自定义配置的需求,可通过 tools.swc 进行配置:

      import { defineConfig } from '@modern-js/app-tools';
      
      export default defineConfig({
        tools: {
          swc: {
            jsc: {
              externalHelpers: false,
            },
          },
        },
      });
      Tip

      在启用 Rspack 构建时,babel-loader 默认不会被启用。如需添加 babel 插件,可通过 tools.babel 配置,此时会产生额外的编译开销,在一定程度上拖慢 Rspack 构建速度。

      #Rspack 和 Modern.js 的版本关系

      通常情况下,Modern.js 内会集成 Rspack 的最新版本,通过 npx modern upgrade 即可将当前项目中的 Modern.js 相关依赖以及内置的 Rspack 更新至最新版本。

      但 Modern.js 对于 Rspack 的依赖方式为锁版本方式(非自动升级),由于发版周期不同步等原因,可能会出现 Modern.js 内集成的 Rspack 版本落后于 Rspack 最新版本的情况。

      当你执行 dev / build 命令时,Modern.js 会在开启调试模式时自动打印当前使用的 Rspack 版本:

      rspack_version_log

      #修改内置 Rspack 版本

      可以使用 pnpm / yarn / npm 等包管理工具自带的依赖升级功能来将 Rspack 强制升级到指定版本。

      以 pnpm 为例,可通过 overrides 修改内置的 Rspack 版本。假设需要指定 Rspack 的版本为 0.7.5:

      package.json
      {
        "pnpm": {
          "overrides": {
            "@rspack/binding": "0.7.5",
            "@rspack/core": "0.7.5",
            "@rspack/plugin-react-refresh": "0.7.5"
          }
        }
      }

      如果需要使用 Rspack 的 nightly/canary 版本,Rspack 的 nightly/canary 版本的包名会在增加 -canary 后缀之后发布,需要修改为:

      package.json
      {
        "pnpm": {
          "overrides": {
            "@rspack/binding": "npm:@rspack/binding-canary@nightly",
            "@rspack/core": "npm:@rspack/core-canary@nightly",
            "@rspack/plugin-react-refresh": "npm:@rspack/plugin-react-refresh@nightly"
          },
          "peerDependencyRules": {
            "allowAny": ["@rspack/*"]
          }
        }
      }

      Rspack 提供了 install-rspack 工具来快速修改 Rspack 版本:

      npx install-rspack --version nightly # nightly npm tag
      npx install-rspack --version 0.7.5-canary-d614005-20240625082730 # A specific canary version
      Nightly 版本介绍

      每天,Rspack 会自动构建基于最新代码的 nightly 版本,用于测试和及早发现错误。 通常情况下,这些版本是可用的。如果发现问题,我们会及时进行修复。但如果 Rspack 有一些 breaking change、需要 Modern.js 同步修改代码,那么我们建议等待下一个 Modern.js 版本再进行更新。

      如果想了解其他包管理工具锁定依赖版本的示例,可以参考:锁定子依赖。