vue3的特性预览

907 阅读4分钟

据说,8月份vue3就正式发布了!

于是最近,听了大圣的关于vue3直播课,本文是简单总结以下内容

vue3的组成部分

  • runtime-dom(其核心是runtime-core)
  • reactivity(可以脱离浏览器独立使用)
  • compile-dom(其核心是compile-core)

vue3

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是个啥

composition

Vue 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功能,只解析,不打包

手写实现一个迷你vite

核心:

  • 路径转化
  • @vue/compiler-sfc => 解析vue文件
  • @vue/compiler-dom => 解析vue文件的html部分
  • 支持css或者其他类型的,本质上就是一个相应的loader

模板的发展史 -- vdom的由来

  • $('xx').html(xx)
  • underscore-字符串,
    写法图片
  • vdom实现按需更新:
    vdom的概念
  • vdom的简单的代码实现:
    vdom的简单的代码实现
  • 这里涉及到编译原理,有空看看这个最小的编译器,the-super-tiny-compiler,中文版

其他资源

大圣的各种账号,可以关注看看