Vite 5.0 正式发布

news2024/11/26 8:59:14

11 月 16 日,Vite 5.0 正式发布,这是 Vite 道路上的又一个重要里程碑!Vite 现在使用 Rollup 4,这已经代表了构建性能的大幅提升。此外,还有一些新的选项可以改善开发服务器性能。

Vite 4 发布于近一年前,它为生态系统奠定了坚实的基础。随着项目继续在共享基础设施上构建,每周 npm 下载量从 250 万跃升至 750 万。框架不断创新,除了 Astro、Nuxt、SvelteKit、Solid Start、Qwik City 等,还看到新的框架加入并使生态系统更加强大。RedwoodJS 和 Remix 转向 Vite 为 React 生态系统的进一步采用铺平了道路。Vitest 的增长速度甚至超过了 Vite。其团队一直在努力,很快将发布 Vitest 1.0。Vite 与 Storybook、Nx 和 Playwright 等其他工具一起使用的故事不断改进,环境也是如此,Vite 在 Deno 和 Bun 中都是可以使用的。

六个月前,Vite 4.3 版本发布。该版本显著提高了开发服务器的性能。然而,仍有很大的改进空间。在 ViteConf 上,尤雨溪公布了 Vite 的长期计划,即致力于开发 Rolldown,这是一个带有兼容 API 的 Rust 移植版的 Rollup。一旦准备就绪,打算在 Vite Core 中使用它来承担 Rollup 和 esbuild 的任务。这将意味着提高构建性能,并大大减少开发和构建之间的不一致。 Rolldown 目前处于早期阶段,团队正准备在年底前开源代码库。敬请关注!

Vite 5 专注于清理 API(删除不推荐使用的功能),并简化了解决长期问题的几个功能,例如切换定义以使用正确的 AST 替换而不是 regex。团队还将继续采取措施来实现未来的 Vite(Node.js 18+ 现在是必需的,CJS Node API 已被弃用)。

快速开始使用 Vite 5

可以使用 pnpm create vite 用喜欢的框架搭建 Vite 项目,或者使用 vite.new 在线打开启动模板来使用 Vite 5。还可以运行 pnpm create vite-extra 来访问其他框架和运行时(Solid、Deno、SSR 和库启动器)的模板。当在“其他”选项下运行 create vite 时,也可以使用 create vite-extra 模板。

注意,Vite 入门模板旨在用作使用不同框架测试 Vite 的平台。在构建下一个项目时,建议使用每个框架推荐的启动器。一些框架现在也将 create vite 重定向到它们的启动器(Vue 的 create-vue 和 Nuxt 3,以及 Svelte 的 SvelteKit)。

Node.js 支持

Vite 不再支持已 EOL 的 Node.js 14 / 16 / 17 / 19。现在需要 Node.js 18 / 20+。

性能

除了 Rollup 4 的构建性能改进之外,还有一个新指南可帮助你识别和修复常见性能问题:vitejs.dev/guide/perfo…

Vite 5 还引入了 server.warmup,这是一项改善启动时间的新功能。它允许定义应在服务器启动后立即进行预转换的模块列表。当使用 --openserver.open 时,Vite 还会自动预热应用的入口点或提供的 URL 以打开。

主要更新

Vite 现在由 Rollup 4 提供支持

Vite 现在使用 Rollup 4,它也带来了重大变化,包括:

  • Import assertions 已更名为 import attributes。
  • 不再支持 Acorn 插件。
  • 对于 Vite 插件,this.resolve的skipSelf选项现在默认为true
  • 对于 Vite 插件,this.parse目前仅支持allowReturnOutsideFunction选项。

CJS Node API 已被弃用

Vite 的 CJS Node API 已被弃用。当调用require('vite')时,现在会记录弃用警告。应该更新文件或框架,以导入 Vite 的 ESM 构建而不是 CJS 构建。

在基本的 Vite 项目中,请确保:

  • vite.config.js文件内容使用 ESM 语法。
  • 最接近的package.json文件包含"type": "module",或者使用.mjs扩展名,例如vite.config.mjs

对于其他项目,有一些常见的方法:

  • 将 ESM 配置为默认选项,根据需要选择 CJS:在项目的package.json中添加"type": "module"。所有*.js 文件现在都被解释为 ESM,并且需要使用 ESM 语法。可以将带有.cjs扩展名的文件重命名,以继续使用 CJS。
  • 将 CJS 配置为默认选项,根据需要选择 ESM:如果项目的package.json没有"type": "module",所有*.js文件都将被解释为 CJS。可以将带有.mjs扩展名的文件重命名,以使用 ESM。
  • 动态导入 Vite:如果需要继续使用 CJS,可以使用import('vite')进行动态导入 Vite。这需要代码以异步上下文编写,但由于 Vite 的 API 大多是异步的,因此应该仍然可以管理。

