> For AI agents: the complete documentation index is available at /zh/llms.txt, the full documentation bundle is available at /zh/llms-full.txt.

# Vite

本章节介绍如何将 Vite 项目迁移到 Rsbuild。

## 安装依赖

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

- 移除 Vite 的依赖：


```sh [npm]
npm remove vite
```

```sh [yarn]
yarn remove vite
```

```sh [pnpm]
pnpm remove vite
```

```sh [bun]
bun remove vite
```

```sh [deno]
deno remove npm:vite
```

- 安装 Rsbuild 的依赖：


```sh [npm]
npm add @rsbuild/core -D
```

```sh [yarn]
yarn add @rsbuild/core -D
```

```sh [pnpm]
pnpm add @rsbuild/core -D
```

```sh [bun]
bun add @rsbuild/core -D
```

```sh [deno]
deno add npm:@rsbuild/core -D
```

## 测试工具

Vitest 使用 Vite 转换和运行测试，因此在继续使用 Vitest 时，请保留 Vite 以及 `vitest.config.*` 引用的所有 Vite 插件。若要从测试工具链中移除 Vite，可以迁移到 [Rstest](https://rstest.rs/)，它能够通过 `@rstest/adapter-rsbuild` 复用 Rsbuild 配置。有关必需的配置和测试 API 变更，请参考[测试](/zh/guide/advanced/testing.md)指南和 [Rstest 迁移指南](https://rstest.rs/zh/guide/migration/vitest)。

仅在确认没有其他开发工具或依赖仍需要 Vite 后，再将其移除。

## TanStack Start

TanStack Start 管理 client 和 server entry、部署产物及框架特定插件。请参考专门的 [TanStack Start 迁移指南](/zh/guide/migration/tanstack-start.md)，而非本页下方通用的构建入口步骤。

## 更新 npm scripts

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

```json title="package.json"
{
  "scripts": {
    "dev": "vite", // [!code --]
    "build": "vite build", // [!code --]
    "preview": "vite preview", // [!code --]
    "dev": "rsbuild", // [!code ++]
    "build": "rsbuild build", // [!code ++]
    "preview": "rsbuild preview" // [!code ++]
  }
}
```

## 创建配置文件

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

```ts title="rsbuild.config.ts"
import { defineConfig } from '@rsbuild/core';

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

## 构建入口 \{#build-entry}

Rsbuild 与 Vite 默认的构建入口不同，Vite 使用 `index.html` 作为默认入口，而 Rsbuild 会自动检测 `src/index.*` 模块，例如 `src/index.ts` 或 `src/index.js`。

从 Vite 迁移到 Rsbuild 时，你可以使用 Rsbuild 提供的 [source.entry](/zh/config/source/entry.md) 来设置构建入口，[html.template](/zh/config/html/template.md) 来设置模板。

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

```html title="index.html"
<!-- [!code --] -->
<script type="module" src="/src/main.ts"></script>
```

然后添加如下配置即可。

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

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

## 迁移插件 \{#migrating-plugins}

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

| Vite                                                                                       | Rsbuild                                                                                   |
| ------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------- |
| [@vitejs/plugin-react](https://npmjs.com/package/@vitejs/plugin-react)                     | [@rsbuild/plugin-react](/zh/plugins/list/plugin-react.md)                                 |
| [@vitejs/plugin-react-swc](https://npmjs.com/package/@vitejs/plugin-react-swc)             | [@rsbuild/plugin-react](/zh/plugins/list/plugin-react.md)                                 |
| [@tailwindcss/vite](https://npmjs.com/package/@tailwindcss/vite)                           | [@rsbuild/plugin-tailwindcss](/zh/plugins/list/plugin-tailwindcss.md)                     |
| [@vitejs/plugin-vue](https://npmjs.com/package/@vitejs/plugin-vue)                         | [@rsbuild/plugin-vue](/zh/plugins/list/plugin-vue.md)                                     |
| [@vitejs/plugin-vue2](https://npmjs.com/package/@vitejs/plugin-vue2)                       | [@rsbuild/plugin-vue2](https://github.com/rstackjs/rsbuild-plugin-vue2)                   |
| [@vitejs/plugin-vue-jsx](https://npmjs.com/package/@vitejs/plugin-vue-jsx)                 | [@rsbuild/plugin-vue-jsx](https://github.com/rstackjs/rsbuild-plugin-vue-jsx)             |
| [@vitejs/plugin-vue2-jsx](https://npmjs.com/package/@vitejs/plugin-vue2-jsx)               | [@rsbuild/plugin-vue2-jsx](https://github.com/rstackjs/rsbuild-plugin-vue2-jsx)           |
| [@vitejs/plugin-basic-ssl](https://npmjs.com/package/@vitejs/plugin-basic-ssl)             | [@rsbuild/plugin-basic-ssl](https://github.com/rstackjs/rsbuild-plugin-basic-ssl)         |
| [@vitejs/plugin-legacy](https://npmjs.com/package/@vitejs/plugin-legacy)                   | 无须使用，详见 [浏览器兼容性](/zh/guide/advanced/browser-compatibility.md)                             |
| [@sveltejs/vite-plugin-svelte](https://npmjs.com/package/@sveltejs/vite-plugin-svelte)     | [@rsbuild/plugin-svelte](/zh/plugins/list/plugin-svelte.md)                               |
| [vite-plugin-svgr](https://npmjs.com/package/vite-plugin-svgr)                             | [@rsbuild/plugin-svgr](/zh/plugins/list/plugin-svgr.md)                                   |
| [vite-plugin-checker](https://npmjs.com/package/vite-plugin-checker)                       | [@rsbuild/plugin-type-check](https://github.com/rstackjs/rsbuild-plugin-type-check)       |
| [vite-plugin-eslint](https://npmjs.com/package/vite-plugin-eslint)                         | [@rsbuild/plugin-eslint](https://github.com/rstackjs/rsbuild-plugin-eslint)               |
| [vite-plugin-static-copy](https://npmjs.com/package/vite-plugin-static-copy)               | [output.copy](/zh/config/output/copy.md)                                                  |
| [vite-plugin-node-polyfills](https://npmjs.com/package/vite-plugin-node-polyfills)         | [@rsbuild/plugin-node-polyfill](https://github.com/rstackjs/rsbuild-plugin-node-polyfill) |
| [vite-plugin-solid](https://npmjs.com/package/vite-plugin-solid)                           | [@rsbuild/plugin-solid](/zh/plugins/list/plugin-solid.md)                                 |
| [@preact/preset-vite](https://npmjs.com/package/@preact/preset-vite)                       | [@rsbuild/plugin-preact](/zh/plugins/list/plugin-preact.md)                               |
| [@tanstack/router-plugin/vite](https://npmjs.com/package/@tanstack/router-plugin)          | [@tanstack/router-plugin/rsbuild](https://npmjs.com/package/@tanstack/router-plugin)      |
| [@sentry/vite-plugin](https://npmjs.com/package/@sentry/vite-plugin)                       | [@sentry/webpack-plugin](https://npmjs.com/package/@sentry/webpack-plugin)                |
| [vite-plugin-full-reload](https://npmjs.com/package/vite-plugin-full-reload)               | [dev.watchFiles](/zh/config/dev/watch-files.md)                                           |
| [vite-plugin-html](https://npmjs.com/package/vite-plugin-html)                             | [html.template](/zh/config/html/template.md)                                              |
| [vite-plugin-css-injected-by-js](https://npmjs.com/package/vite-plugin-css-injected-by-js) | [output.injectStyles](/zh/config/output/inject-styles.md)                                 |

> 参考 [插件列表](/zh/plugins/list/index.md) 来了解更多可用的插件。

## 配置迁移 \{#config-migration}

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

| Vite                                   | Rsbuild                                                                                                       |
| -------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
| root                                   | [root](/zh/config/root.md)                                                                                    |
| mode                                   | [mode](/zh/config/mode.md)                                                                                    |
| base                                   | [server.base](/zh/config/server/base.md)                                                                      |
| define                                 | [source.define](/zh/config/source/define.md)                                                                  |
| appType                                | [server.historyApiFallback](/zh/config/server/history-api-fallback.md)                                        |
| plugins                                | [plugins](/zh/config/plugins.md)                                                                              |
| envDir                                 | [Env 目录](/zh/guide/advanced/env-vars.md#env-directory)                                                        |
| logLevel                               | [logLevel](/zh/config/log-level.md)                                                                           |
| cacheDir                               | [buildCache](/zh/config/performance/build-cache.md)                                                           |
| publicDir                              | [server.publicDir](/zh/config/server/public-dir.md)                                                           |
| customLogger                           | [customLogger](/zh/config/custom-logger.md)                                                                   |
| assetsInclude                          | [source.assetsInclude](/zh/config/source/assets-include.md)                                                   |
| resolve.alias                          | [resolve.alias](/zh/config/resolve/alias.md)                                                                  |
| resolve.dedupe                         | [resolve.dedupe](/zh/config/resolve/dedupe.md)                                                                |
| resolve.extensions                     | [resolve.extensions](/zh/config/resolve/extensions.md)                                                        |
| resolve.conditions                     | [resolve.conditionNames](/zh/config/resolve/condition-names.md)                                               |
| resolve.mainFields                     | [resolve.mainFields](/zh/config/resolve/main-fields.md)                                                       |
| resolve.preserveSymlinks               | [tools.rspack.resolve.symlinks](/zh/config/tools/rspack.md)                                                   |
| html.cspNonce                          | [security.nonce](/zh/config/security/nonce.md)                                                                |
| css.modules                            | [output.cssModules](/zh/config/output/css-modules.md)                                                         |
| css.postcss                            | [tools.postcss](/zh/config/tools/postcss.md)                                                                  |
| css.preprocessorOptions.sass           | [pluginSass](/zh/plugins/list/plugin-sass.md)                                                                 |
| css.preprocessorOptions.less           | [pluginLess](/zh/plugins/list/plugin-less.md)                                                                 |
| css.preprocessorOptions.stylus         | [pluginStylus](https://github.com/rstackjs/rsbuild-plugin-stylus)                                             |
| css.devSourcemap                       | [output.sourceMap](/zh/config/output/source-map.md)                                                           |
| css.lightningcss                       | [tools.lightningcssLoader](/zh/config/tools/lightningcss-loader.md)                                           |
| server.host, preview\.host             | [server.host](/zh/config/server/host.md)                                                                      |
| server.port, preview\.port             | [server.port](/zh/config/server/port.md)                                                                      |
| server.cors, preview\.cors             | [server.cors](/zh/config/server/cors.md)                                                                      |
| server.strictPort, preview\.strictPort | [server.strictPort](/zh/config/server/strict-port.md)                                                         |
| server.https, preview\.https           | [server.https](/zh/config/server/https.md)                                                                    |
| server.open, preview\.open             | [server.open](/zh/config/server/open.md)                                                                      |
| server.proxy, preview\.proxy           | [server.proxy](/zh/config/server/proxy.md)                                                                    |
| server.headers, preview\.headers       | [server.headers](/zh/config/server/headers.md)                                                                |
| server.hmr                             | [dev.hmr](/zh/config/dev/hmr.md), [dev.client](/zh/config/dev/client.md)                                      |
| server.middlewareMode                  | [server.middlewareMode](/zh/config/server/middleware-mode.md)                                                 |
| build.target, build.cssTarget          | [Browserslist](/zh/guide/advanced/browserslist.md)                                                            |
| build.outDir, build.assetsDir          | [output.distPath](/zh/config/output/dist-path.md)                                                             |
| build.assetsInlineLimit                | [output.dataUriLimit](/zh/config/output/data-uri-limit.md)                                                    |
| build.cssMinify                        | [output.minify](/zh/config/output/minify.md)                                                                  |
| build.sourcemap                        | [output.sourceMap](/zh/config/output/source-map.md)                                                           |
| build.lib                              | 使用 [Rslib](https://github.com/web-infra-dev/rslib)                                                            |
| build.manifest                         | [output.manifest](/zh/config/output/manifest.md)                                                              |
| build.ssrEmitAssets                    | [output.emitAssets](/zh/config/output/emit-assets.md)                                                         |
| build.minify, build.terserOptions      | [output.minify](/zh/config/output/minify.md)                                                                  |
| build.emptyOutDir                      | [output.cleanDistPath](/zh/config/output/clean-dist-path.md)                                                  |
| build.copyPublicDir                    | [server.publicDir](/zh/config/server/public-dir.md)                                                           |
| build.reportCompressedSize             | [performance.printFileSize](/zh/config/performance/print-file-size.md)                                        |
| ssr.external                           | [output.autoExternal](/zh/config/output/auto-external.md), [output.externals](/zh/config/output/externals.md) |
| ssr.noExternal                         | [output.autoExternal.exclude](/zh/config/output/auto-external.md#exclude)                                     |
| ssr, worker                            | [environments](/zh/config/environments.md)                                                                    |

说明：

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

## 服务器端口

Vite 开发服务器的默认端口是 `5173`，而 Rsbuild 的默认端口是 `3000`。如果你的项目依赖 `5173`，可以通过以下配置保持 Vite 原有的端口：

```ts title="rsbuild.config.ts"
export default {
  server: {
    port: 5173,
  },
};
```

## 环境变量 \{#environment-variables}

Vite 默认会将 `VITE_` 开头的环境变量注入到 client 代码中，而 Rsbuild 默认会注入 `PUBLIC_` 开头的环境变量（参考 [public 变量](/zh/guide/advanced/env-vars.md#public-variables)）。请在 `.env` 文件、部署配置和应用代码中重命名 client 环境变量：

```diff
- VITE_API_URL
+ PUBLIC_API_URL
```

Rsbuild 默认注入了以下 [环境变量](/zh/guide/advanced/env-vars.md)：

- `import.meta.env.MODE`
- `import.meta.env.BASE_URL`
- `import.meta.env.PROD`
- `import.meta.env.DEV`
- `import.meta.env.SSR`

## 预设类型

Vite 通过 `vite/client` 提供了一些预设的类型定义，迁移到 Rsbuild 时，你可以将它替换为 `@rsbuild/core` 提供的 [预设类型](/zh/guide/basic/typescript.md#preset-types)：

```json title="tsconfig.json"
{
  "compilerOptions": {
    "types": ["vite/client"], // [!code --]
    "types": ["@rsbuild/core/types"] // [!code ++]
  }
}
```

## Web Workers

从 Vite 的 worker query 导入迁移到 Rsbuild 时，Rsbuild 支持 `?worker` 和 `?worker&inline`：

```ts
import Worker from './worker.ts?worker';
import InlineWorker from './worker.ts?worker&inline';
```

Rsbuild 不支持 Vite 的 `?worker&url` query 后缀。如果你使用它来创建 dedicated worker，可以迁移为标准的 `new Worker()` 构造器语法：

```ts
const worker = new Worker(new URL('./worker.ts', import.meta.url), {
  type: 'module',
});
```

Rsbuild 也不支持 Vite 的 `?sharedworker`、`?sharedworker&inline` 或 `?sharedworker&url` query 后缀。为了保留 shared worker 的行为，请使用标准的 `new SharedWorker()` 构造器语法：

```ts
const sharedWorker = new SharedWorker(new URL('./worker.ts', import.meta.url), {
  type: 'module',
});
```

构造器语法也允许你传入标准的 `WorkerOptions` 或 `SharedWorkerOptions`，例如 `name`、`type` 和 `credentials`。更多用法请参考 [Web Workers](/zh/guide/basic/web-workers.md)。

## Glob import

Rsbuild >= 2.0.8 已兼容 [import.meta.glob()](https://rspack.rs/zh/api/runtime-api/module-variables#importmetaglob)，因此从 Vite 迁移到 Rsbuild 时可以保留原有代码。

## vite-tsconfig-paths

Rsbuild 开箱即用地支持 TypeScript 的 `paths` 选项作为 alias 别名，因此你可以直接移除 `vite-tsconfig-paths` 依赖。

参考 [路径别名](/zh/guide/advanced/alias.md) 来了解更多。

## 迁移 Vite 插件

参考 [Vite 插件](/zh/guide/migration/vite-plugin.md) 了解如何迁移 Vite 插件。

## 验证结果

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

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

## 内容补充

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

> Rsbuild 的文档位于 [rsbuild/website](https://github.com/web-infra-dev/rsbuild/tree/main/website) 目录。
