平滑迁移Vite的关键是理解其ESM-first逻辑而非替换工具:开发时按需编译、无全量构建,需适配CommonJS、环境变量、插件等差异,分步迁移并验证启动、HMR与构建。

平滑迁移的关键不是“替换工具”,而是理解 Vite 的运行逻辑——它不打包,只按需编译;不依赖 loader,而是靠浏览器原生 ESM 加载源码。迁移过程要围绕这个核心做适配,而不是照搬 Webpack 的配置思路。
先理清差异再动手
Webpack 是 bundle-first(先打包再服务),Vite 是 ESM-first(浏览器直接 import 源文件)。这意味着:
- 开发时没有“全量构建”阶段,启动快、HMR 精准,但 CommonJS 模块、动态路径、全局变量注入等 Webpack 习以为常的写法,在 Vite 中会报错或失效
- Vite 不处理
require、module.exports、require.context,也不支持process.env直接读取环境变量 - 插件生态不互通:Webpack 的
html-webpack-plugin、mini-css-extract-plugin等没有直接对应物,需改用vite-plugin-html、@vitejs/plugin-legacy或 Rollup 插件
分步迁移实操要点
不必一步到位,可按模块渐进切换,降低风险:
-
入口与 HTML:把
public/index.html移到项目根目录,删掉 Webpack 特有占位符(如<%= BASE_URL %>),Vite 会自动注入脚本标签 -
配置重写:删除
webpack.config.js,新建vite.config.ts,用resolve.alias配置别名(注意路径必须是path.resolve绝对路径),用server.proxy替代devServer.proxy -
环境变量迁移:所有
.env文件中需暴露给前端的变量,必须以VITE_开头;代码中将process.env.VITE_API_URL改为import.meta.env.VITE_API_URL -
静态资源与样式:CSS 预处理器(Less/Sass)直接写在
css.preprocessorOptions里;全局 less 变量用modifyVars配置;图片等资源优先用import方式引入,public/下文件仍可通过绝对路径访问
常见卡点与解法
这些地方最容易出问题,提前扫描能省大量调试时间:
立即学习“Java免费学习笔记(深入)”;
-
CommonJS 模块报错:如
moment、@ant-design/charts提示require is not defined,在vite.config.ts的optimizeDeps.include中显式列出它们,让 Vite 预构建 -
动态导入失败:类似
import(`./pages/${name}/index.tsx`)会被拒绝,改用import.meta.glob('./pages/**/index.tsx')预加载所有匹配模块,再按需取用 -
第三方库类型缺失:某些包没提供 TS 声明,可在
src/shims-xxx.d.ts中手动声明,或加// @ts-ignore临时跳过(上线前补全) -
构建产物路径变化:Vite 默认输出到
dist/,若 CI/CD 脚本硬编码了 Webpack 的build/,记得同步更新
验证与收尾建议
迁移不是改完配置就结束,要验证真实体验:
- 对比冷启动时间:Vite 应该在 1 秒内完成
vite dev启动,否则检查是否有插件阻塞或optimizeDeps漏配 - 测试 HMR:修改一个组件,观察是否仅该模块刷新,且无白屏或状态丢失
- 跑通生产构建:
vite build后用vite preview检查路由、API 请求、静态资源是否全部正常 - 保留 Webpack 构建脚本一段时间,作为回滚兜底;等团队熟悉 Vite 行为后再彻底移除


















