vue2 vue3区别
vue3优化vdom
在v2中,每次更新都diff 全量对比, v3只对比有标记的 这样大大减少了非动态内容的对比消耗 提高性能
fragment
v3支持多个根节点
支持render jsx写法 类似于react
支持多v-model用法
treeshaking
保持代码运行结果不变的前期下,去除无用的代码
在v2中 无论我们使用什么功能 他最终一定会在生成代码中,主要原因是vue实例在项目中是单例的,option API捆绑程序无法检测到该对象的哪些属性在代码中被使用到
v3引入treeshaking特性 将全局api分块,如果你不使用某些功能 他不会包含在你的基础包中
例子:你要用watch import {watch} from 'vue' 想用什么引什么 其它的computed没用到 不会给你打包 减少体积
v3 组合式api
setup 函数时编程 也称vue hook
vite
冷服务:默认的构建目标浏览器是能在script标签上支持原生ESM 和原生ESM动态导入
HMR 速度快到惊人的模块热更新HMR 比如说只更改一小块东西 只更新那一小块 不是刷新全部的dom
Rollup打包 它使用rollup打包代码 并且是与配置的 支持大部分rollup插件
初始化项目
npm init vite@latest
cli
基于webpack 依赖多 慢
nvm
专门针对node版本进行管理的工具 通过它可以安装和切换不同版本的nodejs
使用场景
很多项目 其中老项目用v2.5左右 webpack版本也比较低 只能使用10.16.0左右的node版本 但是也有一些项目需要高版本的node 这时候就可以用nvm切换node
安装
安装前要卸载所有node有关
Win10下完全卸载node并安装nvm-windows心刻的博客-CSDN博客win10卸载node
Releases · coreybutler/nvm-windows · GitHub
nrm
是一个npm源管理器 允许你快速的在npm源间切换
安装
npm install -g nrm
nrm ls 查看可选源 星号表示当前使用源
npm ---------- https://registry.npmjs.org/
yarn --------- https://registry.yarnpkg.com/
tencent ------ https://mirrors.cloud.tencent.com/npm/
cnpm --------- https://r.cnpmjs.org/
taobao ------- https://registry.npmmirror.com/
npmMirror ---- https://skimdb.npmjs.com/registry/
nrm use切换源
nrm add (name)(源) 添加源
nrm test npm 测试
public静态资源 不编译
assets编译 比如图片编译成base64
setup、template只能写一个
npm run dev
为什么不npm run vite : 没有配置vite命令
为什么dev就可以:
使用软链接技术
vite源码
node_module/vite/package.json
配置了bin
"bin":{
"vite":"bin/vite.js" //配置了软链接
}
安装module时 会把软链接地址提出来 放到 bin 目录下
执行npm run dev时 从当前目录查找bin 有就去执行
没有会去全局的nodemodule找 如果这个找不到 会去环境变量中找
我们是找得到的 会执行vite下的脚本 执行vite.js
vue3 使用volar插件 要把vetur 禁用
volar 代码切片 实时预览等功能
模板语法&vue指令
模板插值语法
<script setup lang="ts">
const a = 0
</script>
<template>
<div>
{{a + 1}}
</div>
</template>
常用指令与v2差不多
v-if
切换真假dom 浪费性能 注释结点
v-show
操作css 性能好
<div @click="show(2)" class="out">
<div @click="show(1)" class="in"></div>
</div>
<!-- 冒泡 子父都触发 -->
<div @click="show(2)" class="out">
<div @click.stop="show(1)" class="in"></div>
</div>
<!-- 通过stop阻止冒泡 -->
<form action="">
<button type="submit" @click.prevent="show(1)">submit</button>
</form>
<!-- 通过prevent阻止默认行为 -->
v-bind
<script setup lang="ts">
type Style = {
color:string,
height:string
}
const style:Style = {
color:'blue',
height:'20px'
}
</script>
<template>
<div :style="style">test</div>
</template>
动态绑定class 对象写法 {类名:是否绑定(bool)}
v-model
要让数据先变成响应式数据ref
<script setup lang="ts">
import { ref } from "@vue/reactivity"
const a = ref('abs')
</script>
<template>
<input type="text" v-model="a">
<div>{{a}}</div>
</template>
虚拟DOM &diff算法
虚拟dom : 通过JS来生成一个AST节点树
其实就是 vue代码 能转化为用js描述的代码 用js虚拟出来的dom
为什么要有虚拟dom
例子
let div = document.createElement('div')
let str = ''
for(const key in div){
str += key +''
}
console.log(str)
打印一个div上的所有属性 特别多 所以直接操作dom 性能要付出很多代价
但是操作js非常快 所以我们可以用js的计算性能来换取操作dom所消耗的性能
逃不掉操作DOM 但可以尽可能少去操作DOM
DIFF算法
例子
<script setup lang="ts">
const arr :Array<string> = ['abc','s','s']
arr.splice(2,0,'22')
</script>
<template>
<div v-for="item,idx in arr" :key="idx">{{item}}</div>
</template>
分为有key 和无key的处理方法
无key 源码中patch函数会覆盖(替换)
一样的放回 不一样的覆盖 遍历时取两数组长度的较小值(以防数组越界)
非常浪费性能 这里的CD完全可以复用 不用覆盖
有key
- 先比前面的 不一样就跳过(前序对比算法)
-
再从后面对比(尾序对比算法)
-
新数组中多出来 就挂载 通过patch函数 第一个参数为null
-
如果是删除的 就卸载
- 把DE都标记 尽可能的复用 (乱序情况)