首页 > 其他分享 >Vite 5.0有哪些新变化?

Vite 5.0有哪些新变化?

时间:2023-11-21 09:22:37浏览次数:22  
标签:5.0 index 哪些 html meta dir import Vite

Rollup 4

Vite 现在使用 Rollup 4,它也带来了一些重大的变化,特别是:

  • 导入断言(assertions 属性)已被重命名为导入属性(attributes 属性)。
  • 不再支持 Acorn 插件。
  • 对于 Vite 插件,this.resolve 的 skipSelf 选项现在默认为 true。
  • 对于 Vite 插件,this.parse 现在只支持 allowReturnOutsideFunction 选项。

你可以阅读 Rollup 的发布说明 中的破坏性变更,了解在 build.rollupOptions 中构建相关的变更。

如果你正在使用 TypeScript,请确保将 moduleResolution: 'bundler'(或 node16/nodenext)设置为 Rollup 4 需要它。或者你可以设置 skipLibCheck: true。

弃用CJS节点API

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

在一个基础的Vite项目中,需要确保:

  1. 文件vite.config.js内容使用ESM语法。
  2. 最接近的package.json文件具有"type": "module",或使用.mjs/.mts扩展名,例如vite.config.mjs或vite.config.mts。

对于其他项目,有一些通用方法:

  • 将 ESM 配置为默认值,如果需要,选择加入 CJS:添加"type": "module"到项目中package.json。所有*.js文件现在都解释为 ESM,并且需要使用 ESM 语法。您可以使用扩展名重命名文件.cjs以继续使用 CJS。
  • 将 CJS 保留为默认值,如果需要,选择加入 ESM:如果项目package.json没有"type": "module",则所有*.js文件都将解释为 CJS。您可以使用扩展名重命名文件.mjs以改用 ESM。
  • 动态导入Vite:如果需要继续使用CJS,可以import('vite')改为使用动态导入Vite。这要求您的代码是在async上下文中编写的,但仍应易于管理,因为 Vite 的 API 大部分是异步的。

重新设计 define 和 import.meta.env.* 的替换策略

在Vite 4 中,define 和 import.meta.env.* 特性在开发和构建中使用的是不同的替换策略:

  • 在开发时,这两个特性分别作为全局变量注入到 globalThis 和 import.meta 中。
  • 在构建时,这两个特性都使用正则表达式进行静态替换。

这导致在尝试访问这些变量时,开发和构建存在一致性问题,有时甚至导致构建失败。例如:

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

const docs = 'I like import.meta.env.MODE'
// 开发:"I like import.meta.env.MODE" ✅
// 构建:"I like "production"" ❌

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

SSR 外部模块值现在符合生产环境行为

在 Vite 4 中,服务器端渲染的外部模块被包装为 .default 和 .__esModule 处理,以实现更好的互操作性,但是它并不符合运行时环境(例如 Node.js)加载时的生产环境行为,导致难以捕获的不一致性。默认情况下,所有直接的项目依赖都是 SSR 外部化的。

Vite 5 现在删除了 .default 和 .__esModule 处理,以匹配生产环境行为。在实践中,这不应影响正确打包的依赖项,但是如果你在加载模块时遇到新的问题,你可以尝试以下重构:

// 之前:
import { foo } from 'bar'

// 之后:
import _bar from 'bar'
const { foo } = _bar
// 之前:
import foo from 'bar'

// 之后:
import * as _foo from 'bar'
const foo = _foo.default

注意,这些更改符合 Node.js 的行为,因此也可以在 Node.js 中运行这些导入进行测试。如果更喜欢坚持使用之前的方式,也可以将 legacy.proxySsrExternalModules 设置为 true。

worker.plugins 现在是一个函数

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

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

在 Vite 4 中,即使 appType 被设置为 'SPA'(默认),访问包含 . 的路径也不会回退到 index.html。从 Vite 5 开始,它将会回退到 index.html。

调整开发和预览 HTML 服务行为

在 Vite 4 中,开发服务器和预览服务器会根据 HTML 的目录结构和尾部斜杠的不同来提供 HTML。这会导致在测试构建后的应用时出现不一致的情况。Vite 5 重构成了一个单一的行为,如下所示,给定以下文件结构:

├── index.html
├── file.html
└── dir
    └── index.html
请求 过往版本 (dev) 过往版本 (preview) 现在 (dev & preview)
/dir/index.html /dir/index.html /dir/index.html /dir/index.html
/dir /index.html (SPA fallback) /dir/index.html /index.html (SPA fallback)
/dir/ /dir/index.html /dir/index.html /dir/index.html
/file.html /file.html /file.html /file.html
/file /index.html (SPA fallback) /file.html /file.html
/file/ /index.html (SPA fallback) /file.html /index.html (SPA fallback)

Manifest 文件现在默认生成到 .vite 目录中

在 Vite 4 中,manifest 文件(build.manifest,build.ssrManifest)默认会生成在 build.outDir 的根目录中。

从 Vite 5 开始,这些文件将默认生成在 build.outDir 中的 .vite 目录中。这个改变有助于解决当公共文件被复制到 build.outDir 时,具有相同 manifest 文件名时的冲突。

