首页 > 编程语言 >从零实现vue3核心源码 day1

从零实现vue3核心源码 day1

时间:2024-04-03 10:25:02浏览次数:26  
标签:DOM 渲染 day1 编译 虚拟 命令式 vue3 源码

1. 声明式框架

Vue3依旧是声明式的框架,用起来简单。

命令式和声明式区别

  • 早在JQ的时代编写的代码都是命令式的,命令式框架重要特点就是关注过程
  • 声明式框架更加关注结果。命令式的代码封装到了vue.js中,过程靠vue.js来实现

声明式代码更加简单,不需要关注实现,按照要求填代码就可以 (给上原材料就出结果)

- 命令式编程:
let numbers = [1,2,3,4,5]
let total = 0
for(let i = 0; i < numbers.length; i++) {
  total += numbers[i] - 关注了过程
}
console.log(total)

- 声明式编程:
let total2 = numbers.reduce(function (memo,current) {
  return memo + current
},0)
console.log(total2)

简单来说,命令式我们需要先获取 DOM 节点, 然后再操作 DOM, 去渲染我们的内容。编写代码时我们更关注的是过程。

声明式我们更加关注结果,不需要考虑操作 DOM, 操作 DOM 交给 vue.js 进行处理, 我们更加关注数据,通过特定语法便可以渲染到页面上。

2. 采用虚拟DOM

传统更新页面,获取一个 DOM 节点, 拼接一个完整的字符串 innerHTML 放入节点进行渲染。如果数据更新,需要重新进行渲染。有可能大部分节点并没有发生改变,但是依然被更新。

添加虚拟DOM后,可以比较新旧虚拟节点,找到变化在进行更新。虚拟DOM就是一个对象,用来描述真实DOM的

const vnode = {
    __v_isVNode: true,
    __v_skip: true,
    type,
    props,
    key: props && normalizeKey(props),
    ref: props && normalizeRef(props),
    children,
    component: null,
    el: null,
    patchFlag,
    dynamicProps,
    dynamicChildren: null,
    appContext: null
} 

虚拟 DOM 还有一个优势是 跨平台, 如微信小程序, uniapp,单元测试。

3. 区分编译时和运行时

  • 我们需要有一个虚拟DOM,调用渲染方法将虚拟DOM渲染成真实DOM (缺点就是虚拟DOM编写麻烦)
  • 专门写个编译时可以将模板编译成虚拟DOM (在构建的时候进行编译性能更高,不需要再运行的时候进行编译,而且vue3在编译中做了很多优化)

开发时我们用的编译模式,将 HTML 模板编译为虚拟 DOM ,最终运行时将编译的虚拟 DOM 渲染为真实 DOM, 不用再次执行编译过程。

4. Vue3 设计思想

  • Vue3 更注重模块的拆分,在2.0我们无法单独使用某个模块(如响应式模块),需要完整的引入 vue.js。vue3 模块耦合度低,可以单独使用。拆分模块
  • Vue2 中很多方法,组件即使没使用到也会打包。vue3 通过 Tree-shaking 实现按需引入,减少打包体积。移除了不需要的功能(filter,inline-template)。重写API
  • Vue3实现自定义渲染器,扩展能力强。改写渲染方式更加简单。扩展方便

5. 项目结构

image.png

标签:DOM,渲染,day1,编译,虚拟,命令式,vue3,源码
From: https://www.cnblogs.com/JankinLiu/p/18112073

相关文章

  • 【毕业设计】基于单片机的汽车尾灯电路设计与实现(附原理图与源码)
    1引言在日新月异的21世纪里,电子产品得到了迅速发展。许多电器设备都趋于人性化、智能化,这些电器设备大部分都含有CPU控制器或者是单片机。单片机以其高可靠性、高性价比、低电压、低功耗等一系列优点,近几年得到迅猛发展和大范围推广,广泛应用于工业控制系统、通讯设备、日常消......
  • Java登陆第三十六天——VUE3响应式入门、setup语法糖
    当浏览器接收到服务端返回的页面后,浏览器会把页面解析成DOM树,DOM树中各个元素会相应的显示在浏览器上。VUE提供的响应式数据可以在页面不刷新的情况下更新数据。响应式数据App.vue<script>//等价于setup语法糖。固定的写法,不会改。exportdefault{setup(){letsum......
  • javaweb学习(day11-监听器Listener&&过滤器Filter)
    一、监听器Listener1 Listener介绍Listener监听器它是JavaWeb的三大组件之一。JavaWeb的三大组件分别是:Servlet程序、Listener监听器、Filter过滤器Listener是JavaEE的规范,就是接口监听器的作用是,监听某种变化(一般就是对象创建/销毁,属性变化),触发对应方......
  • day12- 函数
    我们学习编程的时候,一学到函数就感觉很难,其实函数很简单,听我给你细细道来,在我们之前的学习中,我们最常用的一个操作,打印输出print(),其实这就是我们最先接触的函数,只不过这是由Python源码中编写好的函数,那我们来看下print()函数到底是怎么写的?从中我们可以看到用到def关键字,然......
  • ThreadLocal源码解析
    方法三个主要方法:getsetremove讲三个方法前,现需要知道Thread,ThreadLocal,ThreadLocalMap三个之间的关系,首先ThreadLocalMap虽然是ThreadLocal中定义的静态内部类,但实际的ThreadLocalMap实例是作为Thread对象的一个字段存在的。这样设计的目的是允许每个线程存储自己......
  • 就业班 第二阶段 2401--4.1 day10 shell之“三剑客”+Expect
    十一、shell编程-grepegrep支持正则表达式的拓展元字符(或grep -E)#egrep'[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}'file1.txt[root@newrain~]#num1=11、运用正则,判断需要[[]][root@newrain~]#[[$num1=~^[0-9]+$]]&&echo"yes"||echo"n......
  • 就业班 第二阶段(python) 2401--4.2 day1 python初识
    一、Python语言介绍1、Python发展历史2、Python简介3、Python特点4、Python的能力二、Linux编译安装Python31、源码安装1、安装依赖软件包2、下载3、解压安装4、配置共享库文件5、测试python36、测试pip32、配置使用国内源安装第三方模块1、创建配置文件补充内容四、......
  • JAVA语言学习-Day1
    Java入门特性、版本、环境简单性、面向对象、可移植性、高性能、分布式、动态性(反射机制)、多线程、安全性、健壮性javaSE(标准版)、javaME(嵌入式)、javaEE(企业级)JDK(javadevelopmentkit)、JRE(javaruntimeenvironment)、JVM(javavirtualmachine)卸载jdk删除安装目录、......
  • Java登陆第三十六天——VUE3引入CSS
    在一个.Vue文件中,通常包括以下三部分。<template><style><script>.vue中部分传统部分描述<template>HTML代替传统的.html文件<style>CSS代替传统的.js文件<script>JS代替传统的.css文件声明内部的CSS在.Vue文件中,style标签声明CSS。Hello......
  • 代码随想录算法训练营DAY14|C++二叉树Part.1|二叉树的递归遍历、二叉树的迭代遍历、二
    文章目录二叉树的递归遍历思路CPP代码二叉树的迭代遍历思路前序遍历后序遍历后序遍历二叉树的统一迭代法二叉树的递归遍历144.二叉树的前序遍历、145.二叉树的后序遍历、94.二叉树的中序遍历文章讲解:二叉树的递归遍历视频讲解:每次写递归都要靠直觉?这次带你学......