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

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

相关推荐
@PHARAOH21 小时前
WHAT - cursor cli 开发范式
前端·ai·ai编程
子兮曰1 天前
深入 HTML-in-Canvas:当 Canvas 学会了渲染 DOM,前端图形生态要变天了
前端·javascript·canvas
ws_qy1 天前
从大模型原理到前端 AI Coding 工程化实践
前端·ai编程
倾颜1 天前
React 19 源码主线拆解 04:Fiber 到底是什么,React 为什么需要 Fiber?
前端·react.js·源码阅读
AI攻城狮1 天前
国产大模型能力大比拼,社区有话说
前端
IT_陈寒1 天前
Vite的public文件夹放静态资源?这坑我替你踩了
前端·人工智能·后端
涵涵(互关)1 天前
GoView各项目文件中的相关语法2
前端·javascript·vue.js
子兮曰1 天前
别让爬虫白嫖你的导航站了:纯免费,手把手实现加密字体防爬
前端·javascript·后端
小村儿1 天前
连载06 - Hooks 源码深度解析:Claude Code 的确定性自动化体系
前端·后端·ai编程
心中无石马1 天前
uniapp引入tailwindcss4.x
前端·css·uni-app