Vue3.0 介绍

2021-04-16  本文已影响0人  翔子丶
源码组织方式
image-20210412192848527.png

compiler开头的包都是和编译相关的代码,compiler-core是和平台无关的编译器,compiler-dom是浏览器平台下的编译器,依赖compiler-corecompiler-sfc(single file component)单文件组件,用于编译单文件组件,依赖compiler-corecompiler-domcompiler-ssr是和服务端渲染相关的编译器,依赖compiler-dom

reactivity是数据响应式系统,可单独使用

runtime开发的包都是运行时代码,runtime-core是和平台无关的运行时,runtime-dom是针对浏览器的运行时,处理原生 DOM API、事件等;runtime-test是为测试而编写的轻量的运行时,渲染出的 DOM 树是一个 js 对象,所以这个运行时可以运行在所有的 js 环境里,用它来测试渲染是否正确,还可以用于序列化 DOM、触发 DOM 事件以及记录某次更新中的 DOM 操作

server-renderer是服务端渲染

shared是 vue 内部使用的一些公共 API

size-check是私有包,不会发布到 npm,用于在 tree-shaking 后检查包的大小

template-explorer是在浏览器里运行的实时编译组件,会输出 render 函数

vue构建完整版 vue,依赖于compilerruntime

Vue.js3.0 不同构建版本

构建不同版本,用于不同的场合,和 vue2.x 不同的是,不再构建 umd 模块方式,umd 模块方式会让代码更加冗余

Composition API

设计动机

同一色块代表同一功能,Options API 中相同的代码被拆分在不同位置,不方便提取重用代码

Composition API 同一功能代码不需要拆分,有利于代码重用和维护

性能提升

首先使用_createBlock给根 div 创建 block,是树结构,然后通过_createVNode创建子节点,相当于h函数,当删除根节点时,会创建_Fragment片段

image-20210413083059655.png image-20210413083558220.png

可以看到在动态节点<div>{{ count }}</div>通过_createVNode渲染后,最终会有数字1,这就是 Patch flag。作为一个标记,将来在执行 diff 时会检查整个block中带 Patch flag 标记的节点,如果 Patch flag 值为1,代表文本内容时动态绑定,所以只会比较文本内容是否发生变化

image-20210413084010181.png

此时在给当前 div 绑定一个 id 属性,可以看到 Patch flag 变为9,代表当前节点的文本和 PROPS 是动态内容,并且记录动态绑定的 PROPS 是 id,将来 diff 时只会检查此节点的文本和 id 属性是否发生变化,从而提升 diff 性能

image-20210413084318107.png

开启缓存后,首次渲染时会生成新的函数,并将函数缓存到_cache对象中,将来再次调用 render 时,会从缓存中获取

Vite

学习 Vite 前,先需要了解 ES Module

案例项目地址

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="app">Hello world!</div>
    <script>
      window.addEventListener('DOMContentLoaded', () => {
        console.log('DOMContentLoaded')
      })
    </script>
    <script type="module" src="./modules/index.js"></script>
  </body>
</html>
// modules/index.js
import { forEach } from './utils.js'

const app = document.querySelector('#app')
console.log(app.innerHTML)

const arr = [1, 2, 3]
forEach(arr, (item) => {
  console.log(item)
})

type="module"方式引入时需要在服务器中运行项目,在 vsCode 中安装插件live-server,右键启动项目

image-20210413103509503.png

打开浏览器控制台,可以看到输出结果如下所示,可以看到index.js模块在文档解析完成后,触发 DOMContentLoaded 事件前执行

image-20210413085620461.png

Vite vs Vue-Cli

Vite 特点

使用 Vite 创建基于 vue3 项目

npm install create-vite-app -g
npm init vite-app <project-name>
cd <project-name>
npm install
npm run dev

基于模板创建项目

npm init vite-app --template react
npm init vite-app --template preact

案例项目地址

通过 create-vite-app 创建完项目之后,App.vue 会有 eslint 语法错误,原因是 Vetur 插件还没有更新

image-20210413085824316.png

解决:文件 --> 首选项 --> 设置 --> 搜索 eslint-plugin-vue --> Vetur › Validation: Template 取消勾选

image-20210413095847513.png

通过 npm run dev 启动项目

开发环境下,vite 开启 web 服务器后,会劫持.vue 结尾的文件,将.vue 文件转换为 js 文件,并将响应中的 content-type 设置为 application/javascript,告诉浏览器是 js 脚本

image-20210413113538441.png
上一篇 下一篇

猜你喜欢

热点阅读