v-for

在 Vue.js 开发中,v-for 是我们用来遍历数组、对象或其他数据结构的核心指令。然而,很多开发者可能忽略了其中的一个细微差别:in 和 of。这两个关键字看似相似,但却有各自不同的使用场景和适用数据类型。理解它们的区别,可以帮助我们编写更简洁、高效的代码。 本文将详细探讨 v-for 中的 in 和 of,并讲解它们各自的适用场景,帮助你在 Vue.js 项目中做出最佳选择。 什么是 v-for? v-for 是 Vue.js 提供的用于遍历数据的指令,它可以帮助你快速渲染列表、表格等动态生成的内容。在使用 v-for 时,我们通常需要遍历一个数据集合,并将每一项绑定到 DOM 元素上。 in 和 of 的概念 v-for 中的 in 和 of 是遍历数据时的两个常用关键字,它们的主要区别在于:in 更通用,可以遍历数组、对象和整数范围;而 of 专注于遍历可迭代对象(如数组、字符串、Set、Map 等) 。 接下来,我们深入探讨它们的具体用法及差异。 1. in:适用于数组、对象、整数范围 1.1 遍历数组 in 是 Vue.js 中默认推荐的方式,用于遍历数组中的元素。你可以轻松地用 in 处理数组中的每个值。 <ul> <li v-for="item in items">{{ item }}</li> </ul> 假设 items = ['apple', 'banana', 'cherry'],输出结果为: <li>apple</li> <li>banana</li> <li>cherry</li> 1.2 遍历对象 当你需要遍历对象的键和值时,in 也非常方便。通过 (value, key) 语法,你可以轻松获取对象的键和值。 ...

October 5, 2024

vue事件处理

一、DOM 事件流 想必看过《红宝书》的前端 er 对标题都不会特别陌生,我们来看看定义:当一个 HTML 元素产生一个事件时,该事件会在树形结构的 DOM 上面沿着元素节点路径进行传播,事件所经过的路径结点都会收到该事件,这个传播过程可称为 DOM 事件流。 二、DOM 事件流模型 DOM 事件流分为 捕获型事件流 和 冒泡型事件流。两种事件流分别对应三阶段 DOM 事件流模型中的捕获阶段和冒泡阶段: 捕获阶段:事件从最外面的祖先节点依次传递到最里面的后代节点 目标阶段:真正的目标节点正在处理事件的阶段 冒泡阶段:事件又从最里面的后代节点逐层传出到最外面的祖先节点 三、Vue 之事件处理 Vue 中提供了事件绑定的语法糖,我们可以很简单地在标签中直接使用 @click="handleClick($event)" 就可以绑定点击事件。 而且在 Vue 里面,Vue 的事件触发默认为冒泡过程监听,意思就是上面 @click="handleClick($event)" 中点击事件的执行是冒泡过程触发的。 四、Vue 之事件修饰符 4.1 .capture 捕获监听器 <div @click="log(1)" @click.capture="log(1)" style="background-color: #00f"> <div @click="log(2)" @click.capture="log(2)" style="background-color: #66f"> <div @click="log(3)" @click.capture="log(3)" style="background-color: #ccf"> <div @click="log(4)" @click.capture="log(4)" style="background-color: #fff"> 点击这里 </div> </div> </div> </div> 控制台打印结果为:1 2 3 4 4 3 2 1 ...

October 5, 2024

自定义指令

如何自定义指令? 其实关于这个问题官方文档上已经有了很好的示例的,我们先来温故一下。 除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令。注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件。然而,有的情况下,你仍然需要对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。举个聚焦输入框的例子,如下: 当页面加载时,该元素将获得焦点 (注意: autofocus 在移动版 Safari 上不工作)。事实上,只要你在打开这个页面后还没点击过任何内容,这个输入框就应当还是处于聚焦状态。现在让我们用指令来实现这个功能: // 注册一个全局自定义指令 `v-focus` Vue.directive('focus', { // 当被绑定的元素插入到 DOM 中时…… inserted: function (el) { // 聚焦元素 el.focus() } }) 如果想注册局部指令,组件中也接受一个 directives 的选项: directives: { focus: { // 指令的定义 inserted: function (el) { el.focus() } } } 然后你可以在模板中任何元素上使用新的 v-focus property,如下: <input v-focus> 指令内部提供的钩子函数 一个指令定义对象可以提供如下几个钩子函数 (均为可选): bind: 只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。 inserted: 被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。 update: 所在组件的 VNode 更新时调用,**但是可能发生在其子 VNode 更新之前。**指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。 componentUpdated: 指令所在组件的 VNode 及其子VNode全部更新后调用。 unbind: 只调用一次,指令与元素解绑时调用。 钩子函数参数 指令钩子函数会被传入以下参数: ...

