【Vue3 知识第二讲】Vue3新特性、vue-devtools 调试工具、脚手架搭建

news2024/11/25 23:39:20

文章目录

    • 一、Vue3 新特性
      • 1.1 重写双向数据绑定
        • 1.1.1 Vue2 基于Object.defineProperty() 实现
        • 1.1.2 Vue3 基于Proxy 实现
      • 1.2 优化 虚拟DOM
      • 1.3 Fragments
      • 1.4 Tree shaking
      • 1.5 Composition API
    • 二、 vue-devtools 调试工具
    • 三、环境配置
    • 四、脚手架目录介绍
    • 五、SFC 语法规范解析
    • 附录:推荐采用国内淘宝镜像策略

一、Vue3 新特性

1.1 重写双向数据绑定

1.1.1 Vue2 基于Object.defineProperty() 实现

数字化管理平台
Vue3+Vite+VueRouter+Pinia+Axios+ElementPlus
权限系统-商城
个人博客地址

把 Vue 中的核心方法 defineReactive 做一些简化如下:

function defineReactive (obj, key, val, cb) {
    var dep = new Dep();
    Object.defineProperty(obj, key, {
        enumerable: true,
        configurable: true,
        get: ()=>{
            /*....依赖收集等....*/
            dep.depend()
            return val
        },
        set:newVal=> {
            val = newVal;
            /*触发回调*/
            dep.notify()
        }
    })
}

Vue通过defineReactive方法实现对需要观察的对象的每个属性进行监控。dep对象就相当于一个调度中心的作用,如果有数据用到这个属性,它就会自动收集该属性到调度中心,如果某属性发生了改变,那就会通知调度中心来更新视图。

1.1.2 Vue3 基于Proxy 实现

let proxyObj = new Proxy(obj,{
    get : function (target,prop) {
        return prop in target ? target[prop] : 0
    },
    set : function (target,prop,value) {
        target[prop] = 888;
    }
})

Proxy 与 Object.defineProperty(obj, prop, desc)方式相比有以下优势:

  • 丢掉麻烦的备份数据**
  • 省去for in 循环
  • 可以监听数组变化
    • 代码更简化
  • 可以监听动态新增的属性
  • 可以监听删除的属性
  • 可以监听数组的索引和 length 属性

1.2 优化 虚拟DOM

在Vue2中,每次更新diff,都是全量对比,Vue3则只对比带有标记的,这样大大减少了非动态内容的对比消耗

