本章节介绍如何将 Vite 项目迁移到 Rsbuild。
首先你需要把 Vite 相关的 npm 依赖替换为 Rsbuild 的依赖。
npm remove vitenpm add @rsbuild/core -D下一步,你需要把 package.json 中的 npm scripts 更新为 Rsbuild 的 CLI 命令。
{
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"dev": "rsbuild dev",
"build": "rsbuild build",
"preview": "rsbuild preview"
}
}在 package.json 的同级目录下创建 Rsbuild 的配置文件 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> 标签:
<script type="module" src="/src/main.ts"></script>然后添加如下配置即可。
export default {
html: {
template: './index.html',
},
source: {
entry: {
index: './src/main.ts',
},
},
};Rsbuild 会在构建时自动注入 <script> 标签到生成的 HTML 文件中。
大部分常见的 Vite 插件可以轻松地迁移到 Rsbuild 插件,比如:
你可以参考 插件列表 来了解更多可用的插件。
以下是 Vite 配置对应的 Rsbuild 配置:
| Vite | Rsbuild |
|---|---|
| root | root |
| mode | mode |
| base | server.base |
| define | source.define |
| appType | server.historyApiFallback |
| plugins | plugins |
| envDir | Env Directory |
| logLevel | logLevel |
| cacheDir | buildCache |
| publicDir | server.publicDir |
| assetsInclude | source.assetsInclude |
| resolve.alias | resolve.alias |
| resolve.dedupe | resolve.dedupe |
| resolve.extensions | resolve.extensions |
| resolve.conditions | resolve.conditionNames |
| resolve.mainFields | resolve.mainFields |
| 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.cors, preview.cors | server.cors |
| server.strictPort, preview.strictPort | server.strictPort |
| server.https, preview.https | server.https |
| server.open, preview.open | server.open |
| server.proxy, preview.proxy | server.proxy |
| server.headers, preview.headers | server.headers |
| server.hmr | dev.hmr, dev.client |
| server.middlewareMode | server.middlewareMode |
| 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_ 开头的环境变量注入到 client 代码中,而 Rsbuild 默认会注入 PUBLIC_ 开头的环境变量(参考 public 变量)。
为了兼容 Vite 的行为,你可以手动调用 Rsbuild 提供的 loadEnv 方法来读取 VITE_ 开头的环境变量,并通过 source.define 配置项注入到 client 代码中。
import { defineConfig, loadEnv } from '@rsbuild/core';
const { publicVars } = loadEnv({ prefixes: ['VITE_'] });
export default defineConfig({
source: {
define: publicVars,
},
});Rsbuild 默认注入了以下 环境变量:
import.meta.env.MODEimport.meta.env.BASE_URLimport.meta.env.PRODimport.meta.env.DEV对于 import.meta.env.SSR,你可以通过 environments 和 source.define 配置项来设置:
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 提供的 预设类型:
/// <reference types="vite/client" />
/// <reference types="@rsbuild/core/types" />Vite 提供了 import.meta.glob() 来批量导入模块。
迁移到 Rsbuild 时,你可以使用 Rspack 的 import.meta.webpackContext 函数代替:
const modules = import.meta.glob('./dir/*.js');
for (const path in modules) {
modules[path]().then((mod) => {
console.log(path, mod);
});
}const context = import.meta.webpackContext('./dir', {
// 是否搜索子目录
recursive: false,
regExp: /\.js$/,
});
for (const path of context.keys()) {
const mod = context(path);
console.log(path, mod);
}Rsbuild 开箱即用地支持 TypeScript 的 paths 选项作为 alias 别名,因此你可以直接移除 vite-tsconfig-paths 依赖。
参考 路径别名 来了解更多。
参考 Vite 插件 了解如何迁移 Vite 插件。
完成以上步骤后,你已经完成了从 Vite 到 Rsbuild 的基本迁移,此时可以执行 npm run dev 命令来尝试启动开发服务器。
如果在构建过程中发现问题,请根据错误日志进行调试,或者查看 Vite 配置,检查是否有一些必须的配置未被迁移到 Rsbuild。
当前文档只涵盖了迁移过程的部分事项,如果你发现有合适的内容可以补充,欢迎通过 pull request 来完善文档 🤝。
Rsbuild 的文档位于 rsbuild/website 目录。