重新制定 define 和 import.meta.env.* 的替代策略

在 Vite 4 中,defineimport.meta.env.*功能在开发和构建中使用不同的替换策略:

  • 在开发环境中,这两个功能被注入为全局变量到globalThisimport.meta中。
  • 在构建环境中,这两个功能被静态地使用正则表达式替换。

这导致在尝试访问这些变量时出现开发环境和构建环境的不一致性,有时甚至会导致构建失败。例如:

// vite.config.js
export default defineConfig({
  define: {
    __APP_VERSION__: JSON.stringify('1.0.0'),
  },
})
const data = { __APP_VERSION__ }
// dev: { __APP_VERSION__: "1.0.0" } ✅
// build: { "1.0.0" } ❌

const docs = 'I like import.meta.env.MODE'
// dev: "I like import.meta.env.MODE" ✅
// build: "I like "production"" ❌

Vite 5 通过使用 esbuild 来处理构建中的替换,与开发行为保持一致。

这个改变不应该影响大多数设置,因为已经有文档说明define的值应该遵循 esbuild 的语法:

为了与 esbuild 的行为保持一致,表达式必须是一个 JSON 对象(null、boolean、number、string、array 或 object)或者一个单个的标识符。

然而,如果你更喜欢直接保持静态替换值,可以使用 @rollup/plugin-replace。

worker.plugins 现在是一个函数

在 Vite 4 中,worker.plugins接受一个插件数组((Plugin | Plugin[])[])。而在 Vite 5 中,它需要配置为一个返回插件数组的函数(() => (Plugin | Plugin[])[])。这个改变是为了使并行的工作器构建更加一致和可预测。

允许包含 . 的路径回退到 index.html

在 Vite 4 中,在开发环境中访问包含点"."的路径时,即使将appType设置为'spa'(默认值),也不会回退到index.html。而在 Vite 5 中,它将会回退到index.html

注意,如果将图像路径指向一个不存在的文件(例如<img src="./file-does-not-exist.png">),浏览器将不再在控制台中显示 404 错误消息。

统一开发和预览 HTML 服务行为

在 Vite 4 中,开发服务器和预览服务器根据目录结构和末尾斜杠来不同地提供 HTML 服务。这会导致在测试构建后的应用时出现不一致性。Vite 5 将重构成以下类似的单一行为,假设以下文件结构:

├── index.html
├── file.html
└── dir
    └── index.html

manifest 文件会在 .vite 目录中生成

默认情况下,Vite 4 中的清单文件(build.manifestbuild.ssrManifest)是在构建的根目录中生成的。

而从 Vite 5 开始,默认情况下它们将会生成在.build.outDir目录中的.vite目录中。这个改变有助于避免公共文件与相同的清单文件名在复制到build.outDir时发生冲突。

CLI 快捷方式需要额外的 Enter 键触发

现在,CLI 的快捷方式(例如r键重启开发服务器)需要额外按下Enter键才能触发快捷方式。例如,按下r键后再按Enter键来重启开发服务器。

这个改变防止 Vite 吞噬和控制特定于操作系统的快捷方式,使得将 Vite 开发服务器与其他进程结合使用时更加兼容。

更新experimentalDecoratorsuseDefineForClassFields在 TypeScript 中的行为

Vite 5 使用 esbuild 0.19,并移除了对 esbuild 0.18 的兼容层,这改变了 experimentalDecoratorsuseDefineForClassFields 的处理方式。

  • **experimentalDecorators**默认情况下是未启用的,需要在tsconfig.json中将compilerOptions.experimentalDecorators设置为true才能使用装饰器。
  • **useDefineForClassFields**的默认值取决于 TypeScript 的目标值,如果目标不是ESNextES2022或更新版本,或者没有tsconfig.json文件,则useDefineForClassFields将默认为false,这可能会导致问题,因为默认的esbuild.target值是esnext。它可能会转译为静态初始化块,而这在浏览器中可能不被支持。

因此,建议在配置 tsconfig.json时将目标设置为ESNextES2022或更新版本,或者显式将useDefineForClassFields设置为true

{
  "compilerOptions": {
    // 如果使用装饰器,设置为true
    "experimentalDecorators": true,
    // 如果在浏览器中看到解析错误,设置为true
    "useDefineForClassFields": true
  }
}