October 5, 2024

mixin-混入

1. 什么是Mixin? 想要使用一个事物或者工具,我们首要先了解它是什么,这样我们才好对症下药。 其实Mixin不是Vue专属的,可以说它是一种思想,也可以说它就是混入的意思,在很多开发框架中都实现了Mixin(混入),我们这里主要讲解的是Vue中的Mixin。 老规矩,先看官方文档。 官方解释: 混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。 官方的解释通常都是晦涩难懂的,因为要专业和准确嘛! 我们可以用我们自己容易理解的话来说说Vue中的Mixin是什么。 民间解释: 将组件的公共逻辑或者配置提取出来,哪个组件需要用到时,直接将提取的这部分混入到组件内部即可。这样既可以减少代码冗余度,也可以让后期维护起来更加容易。 这里需要注意的是:提取的是逻辑或配置,而不是HTML代码和CSS代码。其实大家也可以换一种想法,mixin就是组件中的组件,Vue组件化让我们的代码复用性更高,那么组件与组件之间还有重复部分,我们使用Mixin在抽离一遍。 2. Mixin和Vuex的区别? 上面一点说Mixin就是一个抽离公共部分的作用。在Vue中,Vuex状态管理似乎也是做的这一件事,它也是将组件之间可能共享的数据抽离出来。两者看似一样,实则还是有细微的区别,区别如下: Vuex公共状态管理,如果在一个组件中更改了Vuex中的某个数据,那么其它所有引用了Vuex中该数据的组件也会跟着变化。 Mixin中的数据和方法都是独立的,组件之间使用后是互相不影响的。 3. 如何使用? 我们了解了Mixin的概念,那么如何使用它呢?这才是我们的重点。 3.1 准备工作 接下来我们的mixin就放在Vue2.x的脚手架项目中演示。 利用Vue-cli初始化一个最简单的项目: 3.1 mixin定义 定义mixin也非常简单,它就是一个对象而已,只不过这个对象里面可以包含Vue组件中的一些常见配置,如data、methods、created等等。 在我们的项目src目录下新建mixin文件夹,然后新建index.js文件,该文件存放我们的mixin代码。 代码如下: // src/mixin/index.js export const mixins = { data() { return {}; }, computed: {}, created() {}, mounted() {}, methods: {}, }; 可以看到我们的mixin非常的简单,主要包含了一个Vue组件的常见的逻辑结构。 接下来让我们在mixin中简单的写点东西,代码如下: export const mixins = { data() { return { msg: "我是小猪课堂", }; }, computed: {}, created() { console.log("我是mixin中的created生命周期函数"); }, mounted() { console.log("我是mixin中的mounted生命周期函数"); }, methods: { clickMe() { console.log("我是mixin中的点击事件"); }, }, }; 3.2 局部混入 我们的公共mixin定义好后,最重要就是如何使用它。根据不同的业务场景,我们可以分为两种:局部混入和全局混入。顾名思义,局部混入和组件的按需加载有点类似,就是需要用到mixin中的代码时,我们再在组件章引入它。全局混入的话,则代表我在项目的任何组件中都可以使用mixin。 ...

October 5, 2024

工具函数

