摘要:Vue.js 是一个流行的 JavaScript 框架,它的最新版本 Vue 3 在许多方面与之前的版本 Vue 2 有所不同。本博客将重点介绍 Vue 3 中与 Vue 2 不一致的代码编写方式。我们将探讨 Vue 3 中引入的新特性、语法变化以及优化等方面的变化。通过详细比较这些变化,我们将了解如何更好地迁移和使用 Vue 3。
一、引入
在Vue 3中,引入了Composition API作为对Options API的补充和扩展。Composition API旨在提供更灵活和可组合的代码组织方式。下面将详细介绍Composition API和Options API之间的不一致之处。
1. Composition API
Composition API是Vue 3中新增的特性,它通过提供一组函数式的API来组织和重用代码逻辑。相比Options API,Composition API更加灵活和可维护,尤其适用于处理复杂的业务逻辑和组件间的共享逻辑。
Composition API的主要特点包括:
- 使用函数来组织逻辑:将相关逻辑按照功能进行封装,并通过函数的方式进行复用。
- 逻辑的精确组合:可以将不同功能的逻辑按需组合,而不需要遵循固定的声明顺序。
- 更好的代码复用性:可以将逻辑抽离到自定义的函数中,并在组件中进行引用和调用。
- 更好的类型推导和编辑器支持:由于函数式的编程方式,编辑器可以更好地推导类型和提供代码补全。
以下是一个使用Composition API的示例:
import {
reactive, computed } from 'vue';
export default {
setup() {
const state = reactive({
count: 0,
});
const increment = () => {
state.count++;
};
const doubledCount = computed(() => {
return state.count * 2;
});
return {
state,
increment,
doubledCount,
};
},
};
2. Options API
Options API是Vue 2中常用的编写组件的方式,通过声明一个选项对象来定义组件的各种属性、方法和生命周期钩子。Options API相对于Composition API来说,更适合编写简单的组件或者初学者使用。
Options API的主要特点包括:
- 基于选项对象:使用一个包含各种选项的对象来定义组件的各个方面。
- 声明式的生命周期钩子:通过预定义的生命周期钩子函数来处理组件的生命周期事件。
- 数据和方法定义在同一个对象中:组件的数据和方法都定义在options对象的属性中。
- 对象内部的上下文访问:可以通过this关键字在组件内部访问组件的上下文。
以下是一个使用Options API的示例:
export default {
data() {
return {
count: 0,
};
},
methods: {
increment() {
this.count++;
},
},
computed: {
doubledCount() {
return this.count * 2;
},
},
};
总结:
Vue 3中引入了Composition API作为对Options API的补充。Composition API提供了更灵活和可组合的代码编写方式,适用于处理复杂的业务逻辑和组件间的共享逻辑。而Options API
则更适合编写简单的组件或者初学者使用。在迁移项目或者新项目中,可以根据需求选择适合的API来编写Vue组件。
二、模板语法
在Vue 3中,模板语法方面也有一些与Vue 2不一致的地方。下面将分别介绍v-model指令、模板中的属性绑定和动态组件的变化。
1. v-model 指令:
在Vue 2中,v-model指令用于实现表单元素和组件之间的双向绑定。而在Vue 3中,v-model指令的行为有所改变。Vue 3中的v-model指令主要用于组件的props和emit之间的双向绑定。
使用v-model指令时,需要在组件的props中定义一个modelValue属性,并在emit事件中使用update:modelValue来更新该属性。具体用法如下:
<template>
<custom-input v-model="value"></custom-input>
</template>
<script>
import CustomInput from './CustomInput.vue';
export default {
components: {
CustomInput,
},
data() {
return {
value: '',
};
},
};
</script>
在CustomInput组件中,需要通过props接收modelValue,并在输入框的input事件中使用$emit(‘update:modelValue’, newValue)来更新父组件中的value。
2. 模板中的属性绑定:
在Vue 2中,可以使用v-bind指令或简写的冒号语法来实现属性绑定。而在Vue 3中,冒号语法的写法略有不同,需要使用v-bind指令来明确地绑定属性。
Vue 2的属性绑定示例:
<template>
<div :class="{ active: isActive }"></div>
<input :value="message">
</template>
Vue 3的属性绑定示例:
<template>
<div v-bind:class="{ active: isActive }"></div>
<input v-bind:value="message">
</template>
需要注意的是,在Vue 3中,还可以使用缩写形式的属性绑定,将v-bind简写为一个前缀符号(如:@、:、#等),根据具体的用途来选择合适的前缀符号。
3. 动态组件:
在Vue 2中,可以使用元素和is属性来实现动态组件的切换。而在Vue 3中,动态组件的写法发生了一些改变。
Vue 2中的动态组件示例:
<template>
<component :is="currentComponent"></component>
</template>
<script>
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';
export default {
data() {
return {
currentComponent: 'ComponentA',
};
},
components: {
ComponentA,
ComponentB,
},
};
</script>
Vue 3中的动态组件示例:
<template>
<component :is="currentComponent"></component>
</template>
<script>
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';
export default {
data() {
return {
currentComponent: ComponentA,
};
},
components: {
ComponentA
,
ComponentB,
},
};
</script>
在Vue 3中,可以直接将组件对象作为currentComponent的值,而不需要使用组件的名称字符串。
总结:
在Vue 3中,v-model指令的用法发生了变化,主要用于组件的props和emit之间的双向绑定。模板中的属性绑定需要使用v-bind指令进行明确的属性绑定,可以选择使用不同的前缀符号来简化语法。动态组件的写法在Vue 3中保持了一致,只需将组件对象直接赋值给is属性即可。这些变化使得模板语法在Vue 3中更加灵活和易于使用。
三、响应式系统
在Vue 3中,响应式系统也有一些与Vue 2不一致的地方。下面将分别介绍Ref和Reactive、Computed和Watch以及静态属性的变化。
1. Ref 和 Reactive:
在Vue 2中,使用Vue.observable()方法将一个普通对象转换为响应式对象。而在Vue 3中,引入了Ref和Reactive两个新的响应式API。
- Ref:Ref是Vue 3中的一个新类型,它可以包装普通的数据并使其成为响应式数据。可以通过ref()函数将普通数据包装成Ref对象。使用Ref对象时,需要通过.value属性来访问和修改值。
import {
ref } from 'vue';
const count = ref(0);
console.log(count.value); // 访问值
count.value = 1; // 修改值
- Reactive:Reactive是Vue 3中的一个新函数,它接收一个普通对象并返回一个响应式代理对象。使用Reactive函数时,不需要像Vue 2中那样手动调用Vue.observable()来转换对象。
import {
reactive } from 'vue';
const state = reactive({
count: 0,
});
console.log(state.count); // 访问值
state.count = 1; // 修改值
2. Computed 和 Watch:
在Vue 3中,Computed和Watch的使用方式与Vue 2基本保持一致,但有一些细微的变化。
- Computed:在Vue 3中,可以使用computed()函数来创建计算属性。computed()函数接收一个函数作为参数,并返回一个Ref对象。需要注意的是,在Vue 3中,不再需要使用get和set来定义计算属性,而是直接返回计算结果。
import {
computed, ref } from 'vue';
const count = ref(0);
const doubledCount = computed(() => count.value * 2);
console.log(doubledCount.value); // 访问计算属性的值
- Watch:在Vue 3中,可以使用watch()函数来创建一个侦听器,以便在响应式数据发生变化时执行回调函数。watch()函数接收两个参数:要监听的数据和回调函数。需要注意的是,在Vue 3中,watch()函数不再支持字符串表达式。
import {
watch, ref } from 'vue';
const count = ref(0);
watch(count, (newValue, oldValue) => {
console.log(`count changed from ${
oldValue} to ${
newValue}`);
});
3. 静态属性:
在Vue 2中,可以通过Vue实例的$options属性来访问组件的静态属性。而在Vue 3中,静态属性被移除,并且无法直接通过组件实例访问。这是因为Vue 3使用了基于Proxy的新的内部实现,静态属性不再是实例的一部分。
总结:
在Vue 3中,Ref和Reactive提供了更灵活和直观的方式来创建响应式数据。Computed和Watch的使用方式基本保持一致,
但在语法细节上有一些变化。需要注意的是,Vue 3中移除了组件的静态属性,无法直接通过实例访问。这些变化使得响应式系统更加直观和易于使用。
四、虚拟 DOM
在Vue 3中,虚拟DOM(Virtual DOM)也有一些与Vue 2不一致的地方。下面将介绍Fragment、Teleport和Suspense这三个与虚拟DOM相关的变化。
1. Fragment:
在Vue 2中,如果在模板中使用多个根元素是无效的,必须将它们包裹在一个父元素中。而在Vue 3中,可以使用Fragment(片段)来解决这个问题。Fragment是一个特殊的占位符,用于在模板中包裹多个元素,但不会在渲染结果中生成额外的DOM元素。
使用Fragment的示例:
<template>
<Fragment>
<div>Element 1</div>
<div>Element 2</div>
</Fragment>
</template>
可以使用简写的语法<></>
来表示Fragment:
<template>
<>
<div>Element 1</div>
<div>Element 2</div>
</>
</template>
2. Teleport:
Teleport是Vue 3中新增的一个特性,用于在DOM中的任意位置渲染组件的内容。Teleport提供了一种简洁的方式来处理在组件外部渲染内容的需求,比如在模态框、对话框或弹出菜单中渲染组件。
使用Teleport的示例:
<template>
<Teleport to="body">
<div class="modal">
Modal Content
</div>
</Teleport>
</template>
在上面的示例中,to
属性指定了Teleport要渲染到的目标位置,这里是body
,但也可以是其他合法的DOM选择器。
3. Suspense:
Suspense是Vue 3中引入的另一个特性,用于在异步组件加载过程中显示一个占位符,直到异步组件加载完成并准备好进行渲染。Suspense提供了更好的用户体验和更精细的控制。
使用Suspense的示例:
<template>
<Suspense>
<template #default>
<div>Loading...</div>
</template>
<template #fallback>
<div>Error! Failed to load component.</div>
</template>
<AsyncComponent />
</Suspense>
</template>
<script>
import { defineAsyncComponent } from 'vue';
const AsyncComponent = defineAsyncComponent(() => import('./AsyncComponent.vue'));
export default {
components: {
AsyncComponent,
},
};
</script>
在上面的示例中,#default
插槽中的内容会在异步组件加载完成前显示,#fallback
插槽中的内容会在异步组件加载出错时显示。
总结:
在Vue 3中,Fragment提供了一种解决多根元素问题的方式,Teleport提供了更灵活的组件渲染位置控制,而Suspense则提供了更好的异步组件加载体验。这些
变化丰富了虚拟DOM的功能,提供了更多的开发选项和更好的用户体验。
五、性能优化
在Vue 3中,性能优化方面也有一些新的特性和改进。下面将介绍静态提升和编译优化这两个与性能优化相关的方面。
1. 静态提升(Static Hoisting):
在Vue 2中,模板中的静态内容在每次重新渲染时都会被重新创建,这可能导致一些性能损失。而在Vue 3中,通过静态提升技术,编译器可以检测并优化静态内容,将其提升为静态的常量,减少了重新创建的开销。
静态提升可以带来以下优势:
- 减少了虚拟DOM的创建和比对次数,提升了渲染性能。
- 通过减少不必要的DOM操作,降低了页面的回流和重绘成本。
2. 编译优化:
Vue 3对编译器进行了改进,引入了一些优化措施来提升编译的效率和性能。
-
Patch flag:编译器会根据模板的静态内容和动态内容的不同,为每个VNode节点添加一个Patch flag,用于在更新过程中进行更精细的操作,减少不必要的比对和渲染操作。
-
缓存事件处理函数:Vue 3中,编译器会将事件处理函数进行缓存,避免在每次重新渲染时都创建新的函数实例,提升了事件处理的性能。
-
静态节点提升:编译器会检测模板中的静态节点,并将其提升为常量,避免在每次重新渲染时都创建新的VNode,减少了渲染开销。
-
Tree shaking:Vue 3的编译器支持将模板中未使用的组件和指令进行剔除,从而减小打包体积,提升应用的加载性能。
总结:
在Vue 3中,通过静态提升和编译优化等措施,可以提升应用的性能。静态提升减少了静态内容的重新创建开销,而编译优化则通过改进编译器和优化渲染过程来提升性能。这些优化措施使得Vue 3在性能方面有了明显的提升,提供了更好的用户体验和更高的开发效率。
六、TypeScript 支持
在Vue 3中,对TypeScript的支持得到了显著改进。下面将介绍类型推断和类型声明这两个与TypeScript支持相关的方面。
1. 类型推断:
Vue 3在许多情况下能够自动推断变量的类型,从而提供更好的类型安全性和开发体验。以下是一些示例:
- Props 推断:在组件中,可以通过
defineProps
函数定义组件的 props,并根据 props 的默认值和传入的值进行类型推断。
import {
defineComponent, defineProps } from 'vue';
const MyComponent = defineComponent({
props: {
message: String,
count: {
type: Number,
default: 0,
},
},
setup(props) {
// 在使用 props 时,可以获得类型推断
console.log(props.message.toUpperCase());
console.log(props.count.toFixed(2));
// ...
},
});
- Ref 推断:在使用
ref
函数创建 Ref 对象时,Vue 3 可以自动推断 Ref 对象中包装的值的类型。
import {
ref } from 'vue';
const count = ref(0); // 推断为 Ref<number>
console.log(count.value.toFixed(2)); // value 推断为 number
- Computed 推断:在使用
computed
函数创建计算属性时,Vue 3 可以根据计算函数的返回值自动推断计算属性的类型。
import {
computed, ref } from 'vue';
const count = ref(0);
const doubledCount = computed(() => count.value * 2); // 推断为 ComputedRef<number>
console.log(doubledCount.value.toFixed(2)); // value 推断为 number
2. 类型声明:
Vue 3 提供了更好的支持,使得在 TypeScript 中使用 Vue 组件时能够获得更准确的类型推断和类型检查。
- defineComponent 函数:可以使用
defineComponent
函数来定义组件,它接受一个组件配置对象,并返回一个包含正确类型声明的组件选项对象。
import {
defineComponent } from 'vue';
export default defineComponent({
name: 'MyComponent',
props: {
message: String,
count: {
type: Number,
default: 0,
},
},
setup(props) {
console.log(props.message.toUpperCase());
console.log(props.count.toFixed(2));
// ...
},
});
- Options API 类型声明:对于使用 Options API 的组件,Vue 3 提供了正确的类型声明,以确保在编写组件选项时获得正确的类型提示和类型检查。
import {
Options, VueConstructor } from 'vue';
const MyComponent: Options = {
name: 'MyComponent',
props: {
message: String,
count: {
type: Number,
default: 0,
},
},
setup(props) {
console.log(props.message.toUpperCase());
console.log(props.count.toFixed(2));
// ...
},
};
export default MyComponent as VueConstructor;
总结:
在Vue 3中,对TypeScript的支持得到了改进
,包括类型推断和类型声明。类型推断使得开发者能够获得更好的类型安全性和开发体验,而类型声明则确保在使用Vue组件时能够获得准确的类型提示和类型检查。这些改进使得在使用TypeScript开发Vue应用时更加舒适和高效。
七、插槽和组件
在Vue 3中,插槽和组件方面也有一些变化。下面将介绍新的插槽语法和组件实例访问这两个方面。
1. 新的插槽语法:
Vue 3引入了一种新的插槽语法,更加灵活和直观。新的插槽语法使用<slot>
元素来定义插槽,并可以通过命名插槽和作用域插槽实现更多的功能。
命名插槽示例:
<template>
<div>
<slot name="header"></slot>
<div>Content</div>
<slot name="footer"></slot>
</div>
</template>
在使用组件时,可以使用<template v-slot:slotName>
或者简写的<template #slotName>
来具体定义插槽内容。
<template>
<MyComponent>
<template #header>
<h1>Header Content</h1>
</template>
<p>Main Content</p>
<template #footer>
<footer>Footer Content</footer>
</template>
</MyComponent>
</template>
作用域插槽示例:
<template>
<div>
<slot name="header" :title="title"></slot>
<div>Content</div>
<slot name="footer" :year="year"></slot>
</div>
</template>
使用作用域插槽时,可以在插槽内容中通过slotProps
属性访问传递给插槽的数据。
<template>
<MyComponent>
<template #header="slotProps">
<h1>{
{ slotProps.title }}</h1>
</template>
<p>Main Content</p>
<template #footer="slotProps">
<footer>{
{ slotProps.year }}</footer>
</template>
</MyComponent>
</template>
2. 组件实例访问:
在Vue 2中,可以通过$refs
来访问组件实例,但在Vue 3中,组件实例的访问发生了变化。可以使用ref
函数来创建一个响应式的引用,并将其绑定到组件上。
<template>
<div>
<MyComponent ref="myComponentRef"></MyComponent>
<button @click="logComponentData">Log Component Data</button>
</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const myComponentRef = ref(null);
const logComponentData = () => {
console.log(myComponentRef.value.data);
};
return {
myComponentRef,
logComponentData,
};
},
};
</script>
在上述示例中,通过ref
函数创建了一个引用myComponentRef
,并将其绑定到MyComponent
组件上。然后可以通过myComponentRef.value
来访问组件实例,并获取其数据。
总结:
在Vue 3中,插槽语法发生了变
化,引入了新的插槽语法,使得插槽的使用更加灵活和直观。同时,组件实例的访问也有所改变,可以通过ref
函数创建响应式引用,并绑定到组件上来访问组件实例。这些改变使得插槽和组件的使用更加方便和强大。
八、过渡和动画
在Vue 3中,过渡和动画方面也有一些改进。下面将介绍Transition组件和动画类名这两个方面。
1. Transition 组件:
在Vue 3中,过渡效果可以通过Transition组件来实现。Transition组件提供了在元素插入或移除时应用过渡效果的能力。
使用Transition组件时,可以通过以下属性来控制过渡效果:
-
name
:指定过渡效果的名称,可以通过设置CSS类名来定义具体的过渡效果。 -
appear
:指定是否在初始渲染时应用过渡效果。 -
enter-class
/enter-active-class
/enter-to-class
:指定插入元素时的过渡类名。 -
leave-class
/leave-active-class
/leave-to-class
:指定移除元素时的过渡类名。
下面是一个使用Transition组件实现渐变过渡的示例:
<template>
<Transition name="fade">
<div v-if="show" class="box"></div>
</Transition>
<button @click="toggle">Toggle</button>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const show = ref(true);
const toggle = () => {
show.value = !show.value;
};
return {
show,
toggle,
};
},
};
</script>
<style>
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.5s;
}
.fade-enter,
.fade-leave-to {
opacity: 0;
}
</style>
在上述示例中,通过设置name="fade"
将Transition组件应用到包裹的元素上,并定义了过渡效果的CSS类名。在初始渲染时,会应用fade-enter
和fade-enter-active
类名,实现渐变的出现效果。在元素移除时,会应用fade-leave
和fade-leave-active
类名,实现渐变的消失效果。
2. 动画类名:
在Vue 3中,可以使用动画类名来实现元素的动画效果。与Vue 2类似,可以通过在元素上添加类名来触发动画效果。
Vue 3中常用的动画类名包括:
-
enter
:插入元素的开始状态。 -
enter-active
:插入元素的过渡状态。 -
enter-to
:插入元素的结束状态。 -
leave
:移除元素的开始状态。 -
leave-active
:移除元素的过渡状态。 -
leave-to
:移除元素的结束状态。
可以通过定义这些类名的CSS样式来实现具体的动画效果。
例如,实现一个简单的淡入淡出动画:
<template>
<div :class="animationClass" class="box"></div>
<button @click="toggle">Toggle</button>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const show = ref(true);
const toggle = () => {
show.value = !show.value;
};
const animationClass = ref('');
watch(show, () => {
animationClass.value = show.value ? 'fade-enter-active' : 'fade-leave-active';
});
return {
show,
toggle,
animationClass,
};
},
};
</script>
<style>
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.5s;
}
.fade-enter,
.fade-leave-to {
opacity: 0;
}
</style>
在上述示例中,通过动态绑定animationClass
来实现动画效果。当show
的值发生变化时,会根据show
的值来设置animationClass
的值,从而触发对应的动画效果。
总结:
在Vue 3中,过渡和动画方面可以通过Transition组件和动画类名来实现。Transition组件提供了控制元素插入和移除过渡效果的能力,而动画类名可以通过添加类名来触发动画效果。这些改进使得过渡和动画的实现更加灵活和易用。
九、全局 API 改动
在Vue 3中,全局 API发生了一些变化,包括名称的变更和移除的全局 API。下面将介绍这两个方面的改动。
1. 全局 API 名称变更:
在Vue 3中,一些全局 API的名称发生了变更,以更好地反映其功能和用途。
Vue
:在Vue 3中,Vue
构造函数不再被导出作为默认的入口点。可以使用createApp
函数来创建应用实例。
// Vue 2
new Vue({
// ...
});
// Vue 3
import {
createApp } from 'vue';
createApp({
// ...
}).mount('#app');
-
filter
:在Vue 2中,可以通过全局Vue.filter
方法注册过滤器,但在Vue 3中,过滤器已被移除。可以使用局部过滤器或者自定义函数来实现相同的功能。 -
directive
:在Vue 2中,可以通过全局Vue.directive
方法注册指令,但在Vue 3中,指令已被移除。可以使用自定义指令或者在组件中直接使用指令来替代全局指令。 -
mixin
:在Vue 2中,可以通过全局Vue.mixin
方法混入选项,但在Vue 3中,混入选项已被移除。可以使用组合(Composition)API来实现相同的功能。 -
component
:在Vue 2中,可以通过全局Vue.component
方法注册全局组件,但在Vue 3中,组件的注册方式发生了变化。可以使用局部注册或者通过应用实例的component
方法来注册组件。
2. 移除的全局 API:
除了名称变更,Vue 3还移除了一些全局 API,因为它们的功能可以通过其他方式实现或者不再被推荐使用。
-
v-once
:在Vue 2中,可以使用v-once
指令将元素和组件标记为只渲染一次。在Vue 3中,v-once
指令已被移除,可以通过响应式数据和条件渲染来实现相同的效果。 -
inline-template
:在Vue 2中,可以使用inline-template
特性将组件的模板写在组件的标签内部。在Vue 3中,inline-template
特性已被移除,可以通过单文件组件或者字符串模板来实现相同的功能。 -
sync
修饰符:在Vue 2中,可以使用sync
修饰符来实现父子组件之间的双向绑定。在Vue 3中,sync
修饰符已被移除,可以通过使用v-model
和事件的显式绑定来实现双向绑定。
总结:
在Vue 3中,全局 API发生了一些变化,包括名称的变更和移
除的全局 API。这些改动旨在提高API的一致性和易用性,并且推动开发者使用更好的替代方案来实现相同的功能。开发者需要注意这些变化,并相应地更新他们的代码。
十、构建工具和生态系统
在构建工具和生态系统方面,Vue 3引入了一些改进,包括Vue CLI和第三方库的适配。下面将介绍这两个方面的改动。
1. Vue CLI 与 Vue CLI 2:
Vue CLI是Vue.js官方的脚手架工具,用于快速搭建和管理Vue项目。Vue CLI 2是Vue 2时代的版本,而Vue CLI是针对Vue 3的新版本。
Vue CLI 3相比于Vue CLI 2具有以下改进:
-
使用了现代化的插件机制,使得扩展和定制更加灵活和简便。
-
通过Vue CLI UI提供了图形化界面,方便进行项目配置和管理。
-
引入了Vue CLI Service,它是一个可扩展的底层构建工具,集成了常用的构建和开发工具。
-
支持了Vue 3的新特性,例如Composition API和新的生命周期等。
因此,对于Vue 3的项目,建议使用Vue CLI进行项目的初始化和管理。
2. 第三方库的适配:
随着Vue 3的发布,许多第三方库也在适配和升级以支持Vue 3的新特性和语法。一些常用的Vue生态系统库已经发布了Vue 3的兼容版本,或者在其官方文档中提供了Vue 3的适配指南。
在使用第三方库时,建议查阅其官方文档,了解其是否支持Vue 3以及如何进行适配。通常,适配Vue 3的第三方库会提供特定的安装和使用指南,可能会有一些语法和 API 上的变化需要注意。
另外,Vue 3还引入了一个名为@vue/composition-api
的官方插件,可以用于在Vue 2项目中使用Composition API。这个插件使得在Vue 2项目中逐步迁移到Vue 3的Composition API更加方便。
总结:
在构建工具和生态系统方面,Vue 3带来了Vue CLI的更新和第三方库的适配。建议使用Vue CLI 3来创建和管理Vue 3项目,并查阅第三方库的官方文档,了解其对Vue 3的支持和适配情况。这些改进使得开发者能够更好地利用Vue 3的新特性和生态系统,提高开发效率和代码质量。