Vite

Vite 是一个优秀和强大的构建工具,在某些情况下,你可能需要将一个 Vite 应用迁移到 Rsbuild,那么你可以参考这篇指南进行操作。

安装依赖

首先你需要把 Vite 相关的 npm 依赖替换为 Rsbuild 的依赖。

  • 移除 Vite 的依赖:
npm
yarn
pnpm
bun
npm remove vite
  • 安装 Rsbuild 的依赖:
npm
yarn
pnpm
bun
npm add @rsbuild/core -D

更新 npm scripts

下一步,你需要把 package.json 中的 npm scripts 更新为 Rsbuild 的 CLI 命令。

package.json
{
  "scripts": {
-   "dev": "vite",
-   "build": "vite build",
-   "preview": "vite preview"
+   "dev": "rsbuild dev",
+   "build": "rsbuild build",
+   "preview": "rsbuild preview"
  }
}

创建配置文件

在 package.json 的同级目录下创建 Rsbuild 的配置文件 rsbuild.config.ts,并添加以下内容:

rsbuild.config.ts
import { defineConfig } from '@rsbuild/core';

export default defineConfig({
  plugins: [],
});

构建入口

Rsbuild 与 Vite 默认的构建入口不同,Vite 使用 index.html 作为默认入口,而 Rsbuild 使用 src/index.js

从 Vite 迁移到 Rsbuild 时,你可以使用 Rsbuild 提供的 source.entry 来设置构建入口,html.template 来设置模板。

以一个新建的 Vite 项目为例,首先删除 index.html 中的 <script> 标签:

index.html
- <script type="module" src="/src/main.ts"></script>

然后添加如下配置即可。

rsbuild.config.ts
export default {
  html: {
    template: './index.html',
  },
  source: {
    entry: {
      index: './src/main.ts',
    },
  },
};

Rsbuild 会在构建时自动注入 <script> 标签到生成的 HTML 文件中。

迁移插件

大部分常见的 Vite 插件可以轻松地迁移到 Rsbuild 插件,比如:

Vite Rsbuild
@vitejs/plugin-react @rsbuild/plugin-react
@vitejs/plugin-react-swc @rsbuild/plugin-react
@vitejs/plugin-vue @rsbuild/plugin-vue
@vitejs/plugin-vue2 @rsbuild/plugin-vue2
@vitejs/plugin-vue-jsx @rsbuild/plugin-vue-jsx
@vitejs/plugin-vue2-jsx @rsbuild/plugin-vue2-jsx
@vitejs/plugin-basic-ssl @rsbuild/plugin-basic-ssl
@vitejs/plugin-legacy 无须使用,详见 浏览器兼容性
@sveltejs/vite-plugin-svelte @rsbuild/plugin-svelte
vite-plugin-svgr @rsbuild/plugin-svgr
vite-plugin-checker @rsbuild/plugin-type-check
vite-plugin-eslint @rsbuild/plugin-eslint
vite-plugin-static-copy output.copy
vite-plugin-node-polyfills @rsbuild/plugin-node-polyfill
vite-plugin-solid @rsbuild/plugin-solid

你可以参考 插件列表 来了解更多可用的插件。

配置迁移

以下是 Vite 配置对应的 Rsbuild 配置:

Vite Rsbuild
root root
mode mode
base server.base
define source.define
plugins plugins
envDir Env Directory
publicDir server.publicDir
assetsInclude source.assetsInclude
resolve.alias source.alias
resolve.conditions tools.rspack.resolve.conditionNames
resolve.mainFields tools.rspack.resolve.mainFields
resolve.extensions tools.rspack.resolve.extensions
resolve.preserveSymlinks tools.rspack.resolve.symlinks
html.cspNonce security.nonce
css.modules output.cssModules
css.postcss tools.postcss
css.preprocessorOptions.sass pluginSass
css.preprocessorOptions.less pluginLess
css.preprocessorOptions.stylus pluginStylus
css.devSourcemap output.sourceMap
css.lightningcss tools.lightningcssLoader
server.host, preview.host server.host
server.port, preview.port server.port
server.strictPort, preview.strictPort server.strictPort
server.https, preview.https server.https
server.open, preview.open server.open
server.proxy, preview.cors server.proxy
server.headers, preview.headers server.headers
server.hmr dev.hmr, dev.client
build.target, build.cssTarget Browserslist
build.outDir, build.assetsDir output.distPath
build.assetsInlineLimit output.dataUriLimit
build.cssMinify output.minify
build.sourcemap output.sourceMap
build.lib Use Rslib
build.manifest output.manifest
build.ssrEmitAssets output.emitAssets
build.minify, build.terserOptions output.minify
build.emptyOutDir output.cleanDistPath
build.copyPublicDir server.publicDir
build.reportCompressedSize performance.printFileSize
ssr, worker environments

说明:

  • 上述表格尚未覆盖到 Vite 的所有配置,欢迎补充。

环境变量

Vite 默认会将 VITE_ 开头的环境变量注入到 client 代码中,而 Rsbuild 默认会注入 PUBLIC_ 开头的环境变量(参考 public 变量)。

为了兼容 Vite 的行为,你可以手动调用 Rsbuild 提供的 loadEnv 方法来读取 VITE_ 开头的环境变量,并通过 source.define 配置项注入到 client 代码中。

rsbuild.config.ts
import { defineConfig, loadEnv } from '@rsbuild/core';

const { publicVars } = loadEnv({ prefixes: ['VITE_'] });

export default defineConfig({
  source: {
    define: publicVars,
  },
});

Rsbuild 默认注入了以下 环境变量

  • import.meta.env.MODE
  • import.meta.env.BASE_URL
  • import.meta.env.PROD
  • import.meta.env.DEV

对于 import.meta.env.SSR,你可以通过 environmentssource.define 配置项来设置:

rsbuild.config.ts
export default defineConfig({
  environments: {
    web: {
      source: {
        define: {
          'import.meta.env.SSR': JSON.stringify(false),
        },
      },
    },
    node: {
      source: {
        define: {
          'import.meta.env.SSR': JSON.stringify(true),
        },
      },
      output: {
        target: 'node',
      },
    },
  },
});

预设类型

Vite 通过 vite-env.d.ts 文件提供了一些预设的类型定义,迁移到 Rsbuild 时,你可以使用 @rsbuild/core 提供的 预设类型

src/env.d.ts
- /// <reference types="vite/client" />
+ /// <reference types="@rsbuild/core/types" />

Glob Import

Vite 提供了 import.meta.glob() 来批量导入模块。

迁移到 Rsbuild 时,你可以使用 Rspack 的 import.meta.webpackContext 函数代替:

  • Vite:
const modules = import.meta.glob('./dir/*.js');

for (const path in modules) {
  modules[path]().then((mod) => {
    console.log(path, mod);
  });
}
  • Rsbuild:
const context = import.meta.webpackContext('./dir', {
  // 是否搜索子目录
  recursive: false,
  regExp: /\.js$/,
});

for (const path of context.keys()) {
  const mod = context(path);
  console.log(path, mod);
}

验证结果

完成以上步骤后,你已经完成了从 Vite 到 Rsbuild 的基本迁移,此时可以执行 npm run dev 命令来尝试启动开发服务器。

如果在构建过程中发现问题,请根据错误日志进行调试,或者查看 Vite 配置,检查是否有一些必须的配置未被迁移到 Rsbuild。

内容补充

当前文档只涵盖了迁移过程的部分事项,如果你发现有合适的内容可以补充,欢迎通过 pull request 来完善文档 🤝。

Rsbuild 的文档位于 rsbuild/website 目录。