据说,8月份vue3就正式发布了!
于是最近,听了大圣的关于vue3直播课,本文是简单总结以下内容
vue3的组成部分
- runtime-dom(其核心是runtime-core)
- reactivity(可以脱离浏览器独立使用)
- compile-dom(其核心是compile-core)

vue3的特点
- 性能 (⽐vue2快了2倍,proxy => defineProperty,compile-core重写)
- 新增composition api (类似hooks)
- 新增组件Fragment, Teleport, Suspense
- 更加支持ts
compile-core是个啥
compile-core,其实就是将template变成js,返回vdom。
而vue3重写了compile-core。
vue3的vdom分析,核心点如下:
- vue2无差别标记所有的节点
- vue3动态标记节点,也就是纯静态和动态会被分别标记(一旦_createVNode传第四个参数,就是动态节点。动态节点会维护在一个数组里。且不同类型的节点会进行位运算来判定)
- 关于diff算法:vue2使用双端比较,vue3加入了最长递增子序列
composition api是个啥

以前data只是数据的集合,改数据的话,需要用methods。
而composition就是将数据和修改数据放在一块~~
- composition = @vue/reactivity + 生命周期
- setup可以将相同的东西 放在一块,比如修改某些变量,不用在data methods watch 上下横跳
- 同时可以将mixin也换成普通的function
@vue/reactivity是响应式的插件,独立于vue,可以在非浏览器中使用,关键方法ref,effect,computed,watchEffect,以下是在node中使用
// node里独立使用reactivity
// https://github.com/shengxinjing/vue3-vs-vue2/blob/master/workshop/node-reactivity/server.js
const {ref, computed,effect} = require('@vue/reactivity')
let count = ref(1)
setInterval(()=>{
count.value++
},1000)
// let double = computed(()=> count.value*2)
effect(()=>{
console.log('count is',count.value)
})
Fragment, Teleport, Suspense是个啥
- Fragment就是以后vue组件的template不需要一个根节点了
- Teleport就是可以渲染vue的组件内容,到指定的dom节点,做弹窗比较有用。因为弹窗需要渲染到最外层body下面,否则嵌套过多,蒙层可能会被父元素的transform影响
- suspend就是异步组件,可以用于加载的时候
<!-- Fragment -->
<template>
<h1>哈喽</h1>
<div>我真棒</div>
</template>
<!-- Teleport -->
<!-- 现有一个html文件 -->
<body>
<div id="app"></div>
<div id="foot-container"> </div>
<script type="module" src="/src/main.js"></script>
</body>
<!-- 写组件的时候 -->
<template>
<div class="confirm-modal">
<button @click="isOpen = true">打开</button>
<!-- 注意这一块代码 -->
<Teleport to="#foot-container">
<div v-if="isOpen">
<p>底部信息底部信息底部信息底部信息底部信息底部信息</p>
<button @click="isOpen = false">取消</button>
</div>
</Teleport>
</div>
</template>
<script>
import {ref} from 'vue'
export default {
setup(){
const isOpen = ref(false)
return {isOpen}
}
}
</script>
<!-- Suspense -->
<!-- 随便来个普通的组件 -->
<template>
<h1>一个异步小组件</h1>
</template>
<script>
function sleep(timeout) {
return new Promise(resolve => setTimeout(resolve, timeout));
}
export default {
name: "AsyncComponent",
props: {
timeout: {
type: Number,
required: true
}
},
async setup(props) {
await sleep(props.timeout);
}
};
</script>
<!-- 使用的时候 -->
<template>
<h1>Supense</h1>
<Suspense>
<template #default>
<AsyncComponent :timeout="3000" />
</template>
<template #fallback>
<h1>加载中</h1>
</template>
</Suspense>
</template>
<script>
import AsyncComponent from './AsyncComponent.vue'
export default {
components:{
AsyncComponent
}
}
</script>
vite可能取代webpack
vite是用于在开发的时候替换webpack的工具,热更新速度贼快。
最大的亮点是利用浏览器自带的import功能,只解析,不打包
核心:
- 路径转化
- @vue/compiler-sfc => 解析vue文件
- @vue/compiler-dom => 解析vue文件的html部分
- 支持css或者其他类型的,本质上就是一个相应的loader
模板的发展史 -- vdom的由来
- $('xx').html(xx)
- underscore-字符串,

- vdom实现按需更新:

- vdom的简单的代码实现:

- 这里涉及到编译原理,有空看看这个最小的编译器,the-super-tiny-compiler,中文版
其他资源
- lerna管理前端模块
- 正则可视化
- prepack实现构建时优化
- ts的语法