移除--https标志和https: true

-https标志在内部设置了server.https: truepreview.https: true。这个配置原本是用来与 Vite 3 中取消的自动 https 证书生成功能一起使用的。因此,这个配置不再有用,因为它会启动一个没有证书的 Vite HTTPS 服务器。

如果使用的是@vitejs/plugin-basic-sslvite-plugin-mkcert,它们已经在内部设置了 https 配置,所以可以在设置中移除--httpsserver.https: truepreview.https: true

移除resolvePackageEntryresolvePackageData API

resolvePackageEntryresolvePackageData API 已被移除,因为它们暴露了 Vite 的内部结构,并阻碍了过去 Vite 4.3 的潜在优化。可以使用第三方包替代这些 API,例如:

  • resolvePackageEntry: 使用 import.meta.resolve 或 import-meta-resolve包。
  • resolvePackageData: 同上,并向上遍历包目录以获取根package.json。或者使用社区的 vitefu 包。
import { resolve } from 'import-meta-env'
import { findDepPkgJsonPath } from 'vitefu'
import fs from 'node:fs'

const pkg = 'my-lib'
const basedir = process.cwd()

// `resolvePackageEntry`:
const packageEntry = resolve(pkg, basedir)

// `resolvePackageData`:
const packageJsonPath = findDepPkgJsonPath(pkg, basedir)
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))

已移除的过时 API

  • CSS 文件的默认导出(例如 import style from './foo.css'):改用?inline查询参数代替
  • import.meta.globEager:改用 import.meta.glob('*', { eager: true }) 代替 ssr.format:'cjs'legacy.buildSsrCjsExternalHeuristics
  • server.middlewareMode:'ssr'server.middlewareMode:'html':改用 appType + server.middlewareMode: true 代替。

最后

欢迎关注"所谓前端"微信公众号,大家一起交流
点击扫码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1451259.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++中类的6个默认成员函数 【拷贝构造函数】

文章目录 拷贝构造函数的使用拷贝构造对于自定义类型【浅拷贝】深拷贝拷贝构造函数典型调用场景 拷贝构造函数的使用 在前几章学习对象的时候&#xff0c;我们有的时候需要一个与已存在对象一某一样的新对象 那在创建对象时&#xff0c;可否创建一个与已存在对象一某一样的新对…

用HTML和CSS打造跨年烟花秀视觉盛宴

目录 一、程序代码 二、代码原理 三、运行效果 一、程序代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>跨年烟花秀</title><meta name"viewport" content"widthdevi…

[01] Vue2学习准备

目录 vue理解创建实例插值表达式 {{}}响应式特性 vue理解 Vue.js 是一套构建用户界面的渐进式框架。 Vue 只关注视图层&#xff0c; 采用自底向上增量开发的设计。 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 创建实例 准备容器 <div id…

初识Qt | 从安装到编写Hello World程序

文章目录 1.前端开发简单分类2.Qt的简单介绍3.Qt的安装和环境配置4.创建简单的Qt项目 1.前端开发简单分类 前端开发&#xff0c;这里是一个广义的概念&#xff0c;不单指网页开发&#xff0c;它的常见分类 网页开发&#xff1a;前端开发的主要领域&#xff0c;使用HTML、CSS …

leetcode刷题--贪心算法

七. 贪心算法 文章目录 七. 贪心算法1. 605 种花问题2. 121 买卖股票的最佳时机3. 561 数组拆分4. 455 分发饼干5. 575 分糖果6. 135 分发糖果7. 409 最长回文串8. 621 任务调度器9. 179 最大数10. 56 合并区间11. 57 插入区间13. 452 用最少数量的箭引爆气球14. 435 无重叠区间…

Deep learning学习笔记

lec 1&#xff1a;Regression 1.5 Linear neural networks for regression线性神经网络的回归 I parameterizing output layer, I handling data, I specifying loss function, I training model. 浅层网络包括线性模型&#xff0c;其中包含了许多经典的统计预测方法&…

网络安全防御保护 Day5

今天的任务如下 要求一的解决方法&#xff1a; 前面这些都是在防火墙FW1上的配置。 首先创建电信的NAT策略 这里新建转换后的地址池 移动同理&#xff0c;不过地址池不一样 要求二的解决方法&#xff1a; 切换至服务器映射选项&#xff0c;点击新建&#xff0c;配置外网通过…

JDBC 核心 API

引入 mysql-jdbc 驱动 驱动 jar 版本的选择&#xff1a;推荐使用 8.0.25&#xff0c;省略时区设置java 工程导入依赖 项目创建 lib 文件夹导入驱动依赖 jar 包jar 包右键 - 添加为库 JDBC 基本使用步骤 注册驱动获取连接创建发送 sql 语句对象发送 sql 语句&#xff0c;并获…

