初识vue3.0
vue3.0
源码组织方式的变化
- 采用ts重写
- 独立的功能模块提取到单独的包中
- 90%的api兼容Vue2.x
Composition API
- 组合api
- 解决vue2.x options api 开发大型项目不好拆分和重用的问题
性能提升
- 重写响应式
- 重写虚拟dom
- 提升两到三倍
Vite
- 不需要打包直接运行项目
源码组织方式
- 源码采用typescript重写
- 使用monorepo管理项目结构
- 每个模块都可以单独发布测试使用
packages 结构
packages
│ compiler-core ------ 与平台无关的编译器
│ compiler-dom ------ 浏览器平台下的编译器
│ compiler-sfc ------ 单文件组件的编译器 依赖于 core dom
| compiler-ssr ------ 服务端渲染的编译器 依赖于 dom
| reactivity ------ 响应式系统可以单独使用
| runtime-core ------ 和平台无关的运行时
| runtime-dom ------ 浏览器的运行时 处理原生dom的api事件等
| runtime-test ------ 专门为测试编写的轻量级的运行时 渲染出来的dom数是js对象 可以运行在所有的js环 境里 用来测试渲染是否正确
| server-renderer ----- 服务端渲染
| shared ------ vue内部使用的公共的api
| size-check ------ 私有的包不会发布npm 检查包的大小
| template-explorer --- 浏览器运行的实时编译组件 输出render函数
| vue ------ 构建完整版的vue 依赖于 compiler rentime
global.d.ts
不同构建版本
不再构建 umd 模块的方式 因为umd代码冗余
在packags/vue/dist 文件夹中存放了vue3的所有构建版本
cjs
commonjs 方式 完整版的vue
- vue.cjs.js 开发版本
- vue.cjs.prod.js 生产版本 代码压缩过
global
都可以在浏览器中通过script直接引入使用 引入之后会创建一个全局的vue对象
- 完整版
- vue.global.js 开发版本
- bue.global.prod.js 生产版本 代码压缩过
- 运行时
- vue.runtime.global.js 开发版本
- vue.runtime.global.prod.js 生产版本 代码压缩过
browser
都包含esm,浏览器原生模块化方式 script type="module" 方式引入
- 完整版
- vue.esm-browser.js
- vue.esm-browser.prod.js
- 运行版本
- vue.runtime.ems-browser.js
- vue.runtime.esm-browser.prod.js
bundler
没有打包所有代码 配合打包工具使用 esm 方式
- 完整版 内部导入了 runtime compiler
- vue.esm-bundle.js
- 运行时 vue最小版本
- vue.runtime.ems-bundler.js
Composition API 设计动机
Options API
- 包含一个描述组件选项(data、methods、props等)的对象
- Options API 开发复杂组件,同一个功能逻辑的代码被拆分到不同选项中
composition API
- vue.js 3.0 新增的一组API
- 一组基于函数的API
- 可以灵活的组件组件的逻辑
Options API 和 composition API 对比

相比 options api , composition api 把功能整合到一个函数 只需要在 setup 时直接获取 只需要关注功能函数