一、Vue.util:Vue.js的工具函数集合 Vue.util是Vue.js内部的一个工具函数集合,包含了多种实用的方法,用于处理各种常见的任务。然而,需要注意的是,Vue.util并不是Vue.js公开API的一部分,这意味着它的使用可能会随着Vue.js版本的更新而发生变化。因此,在开发过程中,应尽量避免直接使用Vue.util中的方法,而是使用Vue.js提供的公开API或其他更稳定的解决方案。 尽管如此,了解Vue.util中的一些方法仍然有助于我们更好地理解Vue.js的内部机制。例如,Vue.util.extend方法用于将一个或多个对象的属性混合到目标对象中,这在需要将多个对象合并到一个新对象中时非常有用。然而,随着Vue.js的发展,许多原本在Vue.util中的方法已经被移动到其他更合适的API中,或者被更现代的方法所替代。 二、Vue.set:动态添加响应式属性 Vue.set是Vue.js提供的一个全局方法,用于向响应式对象添加一个新的属性,并确保该属性是响应式的。在默认情况下,Vue.js只能检测到已经存在的对象的属性并将其转换为响应式属性,但对于后期动态添加的属性,Vue.js无法自动进行响应式转换。这时,就可以使用Vue.set方法手动将属性转换为响应式。 Vue.set方法接受三个参数:对象、属性名和属性值。例如: Vue.set(vm.someObject, 'newProperty', 'Hello, Vue!'); 上面的代码将someObject对象的newProperty属性设置为'Hello, Vue!',并将其转换为响应式属性。这样,当属性值发生修改时,Vue可以检测到并响应式地更新视图。 Vue.set方法的主要优势在于它能够将属性添加为响应式属性,使得Vue.js能够跟踪和响应属性值的变化,从而及时更新视图。此外,Vue.set方法还可以用于在数组中添加新元素,使其成为响应式。 三、Vue.delete:删除响应式对象的属性 Vue.delete是Vue.js提供的另一个全局方法,用于从响应式对象中删除指定的属性。与Vue.set方法类似,Vue.delete也可以触发响应式更新,使Vue能够正确追踪到属性的删除操作。 Vue.delete方法接受两个参数:要删除的属性所在的对象和要删除的属性名。例如: Vue.delete(this.someObject, 'someProperty'); 上面的代码将从someObject对象中删除someProperty属性,并相应地更新视图。 需要注意的是,Vue.delete方法只能用于响应式对象,而不能用于普通的JavaScript对象。此外,在删除数组中的元素时,Vue.js提供了一些数组特定的方法(如splice、push、pop等)来确保数组的响应式更新。因此,在删除数组元素时,应优先使用这些方法而不是Vue.delete。 四、实际应用中的注意事项 在使用Vue.set和Vue.delete等工具函数时,需要注意以下几点: 避免直接操作对象或数组:在Vue.js中,直接修改对象或数组的属性或元素可能不会触发视图更新。因此,应优先使用Vue.set和Vue提供的数组方法来修改响应式数据。 注意命名冲突:在添加新属性时,应确保属性名不与现有属性名冲突,以避免覆盖现有属性。 了解Vue.js的响应式机制:为了更好地使用Vue.set和Vue.delete等工具函数,需要了解Vue.js的响应式机制以及它是如何跟踪和响应数据变化的。 常见考点 1. Vue 内置工具函数 问题: Vue 提供了哪些内置工具函数? 这些工具函数的使用场景是什么? 考察点: Vue.set 和 Vue.delete: Vue 中的 Vue.set 和 Vue.delete 是为了响应式系统而提供的工具函数,它们用于确保在数组或对象中添加、删除元素时,能够保持数据的响应性。 Vue.set:用于向对象中添加新的属性,并确保该属性是响应式的。 Vue.set(obj, 'newProp', value); Vue.delete:用于删除对象或数组中的元素,并保持响应性。 Vue.delete(obj, 'propertyName'); Vue.delete(arr, index); Vue.nextTick: Vue.nextTick 是一个异步队列,用于在 DOM 更新后执行回调函数。它保证了在 Vue 完成 DOM 更新后,回调才会被执行。 Vue.nextTick(() => { console.log('DOM has been updated!'); }); Vue.util: Vue 提供了一些工具函数,如 Vue.util.extend 用于对象的深拷贝,Vue.util.merge 用于合并对象。 2. 自定义工具函数的常见应用 问题: 你在 Vue 项目中常用哪些自定义工具函数?请列举一些例子。 如何编写一个简单的工具函数来简化 Vue 中的日期格式化? 考察点: 日期格式化工具函数: 在 Vue 项目中,常常需要对日期进行格式化。你可以创建一个工具函数来统一处理日期格式。 在组件中使用该工具函数: // utils/date.js export function formatDate(date, format = 'YYYY-MM-DD') { const d = new Date(date); const map = { 'YYYY': d.getFullYear(), 'MM': String(d.getMonth() + 1).padStart(2, '0'), 'DD': String(d.getDate()).padStart(2, '0'), 'HH': String(d.getHours()).padStart(2, '0'), 'mm': String(d.getMinutes()).padStart(2, '0'), 'ss': String(d.getSeconds()).padStart(2, '0'), }; return format.replace(/YYYY|MM|DD|HH|mm|ss/g, matched => map[matched]); } import { formatDate } from './utils/date'; export default { data() { return { date: '2024-12-15T12:00:00', }; }, computed: { formattedDate() { return formatDate(this.date, 'YYYY-MM-DD HH:mm:ss'); } } }; 深拷贝工具函数: 在某些场景下,你可能需要深拷贝对象,避免对原始对象进行修改。 export function deepClone(obj) { return JSON.parse(JSON.stringify(obj)); } 3. Vue 的过滤器(Filters) 问题: Vue 中的过滤器有什么作用?举个例子说明。 过滤器和工具函数有何区别,何时使用过滤器,何时使用工具函数? 考察点: Vue 过滤器: 过滤器是用于格式化输出数据的一种工具,在 Vue 模板中可以直接使用,但仅适用于模板中的数据绑定。常用的场景是格式化日期、数字等。 Vue.filter('currency', function (value) { return '$' + value.toFixed(2); }); // 在模板中使用 {{ price | currency }} 工具函数与过滤器的区别: 过滤器:通常用于模板中,只能格式化输出。 工具函数:可以在组件的任何地方使用,提供更强的逻辑处理能力,适合更复杂的功能(如数据计算、事件管理等)。 4. Vuex 与工具函数 问题: 如何通过工具函数简化 Vuex 的一些操作? 你会如何编写一个工具函数来帮助管理 Vuex 中的 getter、mutation 或 action? 考察点: 在 Vuex 中,常常需要对数据进行集中管理。可以通过工具函数来简化 Vuex 操作,避免重复代码。 ...

