Vite 团队官宣 Vite 5.1 正式上线。
Vite(法语意为 "快速的",发音/vit/,发音同 "veet")是一种新型前端构建工具,能够显著提升前端开发体验。它主要由两部分组成:
Vite 提供了强大的扩展性,可通过其插件 API和JavaScript API进行扩展,并提供完整的类型支持。
![]()
Vite 运行时 API
Vite 5.1 新增了对全新 Vite Runtime API 的实验性支持。它允许首先使用 Vite 插件处理任何代码,然后再运行。这与server.ssrLoadModule截然不同,因为运行时实现与服务器解耦了。这使得库和框架作者可以在服务器和运行时之间实现自己的通信层。全新的 Vite Runtime API 旨在稳定后,取代 Vite 现在的 SSR primitives(服务端渲染原语)。
全新的 Vite Runtime API 带来了一大波龙年福利:
-
SSR 期间支持 HMR(热模块替换)
-
它与服务器解耦,因此没有限制可以使用单个服务器的客户端数量,每个客户端都有自己的模块缓存,我们甚至可以按照个人喜好与其通信,包括但不限于使用消息信道/fetch调用/直接的函数调用/websocket。
-
它不依赖任何node/bun/deno的内置 API,因此可以在任何环境中运行。
-
它可以轻而易举地与具有自己的运行代码机制的工具集成,举个栗子,我们可以提供一个运行程序,使用eval取代new AsyncFunction。
初始想法由 P.P. 提出,并由 AntFu 作为vite-node包实现,驱动了 Nuxt 3 Dev SSR,后来也作为 Vitest 的基建。所以vite-node的整体思想已经经过“路遥知码力”的长期考验。此乃 V.S. 对 API 的全新迭代,它已经在 Vitest 中重现了vite-node,并在将其集成到 Vite 核心库时痛改前非,使 Vite Runtime API 更灵活给力。此 PR(拉取请求)已经沉淀了整整一年。
功能
改进了.css?url的支持
将 CSS 文件作为 URL 导入现在可以码到成功。此乃 Remix 向 Vite 迁移的最后一个阻碍。
build.assetsInlineLimit现在支持回调
用户现在可以提供一个返回布尔值的回调函数,选用或弃用特定资源的内联。如果返回了undefined,那就应用默认逻辑。
改进了循环导入的 HMR
在 Vite 5.0 中,循环导入中接受的模块总是会触发整页重载,即使它们可以在客户端被妥善处理。现在此问题已经放飞自我,允许在无需重载整页时应用 HMR,但如果在 HMR 期间发生任何错误,页面则会重载。
支持ssr.external: true外部化所有 SSR 包
从历史上看,除了链接包之外,Vite 会外部化所有软件包。这个全新的ssr.external: true选项可用于强制外部化所有包,包括链接包。在我们想模拟所有外部包的常见情况的 monorepos(多库开发)测试中,这十分方便,或者当使用ssrLoadModule加载任意文件,且我们希望始终使用外部包时,因为我们不关心 HMR。
在预览服务器中暴露close方法
预览服务器现在暴露了一个close方法,该方法会妥善拆除服务器,包括所有开启的 socket(套接字)连接。
性能优化
Vite 每次发布都变得越来越快,且 Vite 5.1 充满了性能优化。我们使用vite-dev-server-perf测量了 Vite 4.0 以来所有次版本的 10K 模块(25层深度树)加载时间。这是一个衡量 Vite 无打包方案效果的优秀基准测试。每个模块都是一个携带计数器的迷你 TS 文件,并导入到模块树中的其他文件,因此这主要测量对单独模块执行请求的时间开销。在 Vite 4.0 中,在轻薄游戏本上加载 10K 模块耗时8秒。我们在聚焦性能的 Vite 4.3 更胜一筹,我们能在6.35秒内加载它们。在 Vite 5.1 中,我们又双叒叕实现了性能飞跃。Vite 现在可以在5.35秒内服务 10K 模块。
![]()
该基准测试的结果在 Headless Puppeteer 上运行,这是版本跑分的优秀方案。但它们并不代表用户的经历时长。当在 Chrome 的隐身窗口中运行相同数量的 10K 模块时,如下所示:
| 10K 模块 |
Vite 5.0 |
Vite 5.1 |
| 加载时间 |
2892ms |
2765ms |
| 加载时间(缓存) |
2778ms |
2477ms |
| 完全重载 |
2003ms |
1878ms |
| 完全重载(缓存) |
1682ms |
1604ms |
在线程中运行 CSS 预处理器
Vite 现在可选择支持在线程中运行 CSS 预处理器。我们可以使用css.preprocessorMaxWorkers: true启用它。对于 Vuetify 2 项目,启用此功能后,开发启动时间狂跌 40%。
改进服务器冷启动的新选项
我们可以设置optimizeDeps.holdUntilCrawlEnd: false切换到新型依赖优化策略,这可能有助于大型项目。我们正在考虑将来默认切换到此策略。
缓存检查更快解析
fs.cachedChecks优化现在默认启用。在 Windows 中,tryFsResolve的速度爆涨约14倍,并且在三角基准测试中解析 id 的速度全面爆涨约5倍。
内部性能优化
开发服务器的性能斩获了若干增量提升。一个新型中间件可以在 304 时短路。我们避免了热路径的parseRequest。Rollup 现已被正确懒加载。
废弃功能
我们会继续尽量减少 Vite 的 API 接口,使 Vite 能够长期维护。
已弃用import.meta.glob的as选项
标准已移至import Attributes(导入属性),但我们目前不打算使用新选项取代as。相反,我们建议用户切换到query。
移除的实验性构建时预打包
构建时预打包是 Vite 3 增加的一项实验性功能,现已被移除。随着 Rollup 4 将其解析器切换到原生,且 Rolldown 正在研发中,此功能的性能和开发与构建不一致的情况都不再有效。我们希望继续改良开发/构建的一致性,并得出结论,使用 Rolldown 进行“开发时预打包”和“生产构建”是更优选择。Rolldown 还可能在构建时实现缓存,这比依赖预打包更高效。
来源:https://mp.weixin.qq.com/s/bEQbMjK22y3UlbM-zqoERw