同一色块代表同一功能
options api 相同的功能代码被拆分到不同位置 不方便提取复用代码
composition api 相同的功能代码在同一位置 方便代码提取复用代码
composition api 提供了基于函数的api 可以更灵活的组织组件逻辑
vue3 中 options api 和 composition api 都可以使用
vue3 性能提升
响应式系统升级
- vue 2.x 中响应式系统的核心 defineProperty
- 初始化时遍历data中的成员 转化为get set 如果是对象需要递归处理 不管使用与否都需要在初始化时处理
- 监听不到属性的删除
- vue 3.x 中使用Proxy 对象重写响应式系统
- 可以监听动态新增的属性
- 可以监听删除的属性
- 可以监听数组的索引和length属性
- proxy 比 definePropery 性能要高
编译优化
- vue 2 中 通过标记静态根节点,优化diff过程
- vue 3 中 标记和提升所有的静态根节点, diff的时只需要通过对比动态节点内容
- fragments(升级 vetur 插件)
- 静态提升
- Patch flag
- 缓存事件处理函数
源码体积优化
- vue 3 中移除了一些不常用的API
- 例如 inline-template、filter等
- Tree-shaking
- 不会使用的api不会打包进入 vue核心文件会打入
Vtie(法语 快的意思)
ES Module
现代浏览器都支持 es module
通过下面方式加载
<script type ="module" src="..."></script>
支持模块的script 默认延迟加载
- 类似于script标签设置 defer
- 在文档解析完成后,触发DOMContentLoaded事件前执行
vite vs Vue-Cl
vite 在开发模式下不需要打包可以直接运行
vue-cli 开发模式下必须对项目打包才可以运行
Vite 在生产环境下使用Rollup打包
- 基于es Module的方式打包
vue-cli 使用webpack打包
vite 特点
- 快速冷启动
- 按需编译
- 模块热更新
vite创建项目
- vite 创建项目
npm init vite-app <项目名>
- 基于模板创建项目 可以支持其他框架 --template 加 框架名
npm init vite-app --template react
vite 拦截.vue 的请求 转换为js文件 把响应头改为 Content-Type: application/javascript; charset=UTF-8
composition api
- createApp
- 创建vue对象
import { createApp } from 'vue'
const app = createApp({
.....
})
setup() composition API 入口
- 第一个参数props
- 第二个参数 context是一个对象 有三个成员: attrs, emit, slots
- 在props 解析完毕 组件实例被创建之前执行的 无法通过this来访问组件实例 this指向 undefined
- 必须return 一个对象
- 响应式对象不能解构
import { createApp } from 'vue'
const app = createApp({
setup () {
return {
....
}
}
.....
})
- reactive api
- 把一个对象转换为响应式对象这个对象的嵌套对象也会转换为响应式对象
- 返回代理对象也就是响应式对象
import { createApp, reactive } from 'vue'
const app = createApp({
setup () {
return {
....
}
}
})
生命周期钩子函数
setup中调用生命周期狗子函数 需要在函数前面加 on 并且首字母大写
- beforeCreate
- setup在这里执行
- created
- beforeMount
- mounted
- beforeUpdate
- updated
- beforeUnmount
- unmounted
- errorCaptured
- renderTracked render函数被重新调用时触发 首次会触发
- renderTriggered 首次不触发
import { createApp, reactive, onMounted, onUnmounted} from 'vue'
const app = createApp({
setup () {
onMounted(() => {
......
})
onUnmounted(() => {
......
})
return {
......
}
}
})
reactive/ toRefs/ref
都是创建响应式
reactive 创建的响应式的对象 不能解构 function
reactive 创建的响应式的对象 代理对象解构的时候 相当于复制一份值 重新赋值的时候不会触发代理对象的get set 所以不能解构
toRefs function
把对象的每一个属性都转换成响应式对象 , toRefs 要求传入的对象必须是一个响应式对象,内部会创建一个新的对象遍历传入对象的所有属性,把所有的属性值都转换为响应式对象,挂载到新创建的对象上 返回这个新对象,她内部会为代理对象的每一个属性创建一个带有value的对象 该对象是响应式的 value具有get set ,get获取代理对象的值 set设置代理对象的值
- 模板中使用可以省略value
- 代码中使用不能省略value
ref function
把基本数据类型转换为响应式对象
ref返回一个响应式对象 具有value属性 value属性为设置的值
基本数据类型保存的是一个值
import { createApp, ref } from './node_modules/vue/dist/vue.esm-browser.js'
function useCount () {
const count = ref(0)
return {
count,
increase: () => {
count.value++
}
}
}
createApp({
setup () {
return {
...useCount()
}
}
}).mount('#app')
computed 计算属性
- 第一种方法
watch(() => count.value + 1)
- 第二种方法
- 传入一个对象具有get set方法
import { createApp, reactive, computed } from './node_modules/vue/dist/vue.esm-browser.js'
const data = [
{ text: '看书', completed: false },
{ text: '敲代码', completed: false },
{ text: '约会', completed: true }
]
createApp({
setup () {
const todos = reactive(data)
const activeCount = computed(() => {
return todos.filter(item => !item.completed).length
})
return {
activeCount,
push: () => {
todos.push({
text: '开会',
completed: false
})
}
}
}
}).mount('#app')
watch 监听器
watch的三个函数
- 第一个参数: 要监听的数据
- 第二个参数:监听到数据变化后执行的函数,这个函数有两个参数分别是新值与旧值
- 第三个参数:选项对象,deep(深度监听)和immediate (立即执行)
watch的返回值
- 取消监听的函数
import { createApp, ref, watch } from './node_modules/vue/dist/vue.esm-browser.js'
createApp({
setup () {
const question = ref('')
const answer = ref('')
watch(question, async (newValue, oldValue) => {
const response = await fetch('https://www.yesno.wtf/api')
const data = await response.json()
answer.value = data.answer
})
return {
question,
answer
}
}
}).mount('#app')
watchEffect
- 是watch函数的简化版本,也用来监视数据的变化
- 接受一个函数作为参数,监听函数内响应试数据的变化
- 返回的函数执行之后将取消监视
import { createApp, ref, watchEffect } from './node_modules/vue/dist/vue.esm-browser.js'
createApp({
setup () {
const count = ref(0)
const stop = watchEffect(() => {
console.log(count.value)
})
return {
count,
stop,
increase: () => {
count.value++
}
}
}
}).mount('#app')
初识vue3.0的更多相关文章
- 预计2019年发布的Vue3.0到底有什么不一样的地方?
摘要: Vue 3.0预览. 原文:预计今年发布的Vue3.0到底有什么不一样的地方? 作者:小肆 微信公众号:技术放肆聊 Fundebug经授权转载,版权归原作者所有. 还有几个月距离 vue2 的 ...
- 纯小白入手 vue3.0 CLI - 3.3 - 路由的导航守卫
vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 尽量把纷繁的知识,肢解重组成为可以堆砌的知识. ...
- 纯小白入手 vue3.0 CLI - 3.2 - 路由的初级使用
vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 尽量把纷繁的知识,肢解重组成为可以堆砌的知识. ...
- 纯小白入手 vue3.0 CLI - 3.1 - 路由 ( router )
vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 尽量把纷繁的知识,肢解重组成为可以堆砌的知识. ...
- 纯小白入手 vue3.0 CLI - 2.7 - 组件之间的数据流
vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 尽量把纷繁的知识,肢解重组成为可以堆砌的知识. ...
- VUE3.0升级与配置(跨域、全局scss变量等)
1.检查本机vue版本 vue -V 2.升级vue3.0命令 npm install -g @vue/cli 3.创建完项目后,在项目根目录新增vue.config.js文件,插入代码(简洁) mo ...
- 使用vue3.0和element实现后台管理模板
通过自己所学的这段时间,利用空余时间,使用vue3.0脚手架搭建的一个关于后台的管理模板,所实现功能也是模仿一个后台的界面,数据分为两种存放,一种是直接存储到mlab,这里的数据是存放这登录注册,只有 ...
- 纯小白入手 vue3.0 CLI - 2.6 - 组件的复用
vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 我的 github 地址 - vue3.0St ...
- 纯小白入手 vue3.0 CLI - 2.5 - 了解组件的三维
vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 我的 github 地址 - vue3.0St ...
随机推荐
- Dynamic CRM一对多关系的数据删除时设置自动删除关联的数据
在业务实体中主子表非常常见,然后子表可能有会有自己的子表或者多对多关系,在删除的业务场景下,删除主数据,剩余的子数据就成了脏数据, 之前的做法是,监听主表的删除事件,然后在插件中找到其下的子表数据然后 ...
- .NET 6应用程序适配国产银河麒麟V10系统随记
最近想在麒麟系统上运行.NET 6程序,经过一番折腾最终完成了,简单记录一下. 目标系统: CPU: aarch64架构(ARM64) 操作系统:银河麒麟V10高级服务器系统 银河麒麟V10系统(以下 ...
- Excel 运算符(一):算术运算符
算术运算符用于最基本的加.减.乘.除运算. 运算符 含义 实例 结果 + 加法运算 =2+3 5 - 减法运算 =5-2 3 * 乘法运算 =5*2 10 / 除法运算 =4/2 2 % 百分数 =5 ...
- rcu使用遇到问题汇总
1.3.10内核,在项目中遇到一种情况,我们根据sk指针hash到一个cpu上,然后访问该cpu对应分配的一个数据区. 然后系统会偶尔crash掉,crash掉有两种情况,一种是cred的rcu回收时 ...
- rh358 004 bind反向,转发,主从,各种资源记录 unbound ansible部署bind unbound
通过bind实现正向,反向,转发,主从,各种资源记录 7> 部署反向解析 从ip解析到fqdn vim /etc/named.conf zone "250.25.172.in-addr ...
- Zookeeper+dubbo+Springboot集成总结
1. 尽量用XML 集成,这也的Dubbo官方推荐的集成方式 自己在使用注解集成过程中发现有坑:Springmvc包扫描和dubbo包扫描冲突,导致消费端一直拿不到代理对象(null),非常蛋疼,所以 ...
- Filebeat Nginx Module 自定义字段
Filebeat Nginx Module 自定义字段 一.修改/usr/local/nginx/conf/nginx.conf中 log_format access '$remote_addr - ...
- Kubeadm搭建高可用(k8s)Kubernetes v1.24.0集群
文章转载自:https://i4t.com/5451.html 背景 Kubernetes 1.24新特性 从kubelet中移除dockershim,自1.20版本被弃用之后,dockershim组 ...
- Beats:使用 Elastic Stack 记录 Python 应用日志
文章转载自:https://elasticstack.blog.csdn.net/article/details/112259500 日志记录实际上是每个应用程序都必须具备的功能.无论你选择基于哪种技 ...
- 使Squashfs可写的办法
yiyi@yiyi-HP-Pavilion-Notebook:~/Applications/Office2016$ pwd /home/yiyi/Applications/Office2016 yiy ...