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

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

相关推荐
Highcharts.js3 小时前
企业级可视化生态系统|关于Highcharts集成的前端框架、后端编程语言与生态
开发语言·javascript·python·前端框架·编辑器·编程语言·highcharts
陈随易3 小时前
Lerna-Lite 5.0发布解析
前端·后端·程序员
于慨1 天前
Lambda 表达式、方法引用(Method Reference)语法
java·前端·servlet
石小石Orz1 天前
油猴脚本实现生产环境加载本地qiankun子应用
前端·架构
从前慢丶1 天前
前端交互规范(Web 端)
前端
像我这样帅的人丶你还1 天前
别再让JS耽误你进步了。
css·vue.js
@yanyu6661 天前
07-引入element布局及spring boot完善后端
javascript·vue.js·spring boot
CHU7290351 天前
便捷约玩,沉浸推理:线上剧本杀APP功能版块设计详解
前端·小程序
GISer_Jing1 天前
Page-agent MCP结构
前端·人工智能