CLI 快捷功能键需要一个额外的 Enter 按键

CLI 快捷功能键,例如 r 重启开发服务器,现在需要额外的 Enter 按键来触发快捷功能。例如,r + Enter 可以重新开发服务器。

这个改动防止 Vite 吞噬和控制操作系统特定的快捷键,允许更好的兼容性,当将 Vite 开发服务器与其他进程结合使用时,并避免了之前的注意事项。

移除 --https 标志和 https: true

resolvePackageEntry 和 resolvePackageData 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(#13816
  • server.middlewareMode: 'ssr' 和 server.middlewareMode: 'html':使用 appType + server.middlewareMode: true 来代替(#8452

扩展链接

新手入门-在Vue框架中嵌入前端Excel表格插件(上)

VUE 3 组件开发实战 – 在线电子表格文档编辑(一)

标签:5.0,index,哪些,html,meta,dir,import,Vite
From: https://www.cnblogs.com/powertoolsteam/p/17845492.html

相关文章

  • Linux操作系统的优势官方开发App应用程序有哪些优缺点?
    随着技术的不断进步,Linux操作系统在应用程序开发中扮演着越来越重要的角色。其开放性、稳定性和定制性成为开发者的首选。图片来源:http://news.gulufenfa.com/post/211Linux系统简介Linux作为一个广泛使用的开源操作系统,它的核心是Linux内核,由LinusTorvalds在1991年首次发布。Linu......
  • 音乐播放设置 (5.0)
    本文学习于B站,记录,借鉴;视频链接:音乐播放_哔哩哔哩_bilibili 注意头文件的调用:先使用graphics.h或者easyx.h头文件,在他们下面再继续调用mmsystem.h头文件;下图中重点是最下面两个放置位置,不能放在graphics.h或者easyx.h之后否则无效 刚开始操作与图片的插入相同,将音乐放入同......
  • vite proxy
    proxy:{"/dev-api":{target:"http://172.18.247.123:9000",rewrite:(path)=>path.replace(/^/dev-api/,''),configure:(proxy,_options)=>{proxy.on('error',(err,_req,_res)=>{console.log('pr......
  • 新版Testwell CTC++带来哪些新变化?
    TestwellCTC++在版本10中引入了新的工具ctcreport来直接从符号和数据文件生成HTML报告。详细的特性描述可以在测试井CTC++帮助中找到。在本文档中,描述了与前一代报告相比的改进和变化。 AdaptableLayout可调整布局您可以选择一个适合于项目结构的布局。布局决定了报告的详细......
  • 汽车托运流程都有哪些?
       1、签订合同双方达成合作后,托运公司会提供专业的电子版车辆托运合同,一起形式走法律程序,一切条例受法律保护。2、预约交车签订好合同后,客服会跟您确定好交车地点、时间、提车工作人员,如果您选择了上门提送的服务,届时会有司机上门取车。交车前,记得把自己的车外观......
  • 【5.0】Python中级之文件操作
    【一】文本处理引入应用程序运行过程中产生的数据最先都是存放于内存中的若想永久保存下来,必须要保存于硬盘中。应用程序若想操作硬件必须通过操作系统而文件就是操作系统提供给应用程序来操作硬盘的虚拟概念用户或应用程序对文件的操作,就是向操作系统发起调用,然后由操作系统......
  • Vue中跟 keep-alive 有关的生命周期是哪些?
    在开发Vue项目的时候,大部分组件是没必要多次渲染的,所以Vue提供了一个内置组件keep-alive来缓存组件内部状态,避免重新渲染,在开发Vue项目的时候。生命周期函数:在被keep-alive包含的组件/路由中,会多出两个生命周期的钩子:activated与deactivatedactivated:在组件第一......
  • 信息系统由建设阶段转变为相应的运营维护阶段需要做哪些工作?
    1、项目软件的后续工作1)软件bug的修改软件很难做到没有bug,但大多数bug已经在测试和验收阶段发现,对于这些bug在系统移交的时候已经处理完毕,而对于移交以后的系统,如果出现bug将采用双方约定的方式进行处理2)软件升级在软件维护期限内,应该由客户和服务方根据客户业务需求的具体特点、软......
  • 技术百科丨国家数据局正式挂牌,有哪些看点需要重点关注
    技术百科技术百科是零数科技基于公司技术研发、产品体系,重磅推出的技术解读专题,与行业从业者及生态客户分享零数科技最新技术探索、产品动态,共同探讨区块链及隐私计算技术的应用情况和潜力落脚点。本文作者零数科技产品总监胡豫皖随着信息技术的迅速发展和数字化转型的加速,数据已......
  • 月薪3万的程序员都避开了哪些坑
    程序员薪水有高有低,有的人一个月可能拿30K、50K,有的人可能只有2K、3K。同样有五年工作经验的程序员,可能一个人每月拿20K,一个拿5K。是什么因素导致了这种差异?我特意总结了容易导致薪水低的九大行为表现,避开这些大坑,你就离高薪不远了。习惯即刻回报他不懂得只有春天播种,秋天才会有收......