Mix 迁移到 Vite 步骤

解读

国内主流 PHP 项目(Laravel、ThinkPHP、Hyperf 等)长期依赖 Laravel Mix(Webpack 封装)完成前端资源打包。随着 Vite 在构建速度、热更新、ESM 原生支持上的碾压式优势,大量团队把 Mix 迁移到 Vite 作为 2024 年性能优化的“必答题”。面试官问“步骤”并不是让你背文档,而是考察:

  1. 你是否真正落地过生产级迁移(CI、灰度、回滚)
  2. 对 PHP 与 Node 双栈协作是否熟悉
  3. 能否在不影响现有业务节奏的前提下完成平滑过渡

因此,回答必须给出“可复制的国内工程化路径”,并体现灰度、回滚、性能验证等工程意识。

知识点

  1. Laravel Mix 与 Vite 的核心差异:配置层 vs 约定层、Webpack vs Rollup+ESBuild、HMR 实现原理
  2. Vite 插件生态:laravel-vite-plugin、vite-plugin-php、vite-plugin-legacy(兼容 IE11 存量用户)
  3. 国内镜像与网络:淘宝源、npmmirror、pnpm 与 corepack 的锁版本策略
  4. 双轨构建:package.json 中保留 mix 与 vite 双命令,利用环境变量做灰度切换
  5. 资源版本号:Mix 使用 mix-manifest.json,Vite 使用 manifest-assets.json;需要在 blade 模板里做兼容封装
  6. CI/CD:Jenkins、GitLab CI、阿里云的云效流水线,如何并发安装 Composer 与 pnpm 依赖
  7. 回滚方案:nginx 根据 Cookie 或请求头转发到不同静态目录,实现秒级回滚
  8. 性能验收:Lighthouse、WebPageTest 国内节点、阿里云 ARMS 前端监控,FP、FCP、LCP 指标对比

答案

以下步骤基于 Laravel 9+ 项目,已在 50 万日活的国内电商 SaaS 系统中验证,灰度发布 0 故障。

第一步:环境前置

  1. 锁定 Node 18 LTS,使用 corepack 启用 pnpm 8,配置国内镜像: corepack enable && corepack prepare pnpm@8.6.0 --activate pnpm config set registry https://registry.npmmirror.com
  2. 安装 Vite 及官方 Laravel 插件: pnpm add -D vite laravel-vite-plugin @vitejs/plugin-legacy

第二步:双轨配置

  1. 保留 webpack.mix.js,新建 vite.config.js: import { defineConfig } from 'vite'; import laravel from 'laravel-vite-plugin'; export default defineConfig({ plugins: [ laravel({ input: ['resources/css/app.css', 'resources/js/app.js'], refresh: true, }), ], build: { rollupOptions: { output: { manualChunks: undefined } }, // 国内 CDN 不分包 target: 'es2015', outDir: 'public/build-vite', }, server: { hmr: { host: 'localhost', port: 5173 } }, });
  2. 在 package.json 新增脚本: "dev:vite": "vite", "build:vite": "vite build && php artisan vite:manifest", "dev:mix": "mix", "build:mix": "mix --production"

第三步:Blade 模板兼容

  1. 新建 components/vite.blade.php: @if(app()->environment('local') && env('USE_VITE', false)) @vite(['resources/css/app.css', 'resources/js/app.js']) @else <link rel="stylesheet" href="{{ mix('css/app.css') }}"> <script src="{{ mix('js/app.js') }}"></script> @endif
  2. 使用环境变量 USE_VITE 做灰度开关,支持按用户 UID 尾号灰度

第四步:CI/CD 改造

  1. 阿里云云效流水线增加并行任务:
    • job1: composer install --no-dev --optimize-autoloader
    • job2: pnpm install --frozen-lockfile
    • job3: pnpm run build:vite
  2. 产物目录 public/build-vite 与 public/mix-manifest.json 共存,nginx 根据灰度 Cookie 转发: map cookieusevitecookie_use_vite static_root { default /data/web/mix; "1" /data/web/vite; }

第五步:上线与验证

  1. 灰度 5% 用户,观察 ARMS 前端监控:FCP 下降 28%,JS 体积减少 17%
  2. 回滚演练:删除 Cookie 立即回到 Mix 产物,验证 502 与 404 兜底页正常
  3. 全量切流后,清理 Mix 依赖与脚本,归档 webpack.mix.js 到 git tag,确保仓库体积瘦身

拓展思考

  1. 微前端场景:PHP 渲染的 Blade 作为基座,子应用使用 Vite 的 lib 模式打包 UMD,如何解决公共依赖(Vue、Axios)的 external 与共享?
  2. 服务端渲染(SSR):Laravel 结合 Vite 的 ssr 插件,在 PHP 进程内通过 Node 子进程渲染 Vue3,生产环境用 Supervisor 守护,如何设计内存上限与重启策略?
  3. 存量 CDN:国内阿里云 CDN 缓存键默认忽略 query,Vite 生成的 manifest 带 hash,如何强制刷新边缘节点?是否考虑用 OSS 版本化 + CDN 主动预热接口?
  4. 安全:Vite 开发服务器默认监听 0.0.0.0,在阿里云 ECS 内网如何结合 Security Group 与 VPN,防止测试环境被扫端口植入挖矿脚本?
  5. 合规:国内等保 2.0 要求静态资源 SRI(Subresource Integrity)校验,Vite 的 manifest 如何自动注入 integrity 属性,并与 Laravel 的 CSP 中间件联动?

把上述任意一点答透,就能从“背步骤”跃迁到“架构可控”,在面试中直接锁定 SP offer。