讲解用Python处理Excel表格

我们今天来一起探索一下用Python怎么操作Excel文件。与word文件的操作库python-docx类似&#xff0c;Python也有专门的库为Excel文件的操作提供支持&#xff0c;这些库包括xlrd、xlwt、xlutils、openpyxl、xlsxwriter几种&#xff0c;其中我最喜欢用的是openpyxl&#xff0c;这…

LEETCODE 315. 计算右侧小于当前元素的个数(归并)

class Solution { public: // 将count声明为publicvector<int> count; vector<int> indexs,tmp;public:vector<int> countSmaller(vector<int>& nums) {//归并int left0;int rightnums.size()-1;//计数// vector<int> count(nums.size()); …

题解37-42

101. 对称二叉树 - 力扣&#xff08;LeetCode&#xff09; 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,nul…

【C++】友元、内部类和匿名对象

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 1. 友元 1.1 友元函数 1.2 友元类 2. 内部类 2.1 成员内部类 2.2 局部内部类 3. 匿名对象 3.1 基本概念 3.1 隐式转换 1…

(10)Hive的相关概念——文件格式和数据压缩

目录 一、文件格式 1.1 列式存储和行式存储 1.1.1 行存储的特点 1.1.2 列存储的特点 1.2 TextFile 1.3 SequenceFile 1.4 Parquet 1.5 ORC 二、数据压缩 2.1 数据压缩-概述 2.1.1 压缩的优点 2.1.2 压缩的缺点 2.2 Hive中压缩配置 2.2.1 开启Map输出阶段压缩&…

threejs之使用shader实现雷达扫描

varying vec2 vUv; uniform vec3 uColor; uniform float uTime;mat2 rotate2d(float _angle){return mat2(cos(_angle),-sin(_angle),sin(_angle),cos(_angle)); }void main(){vec2 newUv rotate2d(uTime*6.18)*(vUv-0.5);float angle atan(newUv.x,newUv.y);// 根据uv坐标获…

那些杠鸿蒙的现在怎么样了?

别杠&#xff0c;要杠就是你对。 一个纯血鸿蒙就已经打了那些杠精的嘴&#xff0c;以前是套壳Android&#xff0c;大家纷纷喷鸿蒙。现在鸿蒙已经全栈自研&#xff0c;并且已经展开各大企业生态合作。不管什么独立系统&#xff0c;都是一定要走一遍套壳Android的道路的&#xf…

幻兽帕鲁云服务器搭建零基础教程,新手小白一看就会

以下教程基于阿里云服务器ECS 来搭建幻兽帕鲁游戏服务器&#xff0c;通过一键部署的方式&#xff0c;最快1分钟即可完成部署。 阿里云一键部署幻兽帕鲁的活动地址&#xff1a;1分钟畅玩&#xff01;一键部署幻兽帕鲁联机服务器 首先&#xff0c;打开阿里云的这个游戏服务器活…

laravel_进程门面_简单介绍

文章目录 Facade是什么&#xff1f;Facade能干什么Facade有哪些方法&#xff1f;怎么使用Facade呢&#xff1f;详细的代码解释Symfony Process是什么&#xff1f;介绍Symfony总结 Facade是什么&#xff1f; 在 Laravel 框架中&#xff0c;Facade 是一种设计模式。 它提供了一…

Javaweb基础-会话

会话&#xff1a; 会话管理&#xff1a;Cookie和Session配合解决 cookie是在客户端保留少量数据的技术,主要通过响应头向客户端响应一些客户端要保留的信息 session是在服务端保留更多数据的技术,主要通过HttpSession对象保存一些和客户端相关的信息 cookie和session配合记录…

奇异递归模板模式应用3-克隆对象

需求&#xff1a;希望某些类提供拷贝自身对象的功能&#xff0c;实现如下 template <typename T> class A { public:T *clone() {return new T(static_cast<T &>(*this));}private:friend T;A() default; };class B : public A<B> { public:B(int valu…

基于Java (spring-boot)和微信小程序的奶茶点餐小程序

一、项目介绍 基于Java (spring-boot)和微信小程序的奶茶点餐小程序功能&#xff1a;客户端登录、个人中心、点餐、选规格、去结算、取餐、我的信息、管理员登录、管理员首页、用户管理、商品管理、商品编辑、商品种类、订单管理、订单处理、等等等。 适用人群&#xff1a;适合…