October 5, 2024

$nextTick

nextTick 是 Vue 的一个核心实现,$nextTick方法将回调延迟到下次DOM更新循环之后执行。Vue 的 nextTick 其本质是对 JavaScript 执行原理 EventLoop 的一种应用。 nextTick 的核心是利用了如 Promise 、MutationObserver、setImmediate、setTimeout的原生 JavaScript 方法来模拟对应的微/宏任务的实现,本质是为了利用 JavaScript 的这些异步回调任务队列来实现 Vue 框架中自己的异步回调队列 前置知识 - js事件循环 JS 运行机制 JS 执行是单线程的,基于事件循环。事件循环大致分为以下步骤: 所有同步任务都在主线程上执行,形成一个执行栈。 异步任务放进任务队列,异步任务分为宏任务和微任务 执行栈所有同步任务执行完成,就会执行任务队列。对应的异步任务,结束等待状态,进入执行栈,开始执行。 主线程不断重复上面的第三步。 主线程的执行过程就是一个 tick,而所有的异步结果都是通过 “任务队列” 来调度。 消息队列中存放的是一个个的任务(task)。 task 分为两大类,分别是 macro task 和 micro task,并且每个 macro task(宏任务) 结束后,都要清空所有的 micro task(微任务)。 如图所示 for (macroTask of macroTaskQueue) { // 执行宏任务 handleMacroTask(); // 执行所有微任务 for (microTask of microTaskQueue) { handleMicroTask(microTask); } } 宏任务: script、setTimeout、setInterval、Node中的setImmediate 等 微任务: Promise.then、MutationObserver、Node 中的 Process.nextTick等 ...

October 5, 2024

异步组件

当我们的项目达到一定的规模时,对于某些组件来说,我们并不希望一开始全部加载,而是需要的时候进行加载;这样的做得目的可以很好的提高用户体验。 为了实现这个功能,Vue3中为我们提供了一个方法,即defineAsyncComponent,这个方法可以传递两种类型的参数,分别是函数类型和对象类型,接下来我们分别学习。 传递工厂函数作为参数 defineAsyncComponent方法接收一个工厂函数是它的基本用法,这个工厂函数必须返回一个Promise,Promise的resolve应该返回一个组件。 我们这里以Vue Cli创建的项目为例,这里我稍微做了一下修改,将头部的图片拆分为一个组件,代码如下: <template> <logo-img /> <hello-world msg="Welcome to Your Vue.js App" /> </template> <script setup> import LogoImg from './components/LogoImg.vue' import HelloWorld from './components/HelloWorld.vue' </script> 现在我们就将<hello-world>组件修改为异步组件,示例代码如下: <template> <logo-img /> <hello-world msg="Welcome to Your Vue.js App" /> </template> <script setup> import { defineAsyncComponent } from 'vue' import LogoImg from './components/LogoImg.vue' // 简单用法 const HelloWorld = defineAsyncComponent(() => import('./components/HelloWorld.vue'), ) </script> 我们这里为了看到效果,将import延迟执行,示例代码如下: <script setup> import { defineAsyncComponent } from 'vue' import LogoImg from './components/LogoImg.vue' // 定义一个耗时执行的函数,t 表示延迟的时间, callback 表示需要执行的函数,可选 const time = (t, callback = () => {}) => { return new Promise(resolve => { setTimeout(() => { callback() resolve() }, t) }) } // 定义异步组件,这里这样写是为了查看效果 const HelloWorld = defineAsyncComponent(() => { return new Promise((resolve, reject) => { ;(async function () { try { await time(2000) const res = await import('./components/HelloWorld.vue') resolve(res) } catch (error) { reject(error) } })() }) }) </script> 代码运行结果如下所示: ...

October 5, 2024

vue路由

从后端路由开始 路由这个概念最先是后端出现的。在以前用模板引擎开发页面时,经常会看到这样 http://www.xxx.com/login 大致流程可以看成这样: 浏览器发出请求 服务器监听到80端口(或443)有请求过来,并解析url路径 根据服务器的路由配置,返回相应信息(可以是 html 字串,也可以是 json 数据,图片等) 浏览器根据数据包的 Content-Type 来决定如何解析数据 简单来说路由就是用来跟后端服务器进行交互的一种方式,通过不同的路径,来请求不同的资源,请求不同的页面是路由的其中一种功能。 前端路由 1. hash 模式 随着 ajax 的流行,异步数据请求交互运行在不刷新浏览器的情况下进行。而异步交互体验的更高级版本就是 SPA —— 单页应用。单页应用不仅仅是在页面交互是无刷新的,连页面跳转都是无刷新的,为了实现单页应用,所以就有了前端路由。 类似于服务端路由,前端路由实现起来其实也很简单,就是匹配不同的 url 路径,进行解析,然后动态的渲染出区域 html 内容。但是这样存在一个问题,就是 url 每次变化的时候,都会造成页面的刷新。那解决问题的思路便是在改变 url 的情况下,保证页面的不刷新。在 2014 年之前,大家是通过 hash 来实现路由,url hash 就是类似于: http://www.xxx.com/#/login 这种 #。后面 hash 值的变化,并不会导致浏览器向服务器发出请求,浏览器不发出请求,也就不会刷新页面。另外每次 hash 值的变化,还会触发hashchange 这个事件,通过这个事件我们就可以知道 hash 值发生了哪些变化。然后我们便可以监听hashchange来实现更新页面部分内容的操作: function matchAndUpdate () { // todo 匹配 hash 做 dom 更新操作 } window.addEventListener('hashchange', matchAndUpdate) 2. history 模式 14年后,因为HTML5标准发布。多了两个 API,pushState 和 replaceState,通过这两个 API 可以改变 url 地址且不会发送请求。同时还有popstate 事件。通过这些就能用另一种方式来实现前端路由了,但原理都是跟 hash 实现相同的。用了 HTML5 的实现,单页路由的 url 就不会多出一个#,变得更加美观。但因为没有 # 号,所以当用户刷新页面之类的操作时,浏览器还是会给服务器发送请求。为了避免出现这种情况,所以这个实现需要服务器的支持,需要把所有路由都重定向到根页面。 ...

October 5, 2024

状态管理

本知识点将以 Pinia 为例,介绍 Vue 中的状态管理。 前言 Pinia简称小菠萝🍍,是一个专为Vue 3设计的现代化状态管理库,为Vue 3开发的,它提供了一种简单、可扩展和类型安全的方式来管理应用程序的状态。 与Vue 2中的Vuex相比,Pinia提供了更好的TypeScript支持,具有更好的类型定义和类型推断,可在编译时捕获错误,提供更高的代码可靠性和开发体验。它是专为Vue 3设计的,充分利用了Vue 3的新特性,如Composition API,以提供更直接、自然和灵活的状态管理体验。Pinia的核心概念是Store,它类似于Vuex中的模块,用于管理应用程序的状,可以将相关的状态和逻辑组合到单个Store中,使代码更清晰、结构更有组织性。除此之外海提供了许多有用的特性和功能,例如模块化组织、状态持久化、插件扩展等。 总的来说,Pinia是一个功能强大而灵活的状态管理解决方案,适用于各种规模的Vue 3应用程序。它提供了现代化的特性和工具,帮助我们更好地组织、管理和扩展应用程序的状态,同时提供了更好的类型安全和开发体验。 安装 运行安装命令 npm install pinia 在main.ts中引入 // main.ts import { createApp } from 'vue' import { createPinia } from 'pinia' import App from './App.vue' const pinia = createPinia() const app = createApp(App) app.use(pinia) app.mount('#app') 初始化Store 新建stores文件,用于存放所有的store,然后创建index.ts。 同过 defineStore() 定义一个store,它接受一个参数作为仓库名称,也就是Id。它返回一个函数,默认我们使用user开头的风格来接收。第二个参数为一个Setup函数或者Option对象。 import { defineStore } from 'pinia' export const useUsersStore = defineStore('users', { // 其他配置... }) Option Store 这种方式熟悉Vuex的很了解,传入一个带有 state、actions 与 getters 属性的 Option 对象 export const userUsersStore = defineStore('users', { state: () => { return { name: 'inkun', current: 100 } }, getters: { getName: (state) => state.name + '🐔你好帅' }, actions:{ getUserInfo { ... } } }) 在 Option Store 中: ...

October 5, 2024

服务器渲染

前言 什么是SSR(Server-Side Rendering)?类似于用Java、ASP.NET、php开发前端页面,服务端准备数据并执行页面渲染,然后把完整的HTML发送给客户端。现代化的SSR通常和Vue、React等前端框架强关联,通过Node.js在服务端提前将page、component使用同构方式渲染为html代码,其目的是在实现SSR时尽量复用一套渲染机制。例如Vue框架就同时支持了CSR(Client-Side Rendering)和SSR。 SSR能解决什么问题? SEO: Google、百度、Yandex、Bing或者Yahoo等搜索引擎会通过网络爬取你的页面并建立索引,如果的信息越完整,那么你的网站就更容易被检索到。使用SSR技术,让页面在服务端提前渲染好再返回给客户端,这样各类搜索引擎就能拿到比较完整的页面信息,提升检索质量。 首屏渲染:SPA(Single Page Application)将页面渲染放到客户端执行,并且在渲染之前要加载大量的Javascript代码,所以首屏渲染需要花费较长时间。而SSR直接在服务端渲染完再返回客户端,使用户能够快速看到页面内容。 有哪些框架支持SSR? 开源库 支持语言 star数 描述 Nuxt Vue 54.9k 快速构架、类型安全、高性能、易扩展 Next React 127k 老牌框架、社区完善、Data Fetch、Styling quasar Vue 26k 丰富的UI、支持桌面端和移动端 Remix React 29.9k 极致的用户体验、开箱即用 本知识点将以 Nuxt 为例,介绍如何实现 SSR。 什么是Nuxt 基于Vue、React、Angular实现的full-stack框架数不胜数,但就Vue框架领域内,应该数Nuxt最为Top 1。Nuxt保持了Vue生态的“开箱即用”特性,类似于Vite,几条指令就可直接run起来。如果你熟悉Vue,那么基于Nuxt写应用,体验上和写Vue客户端应用极其相似。 Nuxt提前预制了一套目录结构,并自动处理路由、导入、数据获取,开发人员仅需按约定的规则实现页面、组件、数据API即可,极大降低开发人员学习成本。Nuxt的特性可总结为: 基于文件的路由: 页面统一添加到pages/目录下,例如添加index.vue、about.vue、contact.vue,就可以通过/访问首页,通过/about返回关于页面; 代码分割:得益于Vue的Virtual Node,Nuxt根据目录规则提前生成完整的依赖树,这样能够将所有code拆分为最小单元的chunks, 从而减少应用初始化加载时间; 开箱即用的SSR:Nuxt内部使用Vue的SSR,除了Vue实现SSR、CSR本身的差异,可以像开发CSR的Vue应用一样来开发SSR,降低研发心智负担; 自动导入:在实现页面或组件时,不需要像CSR手动导入(import Card from './Card.Vue')依赖,当Nuxt识别到有使用外部组件,bundle过程会自动识别; 数据获取工具:提供一套组合式FetchAPI,实现client、server端的同构; 配置好的构建工具:默认使用Vite构建,同时支持Webpack、Rspack; Nuxt的架构设计和vue/core很相似,将整体功能拆分为独立的package: 核心引擎:nuxt; bundlers: 打包器包含@nuxt/vite-builde、nuxt/webpack-builder、@nuxt/rspack-builder; 命令行工具:nuxi; 服务端引擎:nitro; 开发套件:@nuxt/kit; 上手体验 初始化项目 使用nuxi提供的指令初始化项目: npx nuxi@latest init nuxt-learn-examples 如果安装过程下载失败,可能需要配置hosts: 185.199.108.133 raw.githubusercontent.com 最新nuxt版本3.14初始化的项目目录比较简单,少了pages、plugins等目录,入口为app.vue: ...

October 5, 2024