Vite 8 全面 Rust 化!vue3-element-admin 升级实战,构建提速 65%

Vite 7 (39.59s) Vite 8 优化后 (13.65s)

实测:vue3-element-admin(3157 模块),构建时间提升 ~65%


Vite 8 于 2026年3月12日 正式发布,核心构建引擎全面切换为 Rust 编写的 Rolldown。本文记录 vue3-element-admin 从 Vite 7 升级到 Vite 8 的完整配置变更和性能对比。

相关源码vue3-element-admin

官方文档Vite 8 发布公告 · 迁移指南


Vite 8 架构变更

构建工具对比

组件 Vite 7 Vite 8
开发/生产打包 esbuild + Rollup Rolldown
JavaScript 转换 esbuild Oxc
JS 压缩 Terser / esbuild Oxc Minifier
CSS 压缩 esbuild Lightning CSS

Vite 7 存在"双工具"问题:开发用 esbuild,生产用 Rollup,行为不一致。Vite 8 使用 Rolldown 统一两者,彻底解决"开发正常、生产报错"的痛点。

行业案例 :Linear 团队报告构建时间从 46 秒降至 6 秒,提升约 87%


配置迁移

完整对比

Vite 7 配置:

typescript 复制代码
import { resolve } from "path";
import { name, version, engines, dependencies, devDependencies } from "./package.json";

const __APP_INFO__ = {
  pkg: { name, version, engines, dependencies, devDependencies },
  buildTimestamp: Date.now(),
};

const pathSrc = resolve(__dirname, "src");

export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
  const env = loadEnv(mode, process.cwd());
  const isProduction = mode === "production";

  return {
    resolve: {
      alias: { "@": pathSrc },
    },
    // ...其他配置不变

    build: {
      chunkSizeWarningLimit: 2000,
      reportCompressedSize: false,
      minify: isProduction ? "terser" : false,
      terserOptions: isProduction
        ? {
            compress: {
              drop_console: true,
              drop_debugger: true,
            },
          }
        : undefined,
      rollupOptions: {
        output: {
          entryFileNames: "js/[name].[hash].js",
          chunkFileNames: "js/[name].[hash].js",
          assetFileNames: (assetInfo: any) => {
            if (!assetInfo.name) {
              return "assets/[name].[hash][extname]";
            }
            const info = assetInfo.name.split(".");
            let extType = info[info.length - 1];
            if (/\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/i.test(assetInfo.name)) {
              extType = "media";
            } else if (/\.(png|jpe?g|gif|svg)(\?.*)?$/.test(assetInfo.name)) {
              extType = "img";
            } else if (/\.(woff2?|eot|ttf|otf)(\?.*)?$/i.test(assetInfo.name)) {
              extType = "fonts";
            }
            return `${extType}/[name].[hash].[ext]`;
          },
        },
      },
    },
  };
});

Vite 8 配置:

typescript 复制代码
import { resolve } from "path";
import { name, version } from "./package.json";

const __APP_INFO__ = {
  pkg: { name, version },
  buildTimestamp: Date.now(),
};

// ESM 模式下使用 import.meta.dirname(Node 20.11+)
const pathSrc = resolve(import.meta.dirname, "src");

export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
  const env = loadEnv(mode, process.cwd());

  return {
    resolve: {
      alias: { "@": pathSrc },
    },
    // ...其他配置不变

    // 构建配置(Vite 8 使用 Rolldown + Oxc)
    build: {
      chunkSizeWarningLimit: 1000,
      reportCompressedSize: false,
      cssMinify: "lightningcss",
      // minify 默认使用 'oxc',压缩速度比 terser 快 30-90 倍
      rolldownOptions: {
        output: {
          entryFileNames: "js/[name].[hash].js",
          chunkFileNames: "js/[name].[hash].js",
          assetFileNames: (assetInfo: any) => {
            if (!assetInfo.name) {
              return "assets/[name].[hash][extname]";
            }
            const info = assetInfo.name.split(".");
            let extType = info[info.length - 1];
            if (/\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/i.test(assetInfo.name)) {
              extType = "media";
            } else if (/\.(png|jpe?g|gif|svg)(\?.*)?$/.test(assetInfo.name)) {
              extType = "img";
            } else if (/\.(woff2?|eot|ttf|otf)(\?.*)?$/i.test(assetInfo.name)) {
              extType = "fonts";
            }
            return `${extType}/[name].[hash].[ext]`;
          },
        },
      },
    },
  };
});

迁移要点

变更项 Vite 7 Vite 8 说明
打包器选项 rollupOptions rolldownOptions Rollup 已弃用,改用 Rolldown
JS 压缩 minify: "terser" 默认 oxc(可省略) 比 Terser 快 30-90 倍
Terser 配置 terserOptions: { drop_console } 删除 Oxc 暂不支持,改用代码规范约束
CSS 压缩 esbuild(默认) cssMinify: "lightningcss" Rust 编写,更快
ESM 路径 __dirname import.meta.dirname CJS 变量在 ESM 中不存在

