Skip to content

Vite 8.1 发布:实验性打包开发模式与 Wasm ESM 支持 ​

译注:本文翻译自 Vite 官方博客 2026 年 6 月 23 日发布的《Vite 8.1 is out!》,原文链接见文末。为便于中文开发者阅读,部分表述做了本地化调整,技术细节以原文为准。

Vite 8 于今年 3 月发布,带来了由 Rolldown 驱动的单一统一打包器,为进一步改进打开了空间。目前 Vite 的周下载量已达 4160 万次,几乎追平 Vite 7 的累计下载量。在修复升级回归问题的同时,团队也在推进新功能开发,并正式发布 Vite 8.1。

你可以通过 vite.new 在线体验 Vite 8.1,或在本地使用 pnpm create vite 搭配任意框架脚手架创建项目。更多信息可查阅《Getting Started Guide》。

实验性打包开发模式(Bundled Dev Mode) ​

Vite 8.1 引入了实验性的打包开发模式支持,此前被称为「Full Bundle Mode」。该模式旨在改善因模块数量过多而性能受损的大型应用。

在初期测试中,一个加载 1 万个 React 组件的应用,打包开发模式相比非打包开发服务器实现了约 15 倍的启动速度和 10 倍的全页刷新速度,同时无论应用规模如何,HMR 都保持即时响应。真实应用的早期测试也显示出类似收益:Linear 团队观察到冷启动渲染最高快 3 倍,全量刷新约快 40%,网络请求数减少 10 倍。

为什么需要打包开发模式? ​

Vite 以非打包开发服务器著称,这也是它早期速度与流行度的重要原因。这种方式最初是一个实验,用来探索在不做传统打包的前提下,开发服务器性能究竟能推到多远。然而随着项目规模和复杂度增长,非打包开发方式在开发阶段的性能退化变得明显:由于每个模块单独请求,浏览器需要处理大量请求,增加了启动和刷新开销。这一问题在大型应用中尤为突出,当开发者处于网络代理之后时更为严重,导致刷新变慢、开发体验下降。

打包开发模式让打包文件不仅在生产环境、也在开发阶段被使用,从而兼顾两者优势:

  • 即使是大型应用也能快速启动
  • 减少页面刷新时的网络开销
  • 在 ESM 输出之上保持高效的 HMR

目前该模式聚焦浏览器端、基础插件与主要功能。如果使用第三方插件,可能无法兼容;如果使用次要功能,也可能表现不佳。团队正在扩展支持范围,并准备一份文档说明插件侧可能需要做的改动。更多路线图细节可参见设计文档。

启用该模式,可以传入 --experimental-bundle,或在 vite.config.js 中添加 experimental.bundledDev: true:

js
// vite.config.js
import { defineConfig } from 'vite'

export default defineConfig({
  experimental: {
    bundledDev: true,
  },
})

欢迎在讨论区反馈意见。

实验性 Chunk Import Map ​

在输出产物中,chunk 的 import 语句会包含该 chunk 的哈希,以确保 chunk 内容变化时能加载新版本。但这也会导致引用该 chunk 的 chunk 哈希发生变化,并级联影响到所有传递引用它的 chunk。

实验性的 chunk import map 功能利用 import maps 解决了这一问题,提升了缓存效率。该功能构建在 Rolldown 的能力之上,并增加了对 Vite 特有功能的支持。特别感谢 Taisei Mima 的研究与初步实现。

需要注意的是,experimental.renderBuiltUrl 目前与该选项不兼容。更多细节参见指南与选项文档,欢迎在讨论区反馈。

Wasm ESM 集成支持 ​

Vite 现已支持 Wasm ESM integration 提案。你现在可以直接导入 wasm 文件并使用其导出的函数:

ts
import { add } from './add.wasm'

console.log(add(1, 2)) // 3

感谢 Menci 在该提案早期阶段创建并维护 vite-plugin-wasm,并将实现上游贡献到 Vite 核心。更多细节参见指南。

距离默认使用 Lightning CSS 更近一步 ​

团队与 Lightning CSS 团队合作,补齐了 PostCSS 支持但 Lightning CSS 缺失的功能。Vite 8.1 现已具备以下两项能力:

  • 允许在 CSS 文件中导入外部 CSS 文件(lightningcss#479)
  • 由插件注册文件依赖(lightningcss#877)

团队正在考虑在下一个大版本中将默认 CSS 预处理器切换为 Lightning CSS。你可以通过 css.transformer: 'lightningcss' 试用,并在讨论区反馈。

import.meta.glob 支持大小写不敏感匹配 ​

import.meta.glob 现在支持 caseSensitive 选项,可进行大小写不敏感的文件匹配:

ts
// 匹配 ./dir/Module1.js
const modules = import.meta.glob('./dir/module*.js', {
  caseSensitive: false,
})

自定义 HTML 元素与属性的资源发现 ​

此前 Vite 只会为预定义的元素和属性发现资源。现在可以通过 html.additionalAssetSources 选项添加更多元素与属性:

html
<html-import src="./some/other/file.html"></html-import>
<img
  src="/layout-default.png"
  data-src-dark="/layout-dark.png"
  data-src-light="/layout-light.png"
/>
js
// vite.config.js
import { defineConfig } from 'vite'

export default defineConfig({
  html: {
    additionalAssetSources: {
      'html-import': {
        srcAttributes: ['src'],
      },
      img: {
        srcAttributes: ['data-src-dark', 'data-src-light'],
      },
    },
  },
})

其他变更 ​

其他功能与缺陷修复请查阅 Changelog。

致谢 ​

Vite 8.1 的发布离不开社区贡献者、生态维护者以及 Vite 团队的努力。Vite 由 VoidZero 出品,并与 Bolt 和 Nuxt Labs 合作。同时感谢 Vite 在 GitHub Sponsors 与 Open Collective 上的赞助者。

原文链接 ​

https://vite.dev/blog/announcing-vite8-1