Vue Template Explorer我们可以通过这个网站看到静态标记
在这里插入图片描述

  • patch flag 优化静态树

    <span>Hello world!</span>
    <span>Hello world!</span>
    <span>Hello world!</span>
    <span>Hello world!</span>
    <span>{{msg}}</span>
    <span>Hello world!</span>
    <span>Hello world! </span>```
    
  • Vue3 编译后的 Vdom 是这个样子的

    export function render(_ctx,_cache,$props,$setup,$data,$options){return (_openBlock(),_createBlock(_Fragment,null,[
    _createvNode( "span", null,"Hello world ! "),
    _createvNode( "span",null,"Hello world! "),
    _createvNode( "span",null,"Hello world! "),
    _createvNode( "span", null,"Hello world! "),
    _createVNode("span", null,_toDisplaystring(_ctx.msg),1/* TEXT */),
    _createvNode( "span", null,"Hello world! "),
    _createvNode( "span", null,"Hello world! ")],64/*STABLE_FRAGMENT */))
    
  • 新增了 patch flag 标记

    TEXT = 1 // 动态文本节点
    CLASS=1<<1,1 // 2//动态class
    STYLE=1<<2,// 4 //动态style
    PROPS=1<<3,// 8 //动态属性,但不包含类名和样式
    FULLPR0PS=1<<4,// 16 //具有动态key属性,当key改变时,需要进行完整的diff比较。
    HYDRATE_ EVENTS = 1 << 5,// 32 //带有监听事件的节点
    STABLE FRAGMENT = 1 << 6, // 64 //一个不会改变子节点顺序的fragment
    KEYED_ FRAGMENT = 1 << 7, // 128 //带有key属性的fragment 或部分子字节有key
    UNKEYED FRAGMENT = 1<< 8, // 256 //子节点没有key 的fragment
    NEED PATCH = 1 << 9, // 512 //一个节点只会进行非props比较
    DYNAMIC_SLOTS = 1 << 10 // 1024 // 动态slot
    HOISTED = -1 // 静态节点
    BALL = -2
    

我们发现创建动态 dom 元素的时候,Vdom 除了模拟出来了它的基本信息之外,还给它加了一个标记: 1 /* TEXT */,这个标记就叫做 patch flag(补丁标记)。patch flag 的强大之处在于,当你的 diff 算法走到 _createBlock 函数的时候,会忽略所有的静态节点,只对有标记的动态节点进行对比,而且在多层的嵌套下依然有效。尽管 JavaScript 做 Vdom 的对比已经非常的快,但是 patch flag 的出现还是让 Vue3 的 Vdom 的性能得到了很大的提升,尤其是在针对大组件的时候。

1.3 Fragments

  • vue3 允许我们支持多个根节点

    <div>Hello World</div>
    <div>Hello Vue</div>
    <div :key="index" v-for="item,index in [10,20,304]">{{item}}</div>
    
  • 同时支持render JSX 写法

    render() {
        return (
            <>
                {this.visable ? (
                    <div>{this.obj.name}</div>
                ) : (
                    <div>{this.obj.price}</div>
                )}
                <input v-model={this.val}></input>
                {[1, 2, 3].map((v) => {
                   return <div>{v}-----</div>;
                })}
            </>
        );
    },
    
  • 同时新增了Suspense teleport 和 多 v-model 用法

1.4 Tree shaking

简单来讲,就是在保持代码运行结果不变的前提下,去除无用的代码。

在Vue2中,无论我们使用什么功能,它们最终都会出现在生产代码中。主要原因是Vue实例在项目中是单例的,捆绑程序无法检测到该对象的哪些属性在代码中被使用到。而 Vue3源码引入tree shaking特性,将全局 API 进行分块。如果你不使用其某些功能,它们将不会包含在你的基础包中。就是比如你要用watch 就是import {watch} from ‘vue’ 其他的computed 没用到就不会给你打包减少体积

1.5 Composition API

组合式 API (Composition API) 是一系列 API 的集合,使我们可以使用函数而不是声明选项的方式书写 Vue 组件。它是一个概括性的术语,涵盖了以下方面的 API:

响应式 API:例如 ref() 和 reactive(),使我们可以直接创建响应式状态、计算属性和侦听器。

生命周期钩子:例如 onMounted() 和 onUnmounted(),使我们可以在组件各个生命周期阶段添加逻辑。

依赖注入:例如 provide() 和 inject(),使我们可以在使用响应式 API 时,利用 Vue 的依赖注入系统。

组合式 API 是 Vue 3 及 Vue 2.7 的内置功能。对于更老的 Vue 2 版本,可以使用官方维护的插件 @vue/composition-api。在 Vue 3 中,组合式 API 基本上都会配合

<script setup>
	import { ref, onMounted } from 'vue'
	
	// 响应式状态
	const count = ref(0)
	
	// 更改状态、触发更新的函数
	function increment() {
	  count.value++
	}
	
	// 生命周期钩子
	onMounted(() => {
	  console.log(`计数器初始值为 ${count.value}。`)
	})
</script>

<template>
  <button @click="increment">点击了:{{ count }} 次</button>
</template>

使用组合式 API 有以下几点优势:

  • 更好的逻辑复用
    组合式 API 最基本的优势是它使我们能够通过组合函数来实现更加简洁高效的逻辑复用。在选项式 API 中我们主要的逻辑复用机制是 mixins,而组合式 API 解决了 mixins 的所有缺陷。
    组合式 API 提供的逻辑复用能力孵化了一些非常棒的社区项目,比如 VueUse,一个不断成长的工具型组合式函数集合。
  • 更灵活的代码组织
    同一个逻辑关注点相关的代码被归为了一组:我们无需再为了一个逻辑关注点在不同的选项块间来回滚动切换。此外,我们现在可以很轻松地将这一组代码移动到一个外部文件中,不再需要为了抽象而重新组织代码,大大降低了重构成本,这在长期维护的大型项目中非常关键。
  • 更好的类型推导
    组合式 API 主要利用基本的变量和函数,它们本身就是类型友好的。用组合式 API 重写的代码可以享受到完整的类型推导,不需要书写太多类型标注。大多数时候,用 TypeScript 书写的组合式 API 代码和用 JavaScript 写都差不太多!
  • 更小的生产包体积
    搭配 <script setup> 使用组合式 API 比等价情况下的选项式 API 更高效,对代码压缩也更友好。这是由于 <script setup> 形式书写的组件模板被编译为了一个内联函数,和 <script setup> 中的代码位于同一作用域。不像选项式 API 需要依赖 this 上下文对象访问属性,被编译的模板可以直接访问 <script setup> 中定义的变量,无需从实例中代理。这对代码压缩更友好,因为本地变量的名字可以被压缩,但对象的属性名则不能。

二、 vue-devtools 调试工具

vue 官方提供的vue-devtools调试工具,能够方便开发者对vue 项目进行调试与开发。Chrome 浏览器在线安装vue-devtools

  • vue 2.x 调试工具

    https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd

  • vue 3.x 调试工具

    https://chrome.google.com/webstore/detail/vuejs-devtools/ljjemllljcmogpfapbkkighbhhppjdbg

注意:vue2 和vue3 的浏览器调试工具不能交叉使用!

点击Chrome 浏览器右上角的 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-clRSTwtM-1672016260783)(Vue3课程笔记导读.assets/image-20221225220407446.png)] 按钮,选择更多工具-> 扩展程序-> Vue.js devtools 详细信息,并勾选如下的两个选项:
在这里插入图片描述

注意:修改完配置项,须重启浏览器才能生效!

在浏览器中访问一个使用了vue 的页面,打开浏览器的开发者工具,切换到Vue 面板,即可使用vue-devtools调试当前的页面。
在这里插入图片描述

三、环境配置

  1. 开发环境:Vite3+ Vue3

    • 兼容性:Vite 需要 Node.js版本 14.18+,16+。然而,有些模板需要依赖更高的 Node 版本才能正常运行,当你的包管理器发出警告时,请注意升级你的 Node 版本。
    • Vue3 采用组合式 API
  2. 官方推荐的 IDE 配置: Visual Studio Code

  3. Vite 搭建脚手架

    执行如下命令初始化项目

    npm init vue@latest
    

    这一指令将会安装并执行 create-vue,它是 Vue 官方的项目脚手架工具。你将会看到一些诸如 TypeScript 和测试支持之类的可选功能提示:

    ✔ Project name: … <your-project-name>
    ✔ Add TypeScript? … No / Yes
    ✔ Add JSX Support? … No / Yes
    ✔ Add Vue Router for Single Page Application development? … No / Yes
    ✔ Add Pinia for state management? … No / Yes
    ✔ Add Vitest for Unit testing? … No / Yes
    ✔ Add Cypress for both Unit and End-to-End testing? … No / Yes
    ✔ Add ESLint for code quality? … No / Yes
    ✔ Add Prettier for code formatting? … No / Yes
    
    Scaffolding project in ./<your-project-name>...
    Done.
    

    如果不确定是否要开启某个功能,你可以直接按下回车键选择 No。在项目被创建后,通过以下步骤安装依赖并启动开发服务器:

    cd <your-project-name>
    npm install
    npm run dev
    

    注:也可以采用 vite 官方命令配置 vue 项目:

    npm init vite@latest
    # or
    npm create vite@latest
    

    安装 sass 预处理语言:

    npm install --save-dev sass
    

四、脚手架目录介绍

  • public 下面的不会被编译 可以存放静态资源
  • assets 下面可以存放可编译的静态资源
  • components 下面用来存放我们的组件
  • router 存放路由相关文件
  • stores 存放状态管理相关文件
  • App.vue 是全局组件
  • main.js 全局的 js 文件
  • index.html 非常重要的入口文件 (Vite 的入口文件是一个 html 文件,他刚开始不会编译这些 js 文件 只有当你用到的时候 如script src=“xxxxx.js” 会发起一个请求被vite拦截这时候才会解析js文件)
  • vite.config.js 这是vite的配置文件具体配置项 后面会详解

五、SFC 语法规范解析

*.vue 件都由三种类型的顶层语法块所组成:<template><script><style>

  • <template>
    • 每个 *.vue 文件最多可同时包含一个顶层 <template> 块。
    • 其中的内容会被提取出来并传递给 @vue/compiler-dom,预编译为 JavaScript 的渲染函数,并附属到导出的组件上作为其 render 选项。
  • <script>
    • 每一个*.vue文件可以有多个 <script> 块 (不包括<script setup>)
    • 该脚本将作为 ES Module 来执行。
    • 其默认导出的内容应该是 Vue 组件选项对象,它要么是一个普通的对象,要么是 defineComponent 的返回值。
  • <script setup>
    • 每个 *.vue 文件最多只能有一个 <script setup> 块 (不包括常规的 <script>)
    • 该脚本会被预处理并作为组件的 setup() 函数使用,也就是说它会在每个组件实例中执行。<script setup> 的顶层绑定会自动暴露给模板。更多详情请查看 <script setup> 文档。
  • <style>
    • 一个 *.vue 文件可以包含多个 <style> 标签。
    • <style>标签可以通过 scoped module attribute (更多详情请查看 SFC 样式特性) 将样式封装在当前组件内。多个不同封装模式的 <style> 标签可以在同一个组件中混用。

附录:推荐采用国内淘宝镜像策略

全局安装淘宝镜像

npm install -g cnpm --registry=https://registry.npm.taobao.org 

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

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

相关文章

打包——使用pyinstaller打包解决dll丢失问题

我们通常使用pyinstaller或者其对应的图形化的auto-py-to-exe来生成exe可执行文件时,换了一个电脑经常会出现报错,特别是我们当前开发大多数使用温室操作系统,而很多用户使用的是win7操作系统,这就造成了会提示缺少dll文件。如下图: 笔者总结了解决此问题的经验总结如下。…

做外贸的时候意见不被上级采纳真的错了吗

某日晚上&#xff0c;听了一场直播&#xff0c;然后有一个小伙伴在直播间里说自己很苦恼&#xff0c;为什么自己所有的意见老板都不采纳&#xff0c;都要给否决掉&#xff0c;感觉老板是故意针对她自己的。 事情的起因是因为这个业务员自己通过社媒开发出了一个客户&#xff0…

为什么选择搭建虚拟展会?如何搭建虚拟展会能给企业带来帮助

引言&#xff1a; 在当今数字化时代&#xff0c;宣传策略正在不断演变&#xff0c;企业需要跟上时代的脚步&#xff0c;这为企业带来了更多的机会和挑战。虚拟展会作为一种创新性的宣传手段&#xff0c;正逐渐受到企业的重视和青睐。 一&#xff0e;为什么选择搭建虚拟展会&am…

循环购模式:白酒企业的电商新机遇

白酒是中国传统的酒类&#xff0c;也是社交场合的必备佳品。白酒的品牌众多&#xff0c;竞争激烈&#xff0c;如何在电商市场中脱颖而出&#xff0c;提升销量和品牌影响力呢&#xff1f;循环购模式或许是一个新的答案。 循环购模式是一种新型的电商营销方式&#xff0c;它让消费…

day 44 | ● 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费

309.最佳买卖股票时机含冷冻期 此外&#xff0c;在返回的时候&#xff0c;由于状态234都是卖出的状态&#xff0c;所以要比较其最大值进行返回。 func maxProfit(prices []int) int {dp : make([][]int, len(prices))dp[0] make([]int, 4)dp[0][0] -prices[0]for i : 1; i &…

经纬恒润预期功能安全(SOTIF)解决方案为自动驾驶安全保驾护航

近年来&#xff0c;“安全”被普遍认为是智能驾驶汽车被用户接受或者得到商业应用最大的问题&#xff0c;ISO26262功能安全旨在避免由E/E系统功能失效导致的不可接受的风险&#xff0c;主要是针对系统性失效/随机硬件失效导致的风险进行分析和控制&#xff0c;然而传感器和感知…

安防监控/视频存储/视频汇聚平台EasyCVR接入海康Ehome车载设备出现收流超时的原因排查

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。视频汇聚平台既具…

2024河南太阳能光伏展览会|郑州光伏展会|郑州太阳能展会

2024第四届中国&#xff08;郑州&#xff09;太阳能光伏及储能产业展览会 时间&#xff1a;2024年2月26-28日 地点&#xff1a;郑州.中原国际博览中心 太阳能光伏及储能产业是未来能源发展的趋势&#xff0c;随着全球气候变化和能源危机的加剧&#xff0c;越来越多的国家开始…

ExpressLRS开源代码之工程结构

ExpressLRS开源代码之工程结构 1. 源由2. 工程3. 开发环境安装4. pio命令5. ExpressLRS配置6. 硬件认证过程7. 参考资料 1. 源由 ExpressLRS开源代码基于Arduino框架设计&#xff0c;在所支持的硬件环境下&#xff0c;提供900/2400发射机和接收机硬件方案。 该设计提供了一个…

25.选择排序,归并排序,基数排序

目录 一. 选择排序 &#xff08;1&#xff09;简单选择排序 &#xff08;2&#xff09;堆排序 二. 归并排序 三. 基数排序 四. 各种排序方法的比较 &#xff08;1&#xff09;时间性能 &#xff08;2&#xff09;空间性能 &#xff08;3&#xff09;排序方法的稳定性能…

港联证券|股票过户费是什么意思?

股票过户费是指在股票商场中&#xff0c;由于股份所有权的转让&#xff0c;双方需求付出的一种买卖费用。这种费用首要是为了付出证券公司和证券中介机构转让股票所发生的各项费用&#xff0c;如代理费、登记费、买卖税等。股票过户费的数额一般是按照股票的数量和买卖金额来核…

ffmpeg 配合Fiddler抓包获取视频操作

一&#xff0e;获取普通网站视频 1.安装Fiddler软件&#xff0c;直接点击绿色软件中Fiddler.exe&#xff0c;打开即可 2.打开后需要设置一下https解码 3.打开普通视频&#xff0c;获取视频链接在网页打开即可 二&#xff0e;获取一级反爬网站视频 1.随便找一个video/mp…

Redis主从复制的搭建及原理分析

目录 一、Redis主从复制 1.1 搭建主从复制架构 1.1.1 主从复制架构简介 1.1.2 搭建主从复制架构 1.2 主从复制工作流程 1.2.1 建立连接阶段 1.2.2 数据同步阶段 1.2.2.1 工作流程 1.2.2.2 增量同步原理 1.2.3 命令传播阶段 1.2.3.1 偏移量&#xff08;offset&#xf…

固定资产太多怎么管理好

固定资产太多时&#xff0c;可以采取以下措施进行管理&#xff1a;  分类管理&#xff1a;将固定资产按照种类、用途等进行分类&#xff0c;便于管理和查询。  建立台账&#xff1a;建立固定资产台账&#xff0c;记录每项资产的名称、编号、购置日期、购买价格、使用部门、…

keil在点击debug无法运行(全速运行)

1、今天发现我之前可以debug的程序&#xff0c;在板子上无法debug了&#xff0c;打断点完全没用 2、换了电脑&#xff0c;带板子过去也这样&#xff0c;之前可以运行的代码都debug不了 3、按照网上的方法&#xff0c;都不行&#xff0c;全速运行&#xff0c;单步执行都是灰色…

nodejs pkg打包生成exe,设置自定义图标和产品信息

一、使用node开发应用程序,通常采用express框架进行功能扩展,当系统开发完成后,直接的方式就是采用gulp压缩后,在服务端运行node app.js命令执行,to C的系统这样开发部署没有问题。 二、而在to B,to G的项目中,采用源码的方式运行,一方面部署不太友好,需要拷贝的文件很…

Python随机森林、线性回归对COVID-19疫情、汇率数据预测死亡率、病例数、失业率影响可视化...

全文链接&#xff1a;https://tecdat.cn/?p33536 自2019年12月以来&#xff0c;传染性冠状病毒疾病2019&#xff08;COVID-19&#xff09;迅速席卷全球&#xff0c;并在短短几个月内达到了大流行状态&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 相关视频…

双基证券:中国房地产开发投资可能已经见底 未来或将反弹

双基证券表示&#xff0c;差别化住宅信贷方针优化调整&#xff0c;估计将和前期认房不认贷的方针一起构成合力&#xff0c;助力居民减轻置业担负&#xff0c;有利于加快开释合理住宅需求。这也显示了方针积极有为&#xff0c;决断致力于防危险和稳增长。存量房贷利率重定价&…

sort排序字母+数字混合排序

使用ocaleCompare进行排序后&#xff0c;发现排序后的顺序是这样的&#xff08;为什么会这样排序&#xff0c;可以自己去研究一下&#xff09;&#xff0c;但这并不是自己想要的。期望顺序&#xff1a;A-11&#xff0c;A-22&#xff0c;A-111&#xff0c;A-222 在网上查找了半…

企业架构LNMP学习笔记2

企业架构分布式集群最终解决方案 集群&#xff1a;多台服务器在一起做同样的事情。 分布式&#xff1a;多台服务器在一起做不同的事情。 最终架构&#xff1a;实现负载均衡LB&#xff0c;高可用HA&#xff0c;数据库主从复制M-S&#xff0c;读写分离R-W&#xff0c;缓存中间件…