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 插件,比如:

ViteRsbuild
@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-copyoutput.copy
vite-plugin-node-polyfills@rsbuild/plugin-node-polyfill
vite-plugin-solid@rsbuild/plugin-solid
@preact/preset-vite@rsbuild/plugin-preact

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

配置迁移

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

ViteRsbuild
rootroot
modemode
baseserver.base
definesource.define
appTypeserver.historyApiFallback
pluginsplugins
envDirEnv Directory
cacheDirbuildCache
publicDirserver.publicDir
assetsIncludesource.assetsInclude
resolve.aliasresolve.alias
resolve.deduperesolve.dedupe
resolve.extensionsresolve.extensions
resolve.conditionstools.rspack.resolve.conditionNames
resolve.mainFieldstools.rspack.resolve.mainFields
resolve.preserveSymlinkstools.rspack.resolve.symlinks
html.cspNoncesecurity.nonce
css.modulesoutput.cssModules
css.postcsstools.postcss
css.preprocessorOptions.sasspluginSass
css.preprocessorOptions.lesspluginLess
css.preprocessorOptions.styluspluginStylus
css.devSourcemapoutput.sourceMap
css.lightningcsstools.lightningcssLoader
server.host, preview.hostserver.host
server.port, preview.portserver.port
server.cors, preview.corsserver.cors
server.strictPort, preview.strictPortserver.strictPort
server.https, preview.httpsserver.https
server.open, preview.openserver.open
server.proxy, preview.proxyserver.proxy
server.headers, preview.headersserver.headers
server.hmrdev.hmr, dev.client
server.middlewareModeserver.middlewareMode
build.target, build.cssTargetBrowserslist
build.outDir, build.assetsDiroutput.distPath
build.assetsInlineLimitoutput.dataUriLimit
build.cssMinifyoutput.minify
build.sourcemapoutput.sourceMap
build.libUse Rslib
build.manifestoutput.manifest
build.ssrEmitAssetsoutput.emitAssets
build.minify, build.terserOptionsoutput.minify
build.emptyOutDiroutput.cleanDistPath
build.copyPublicDirserver.publicDir
build.reportCompressedSizeperformance.printFileSize
ssr, workerenvironments

说明:

  • 上述表格尚未覆盖到 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 的插件 API 覆盖了大部分的 Vite 和 Rollup 插件 hooks,例如:

Vite 插件 hooksRsbuild 插件 API
resolveIdresolve
transformtransform
configmodifyRsbuildConfig
configResolvedgetNormalizedConfig
configureServeronBeforeStartDevServer
buildStartonBeforeBuild, onBeforeStartDevServer
buildEndonAfterBuild, onCloseDevServer
closeBundleonCloseBuild, onCloseDevServer

请参考 插件系统 文档来了解更多。

验证结果

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

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

内容补充

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

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