Vue 3.3 正式发布,代号:Rurouni Kenshin

2023-05-24 0 621

后端电池宝

5 月 11 日,Vue 3.3 正式宣布正式宣布发布,SS Rurouni Kenshin。此次预览主要就特别针对开发人员新体验展开了改良,的的采用 TypeScript 时的 SFC <script setup>。与 Vue 词汇辅助工具(从前称作 Volar)1.6 的正式宣布发布并重,化解了在采用 TypeScript 时存有的很多长年所苦难题。上面就来看一看 Vue 3.3 版中的重点项目机能!

当升级换代到 Vue 3.3 时,提议与此同时预览下列倚赖项:

volar / vue-tsc @ ^1.6.4vite @ ^4.3.5@vitejs/plugin-vue @ ^4.2.0vue-loader @ ^17.1.0(假如采用 webpack 或 vue-cli)

SFC中的 <script setup> 和 TypeScript DX 改良

宏中的引入和繁杂类别全力支持

在以后的版中,用作 definePropsdefineEmits 的类别模块边线采用的类别被管制为邻近地区类别,因此仅全力支持类别字面上量和USB。这原因在于 Vue 须要能预测 props USB上的特性以聚合适当的运转时快捷键。

此管制也已在 3.3 中化解。C++那时能导出引入的类别,并全力支持几组非常有限的繁杂类别:

<script setup lang=“ts”

>

import type { Props } from ./foo// imported + intersection type

defineProps()

<

/script>

注意,繁杂类别全力支持是基于AST的,因此不是 100% 全面的。不全力支持一些须要实际类别预测的繁杂类别,例如条件类别。能对单个props 的类别采用条件类别,但不能对整个 props 对象采用条件类别。

通用组件

采用<script setup>的组件那时能通过 generic 特性接受泛型类别模块:

<script setup lang=“ts” generic=“T”

>

defineProps<{

  items

: T[]

  selected

: T

}>()

<

/script>

generic 的值与 TypeScript 中 <…>之间的模块列表完全相同。例如,能采用多个模块、extends约束、默认类别和引用引入类别:

<script setup lang=“ts” generic=“T extends string | number, U extends Item”

>

import type { Item } from ./types

defineProps<{

  id

: T

  list

: U[]

}>()

<

/script>

这个机能从前须要显式地选择,但那时在最新版的 volar / vue-tsc 中已经默认启用了。

更符合人体工程学的 defineEmits

从前,defineEmits 的类别模块只全力支持调用签名语法:

const

emit = defineEmits<{

  (e: fooid: number): void  (e: barname: string, …rest: any[]): void

}>()

该类别与 emit 的返回类别相匹配,但编写起来有点冗长和笨拙。3.3 引入了一种更符合人体工程学的声明具有类别的 emit 的方法:

const

 emit = defineEmits<{

  foo

: [id: number]

  bar

: [name: string, …rest: any[]]

}>()

在类别字面上量中,键是事件名称,值是指定附加模块的数组类别。虽然不是必需的,但能采用带标签的元组元素来明确表示,就像上面的示例中一样。

调用签名语法仍然受全力支持。

采用 defineSlots 的类别插槽

新的 defineSlots 宏可用作声明预期的插槽及其适当的预期插槽 props:

<script setup lang=“ts”

>

defineSlots<{

  default?: (props: { msg: string }) =>

 any

  item?: (props: { id: number }) =>

 any

}>()

<

/script>

defineSlots() 只接受类别模块,不接受运转时模块。类别模块应该是类别字面上量,其中特性键是插槽名称,值是插槽函数。该函数的第一个模块是插槽期望接收的 props,其类别将用作模板中的插槽 propsdefineSlots 的返回值与 useSlots 返回的插槽对象相同。

当前的一些管制:

volar / vue-tsc 中尚未实现必需的插槽检查。插槽函数返回类别目前被忽略,能是 any 类别,但将来可能会利用它来检查插槽内容。

defineComponent 用法也有对应的 slots 快捷键。这两个 API 都没有运转时影响,因此纯粹用作 IDE 和 vue-tsc 的类别提示。

实验机能

