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的更多相关文章

  1. 预计2019年发布的Vue3.0到底有什么不一样的地方?

    摘要: Vue 3.0预览. 原文:预计今年发布的Vue3.0到底有什么不一样的地方? 作者:小肆 微信公众号:技术放肆聊 Fundebug经授权转载,版权归原作者所有. 还有几个月距离 vue2 的 ...

  2. 纯小白入手 vue3.0 CLI - 3.3 - 路由的导航守卫

    vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 尽量把纷繁的知识,肢解重组成为可以堆砌的知识. ...

  3. 纯小白入手 vue3.0 CLI - 3.2 - 路由的初级使用

    vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 尽量把纷繁的知识,肢解重组成为可以堆砌的知识. ...

  4. 纯小白入手 vue3.0 CLI - 3.1 - 路由 ( router )

    vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 尽量把纷繁的知识,肢解重组成为可以堆砌的知识. ...

  5. 纯小白入手 vue3.0 CLI - 2.7 - 组件之间的数据流

    vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 尽量把纷繁的知识,肢解重组成为可以堆砌的知识. ...

  6. VUE3.0升级与配置(跨域、全局scss变量等)

    1.检查本机vue版本 vue -V 2.升级vue3.0命令 npm install -g @vue/cli 3.创建完项目后,在项目根目录新增vue.config.js文件,插入代码(简洁) mo ...

  7. 使用vue3.0和element实现后台管理模板

    通过自己所学的这段时间,利用空余时间,使用vue3.0脚手架搭建的一个关于后台的管理模板,所实现功能也是模仿一个后台的界面,数据分为两种存放,一种是直接存储到mlab,这里的数据是存放这登录注册,只有 ...

  8. 纯小白入手 vue3.0 CLI - 2.6 - 组件的复用

    vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 我的 github 地址 - vue3.0St ...

  9. 纯小白入手 vue3.0 CLI - 2.5 - 了解组件的三维

    vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 我的 github 地址 - vue3.0St ...

随机推荐

  1. [Android开发学iOS系列] 工具篇: Xcode使用和快捷键

    [Android开发学iOS系列] 工具篇: Xcode使用和快捷键 工欲善其事必先利其器. 编辑 Cmd + N: 新建文件 Option + Cmd + N: 新建文件夹 Cmd + / : 注释 ...

  2. 逐层阅读 research paper:Dmitry Berenson 的方法论

    本博客翻译了 这篇文章,包含很实用的 读论文的方法论. 读论文的四个 layers 在读论文之前,要首先搞清楚,自己读论文的目的是什么,或者 希望读到什么程度. 下表列出了常见的读论文目的,以及相应的 ...

  3. Semaphore-停车场

    模拟20辆车进停车场 停车场容纳总停车量5. 当一辆车进入停车场后,显示牌的剩余车位数响应的减1. 每有一辆车驶出停车场后,显示牌的剩余车位数响应的加1. 停车场剩余车位不足时,车辆只能在外面等待 p ...

  4. (四连测)滑雪场的高度差题解---二分 + 搜索---DD(XYX)​​​​​​​的博客

    滑雪场的高度差 时间限制: 1 Sec  内存限制: 128 MB 题目描述 滑雪场可以看成M x N的网格状山地(1 <= M,N <= 500),每个网格是一个近似的平面,具有水平高度 ...

  5. CF165D Beard Graph(dfs序+树状数组)

    题面 题解 乍一看,单点修改,单链查询,用树链剖分维护每条链上白边的数量就完了, 还是--得写树链剖分吗?--3e5,乘两个log会T吗-- (双手颤抖) (纠结) 不!绝不写树链剖分! 这题如果能维 ...

  6. 移动/联通APN提升

    绝大部分的时候信号满格速度特别慢 解决办法不一定对所有人有效可尝试一下 一般流程手机的设置-移动网络-移动数据-接入点名称(APN)-新建APN 中国移动如下配置 名称:随便写 APN:cmtds m ...

  7. PHP一句话简单免杀

    PHP一句话简单免杀 原型 几种已经开源的免杀思路 拆解合并 <?php $ch = explode(".","hello.ev.world.a.l"); ...

  8. 【java】学习路径28-Java集合类知识点总结+练习题(去重)

    Java集合 1.集合和数组的区别 (1)  集合可以改变长度 (2)  数组长度不可变 2.ArrayList (1)  add addAll (2)  remove removeAll (3)   ...

  9. java代码审计的点

    java代码审计的点 组件的审计 首先看pom.xml查看第三方组件和第三方组件的版本 常用的第三方组件: 第三方组件 漏洞类型 组件漏洞版本 log4j2 远程代码执行 Apache log4j2 ...

  10. 尝试阅读理解一份linux shell脚本

    以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「englyf」https://www.cnblogs.com/englyf/p/16721350.html 从头一二去阅读语法和命令说明 ...