从Webpack到Vite:我们迁移了一个10万行代码的项目,总结了这7个坑

一、为什么要迁?我们当时的痛点

项目技术栈:React 18 + TypeScript + Ant Design + less。Webpack配置经过多人"迭代",已经变得极其复杂:各种loader、plugin、alias、proxy,还有自定义的打包分析脚本。

痛点:

  • 开发服务器启动:45秒起步,同事可以泡杯咖啡
  • 热更新:改一行代码,等待3秒才刷新
  • 生产构建:6分钟,CI经常超时
  • 配置维护:没人敢动webpack.config.js,一动就崩

我们调研了Vite,开发服务器启动秒级、HMR极快、配置简单。决定迁移。

二、迁移过程与踩坑记录

坑1:环境变量不兼容

Webpack用process.env注入变量,Vite用import.meta.env。全局搜索替换容易遗漏,特别是第三方库中使用了process.env。

解决 :用@vitejs/plugin-react自带的define配置,手动映射:

js 复制代码
// vite.config.js
export default defineConfig({
  define: {
    'process.env': process.env
  }
})

但这样会打包所有环境变量,有安全风险。建议只映射需要的:'process.env.API_URL': JSON.stringify(process.env.API_URL)。

坑2:CommonJS模块不兼容

Vite默认只支持ESM,但node_modules里有大量CommonJS模块。比如@ant-design/charts、moment等。

现象 :提示Module not found或require is not defined。

解决:

  1. 先用vite-plugin-commonjs(已废弃),官方推荐optimizeDeps.include:
js 复制代码
optimizeDeps: {
  include: ['@ant-design/charts', 'moment']
}
  1. 实在不行,在build.rollupOptions中配置@rollup/plugin-commonjs。

坑3:less全局变量失效

Webpack中我们用less-loader的modifyVars全局注入主题变量。Vite不支持这种写法。

解决 :用vite-plugin-style-import或直接修改vite配置的css预处理器选项:

js 复制代码
css: {
  preprocessorOptions: {
    less: {
      modifyVars: { '@primary-color': '#1890ff' },
      javascriptEnabled: true
    }
  }
}

但这样只对组件库有效,自己写的less文件还需要手动@import全局变量文件。

坑4:动态导入路径问题

代码中大量使用import(@/pages/${pageName}/index)动态导入。Vite要求动态路径必须静态可分析。

现象 :构建时提示The requested module '...' does not provide an export named 'default'。

解决 :改用const modules = import.meta.glob('./pages/**/index.tsx'),然后手动匹配。

坑5:代理重写规则不一致

Webpack的devServer.proxy和Vite的server.proxy配置方式不同,特别是路径重写和Cookie的secure选项。

解决:仔细对照文档,测试所有接口。我们花了大半天才把所有代理规则调通。

坑6:多页应用配置

我们的项目是多页应用(多个入口)。Webpack用entry: { a: './src/a.tsx', b: './src/b.tsx' },Vite原生不支持多页。

解决 :使用vite-plugin-html或手动配置build.rollupOptions.input:

js 复制代码
build: {
  rollupOptions: {
    input: {
      a: resolve(__dirname, 'src/a.html'),
      b: resolve(__dirname, 'src/b.html')
    }
  }
}

坑7:生产构建后路由404

Vite构建后,HTML中的资源路径默认是绝对路径/assets/...,如果部署在子目录下会404。

解决 :设置base: './'(相对路径)或根据部署路径动态设置。

三、迁移后的收益

经过两周折腾,我们终于成功迁移。对比数据:

指标 Webpack Vite 提升
开发服务器启动 45秒 1.2秒 37倍
热更新时间(首次) 3秒 0.1秒 30倍
生产构建时间 6分20秒 1分50秒 3.4倍
配置文件行数 180行 45行 -75%
依赖安装大小 420MB 380MB -10%

团队开发体验大幅提升,同事不再抱怨"等编译"。

四、迁移建议

如果你也在考虑迁移,几点建议:

  1. 评估项目复杂度 :如果项目大量使用Webpack特有插件(如DefinePlugin、ProvidePlugin),迁移成本高。
  2. 先跑demo:拿一个最小模块试水,验证可行性。
  3. 渐进迁移:不用一次性全切,可以先用Vite开发,生产构建仍用Webpack,逐步替换。
  4. 备好回滚方案:迁移期间保留原Webpack配置,出问题随时切回。
  5. 团队培训:Vite的HMR机制、环境变量、动态导入与Webpack不同,团队要统一学习。

五、最后

Vite不是银弹,但它确实解决了Webpack在开发体验上的痛点。如果你的项目也深受启动慢、热更新卡顿的困扰,不妨一试。

你们团队在用Vite吗?迁移中遇到过什么坑?点个赞让更多需要的人看到。

相关推荐
康小汪12 分钟前
AI 写 Vue 总写成同一个味道:给它装 Skills,装的不是知识是边界
前端·vue.js·人工智能·ai编程·最佳实践
智能运维指南1 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
白山编程大哥3 小时前
Java 后端如何优雅地把 List 集合返回给前端
java·前端·list
Flynt3 小时前
我把热榜那篇"禁用 axios"逐条实测了一遍:结论大体对,坑在它没讲的地方
前端·javascript·axios
Csvn4 小时前
bundle优化
前端
北冥有鱼4 小时前
发版后动态路由点击报 `Failed to fetch dynamically imported module`」问题上的完整排查与修复过程
前端·vue.js
静默回滚4 小时前
视频压到 25 MB 以内,码率要算、音轨要扣、余量要留
前端
用户37203749260185 小时前
把 10MB 中文语义模型塞进浏览器:STSB 做到教师模型的 93%,但线上 top1 只有 42%
前端
光锥智能5 小时前
海康机器人举行2026移动机器人新品发布会:箱式存拣升级,「明智」系列发布
java·前端·机器人
计算机魔术师5 小时前
Anthropic 上市文件最吓人的一幕,不是亏损 807 亿
前端