性能对比

生产构建耗时

基于 vue3-element-admin 项目实测(3157 模块),多次构建验证:

版本 第 1 次 第 2 次 第 3 次 平均 提升
Vite 7 38.27s 38.35s 37.59s 38.07s -
Vite 8 13.43s 12.99s 13.10s 13.17s ~66%

构建耗时截图:

Vite 7 Vite 8

打包体积

类型 Vite 7 Vite 8 变化
最大 JS 1,284 kB 1,015 kB -21%
最大 CSS 770 kB 705 kB -8%

插件耗时分析

Vite 8 构建日志中的 PLUGIN_TIMINGS 揭示了耗时分布:

插件 耗时占比
unocss:global:build:scan 34-44%
vite:css 13-15%
unocss:global:build:generate 13-18%
unocss:transformers:pre 6-9%

UnoCSS 是当前构建的主要瓶颈,占比超过 50%。如果项目 UnoCSS 规则较多,可考虑精简 uno.config.ts 中的规则来进一步加速。

性能提升原理

Rolldown 统一开发生产

Vite 7 使用 esbuild 开发、Rollup 生产,存在行为差异。Vite 8 统一使用 Rolldown,零转换开销。

Rust vs JavaScript

Rolldown 用 Rust 编写,相比 JavaScript 的 Rollup:

  • 无 JIT 预热,直接执行
  • 无 GC 停顿
  • 原生多线程,充分利用多核 CPU

Oxc 替代 Terser

Oxc Minifier 同样是 Rust 编写,压缩速度比 Terser 快 30-90 倍,压缩率仅低 0.5%-2%。


常见问题

插件不兼容

复制代码
Error: Plugin xxx is not compatible with Vite 8

解决方案:检查插件是否有 Vite 8 兼容版本,或暂时锁定 Vite 版本等待插件更新。

CommonJS 模块导入错误

复制代码
Error: require() of ES Module

解决方案

typescript 复制代码
export default defineConfig({
  legacy: {
    inconsistentCjsInterop: true,
  },
});

CSS 处理差异

Lightning CSS 处理某些 CSS 语法可能与 esbuild 不同,如遇到问题可检查 CSS 语法兼容性。

卸载 terser

Vite 8 默认使用 Oxc 压缩,不再需要 terser 依赖:

bash 复制代码
pnpm remove terser

升级验证

bash 复制代码
# 1. 清理缓存和依赖
rm -rf node_modules .vite
pnpm install

# 2. 启动开发服务器
pnpm dev

# 3. 类型检查
pnpm type-check

# 4. 生产构建
pnpm build

# 5. 预览构建结果
pnpm preview

总结

Vite 8 通过全面拥抱 Rust 生态(Rolldown、Oxc、Lightning CSS),实现了质的飞跃。基于 vue3-element-admin 项目实测:

指标 Vite 7 Vite 8 变化
构建时间 39.59s 13.65s -65%
最大 JS 体积 1,284 kB 1,015 kB -21%
最大 CSS 体积 770 kB 705 kB -8%

配置迁移简单,核心改动 5 项,收益显著,推荐升级。


相关开源项目:

项目 简介
vue3-element-admin Vue 3 + Element Plus 权限管理系统
youlai-boot Spring Boot 4 后端权限系统

在线体验https://vue.youlai.tech

如果本文对你有帮助,欢迎点赞收藏,如有问题欢迎评论区交流。

相关推荐
LaughingZhu6 小时前
Product Hunt 每日热榜 | 2026-05-21
前端·人工智能·经验分享·chatgpt·html
怕浪猫6 小时前
Electron 开发实战(一):从零入门核心基础与环境搭建
前端·electron·ai编程
小鹏linux7 小时前
Ubuntu 22.04 部署开源免费具有精美现代web页面的Casdoor账号管理系统
linux·前端·ubuntu·开源·堡垒机
前端若水8 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
Bigger8 小时前
mini-cc:一个轻量级 AI 编程助手的诞生
前端·ai编程·claude
涵涵(互关)8 小时前
Naive-ui树型选择器只显示根节点
前端·ui·vue
BY组态8 小时前
Ricon组态系统最佳实践:从零开始构建物联网监控平台
前端·物联网·iot·web组态·组态
BY组态8 小时前
Ricon组态系统vs传统组态软件:为什么选择新一代Web组态平台
前端·物联网·iot·web组态·组态
SoaringHeart8 小时前
Flutter进阶:OverlayEntry 插入图层管理器 NOverlayZIndexManager
前端·flutter
放下华子我只抽RuiKe58 小时前
React 从入门到生产(四):自定义 Hook
前端·javascript·人工智能·深度学习·react.js·自然语言处理·前端框架