响应式 Props 解构

从前是那时已删除的 Reactivity Transform 的一部分,响应式 props 解构已拆分为单独的机能。

该机能允许解构的 props 保持响应性,并提供更符合人体工程学的声明 props 默认值的方式:

import { watchEffect } from vueconst { msg = hello } = defineProps([msg

])

watchEffect(() =>

 {

   // 在 watchers 和 computed getters 中访问 `msg`   // 将其作为倚赖项展开跟踪,就像访问 `props.msg` 一样  console.log(`msg is: ${msg}`

)

})

<

/script>

<template>{{ msg }}</

template>

defineModel

从前,对于全力支持与 v-model 双向绑定的组件,它须要(1)声明一个 prop 和(2)在打算预览 prop 时发出适当的 update:propName 事件:

const props = defineProps([modelValue

])

const emit = defineEmits([update:modelValue

])

console

.log(props.modelValue)

function onInput(e

{

  emit(update:modelValue

, e.target.value)

}

<

/script>

<input :value=”modelValue” @input=”onInput” /

>

<

/template>

3.3 采用新的 defineModel 宏简化了采用。宏会自动注册一个 prop,并返回一个能直接改变的ref

const

 modelValue = defineModel()

console

.log(modelValue.value)

<

/script>

<input v-model=”modelValue” /

>

<

/template>

其他特性

defineOptions

新的 defineOptions 宏允许直接在 <script setup> 中声明组件快捷键,而不须要单独的 <script> 块:

defineOptions({inheritAttrsfalse

 })

<

/script>

采用 toRef 和 toValue 实现更好的 getter 全力支持

toRef 已得到增强以全力支持将值/getters/现有 refs 规范化为 refs

// 相当于 ref(1)toRef(1

)

// 创建一个 readonly ref,在 .value 访问时调用 gettertoRef(() =>

 props.foo)

// 按原样返回现有 refs

toRef(existingRef)

采用 getter 调用 toRef 类似于 computed,但是当 getter 只执行特性访问而没有昂贵的计算时,能更高效。

新的 toValue辅助工具方法提供相反的机能,即将值/ getter / ref 规范化为值:

toValue(1//       –> 1toValue(ref(1)) //  –> 1toValue(() => 1// –> 1

toValue 能在组合式函数中代替 unref,以便组合式函数能接受 getter 作为响应式数据源:

// 从前:分配不必要的中间引用useFeature(computed(() =>

props.foo))

useFeature(toRef(props, foo

))

// 那时:更高效和简洁useFeature(() =>

 props.foo)

toReftoValue 之间的关系类似于 refunref之间的关系,主要就区别在于getter 函数的特殊处理。

JSX 引入源全力支持

当前,Vue 的类别自动注册全局 JSX 类别。这可能会与须要 JSX 类别推断的其他库一起采用时产生冲突,特别是 React。

从 3.3 开始,Vue 全力支持通过 TypeScript 的jsxImportSource 快捷键指定 JSX 命名空间,这允许用户基于其用例选择全局或每个文件的选择。

为了向后兼容,3.3 仍然全局注册 JSX 命名空间。计划在 3.4 中删除默认的全局注册。假如正在采用 TSX 和 Vue,请在升级换代到 3.3 后在tsconfig.json 中添加显式的 jsxImportSource,以避免在 3.4 中出现难题。

维护基础设施改良

此版建立在很多维护基础设施改良的基础上,这使得 Vue 团队能更有信心地更快地行动:

通过将类别检查与汇总构建分开并从 rollup-plugin-typescript2移动到rollup-plugin-esbuild,构建速度提高 10 倍。通过从 Jest 转移到 Vitest 来加快测试速度。通过从 @microsoft/api-extractor 转移到 rollup-plugin-dts 来更快地聚合类别。通过 ecosystem-ci 展开综合回归测试,在正式宣布发布前捕获主要就生态系统倚赖项中的回归。

按照计划,Vue 团队的目标是在 2023 年开始正式宣布发布更小、更频繁的机能版,敬请期待!

参考:https://blog.vuejs.org/posts/vue-3-3

—END—

推荐↓↓↓

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务