1.0 Vue的编译和运行

news2024/11/14 0:26:54

1、编程范式:命令式和声明式

编程范式是指一种程序语言的代码风格、样式,每一种范式都包含了代码特征和结构,以及处理错误的方式。

例如现在需要实现生成一个div模块,其显示的文本内容为hello world,添加一个点击事件。那么实现这个功能可以通过命令式和声明式两种方式来编写。

命令式代码示例如下:

// 创建一个div标签
const div = document.createElement("div")
// 设置其文本内容为hello world
div.textContent = "hello world"
// 设置点击事件
div.addEventListener('click', () => {alert("ok")})

声明式代码示例如下:

<div @click="() => {alert('ok')}">hello world</div>
  1. 命令式:直接一步一步命令计算机,每一步执行任务。
  2. 声明式:直接声明结果,至于执行的过程并不关心。

以上的两种方法其实我们在日常的代码编写中都经常用到,但是很少去思考这两种范式的实现优缺点。

首先明确的是命令式的运行效率一定是高于声明式的,对于命令式代码来说浏览器是可以直接执行的,这是原生的JavaScript代码,但是对于声明式来说它需要更多的步骤来处理,然后被执行。声明式的代码首先需要被编译处理,他会被处理成一个JavaScript的对象,然后渲染这个对象。

同样在修改文本内容的时候体现得非常的清晰,改变文本内容对于命令式代码十分简单迅捷,即div.textContent="change content",这就是最快的修改,没有更快了。对于声明式代码来说需要找到其编译后生成的对象(见下文虚拟DOM),然后再从对象中找出不同的地方,进行修改,然后重新渲染。

其实在项目开发中都是选择使用声明式代码,原因很简单,虽然命令式代码执行快,逻辑流程清晰,但是它对于心智的负担太大了,这需要我们做JavaScript原生的代码编写。声明式则逻辑简单很多,一个一个标签,无论是嵌套还是并行都体现得十分清晰。

这也是Vue为什么如此火的原因之一,因为它做了大量的声明式命令的封装,对于用户来说它和HTML一样的声明范式入手很快,并且它的性能也很好(之后会介绍),它做到了在心智负担和性能之间的很好平衡。

2、什么是虚拟DOM及其性能

虚拟DOM就是使用一个JavaScript对象来描述一个真实DOM。
声明式代码在修改的时候有两种方法,第一种是直接重新建立然后渲染,第二种是找出不同的地方,然后针对不同的地方替换掉。
第一种方法如innerHTML,代码如下:

// 当需要修改时需要修改html,然后重新赋值
const html = `
<div @click="() => {alert('ok')}">hello world</div>
`
div.innerHTML = html

第二种方式就是使用JavaScript对象来描述,然后针对对象进行差异化比较(Diff的内容见后文),然后渲染不同的地方,比如

obj = {
  tag: "div",
  children: [
    {tag: "div", children: "hello world"}
  ]
}

此时的obj对象就是一个虚拟DOM。

看似第一种方式消耗不大,其实innerHTML文本需要被解析,哪怕只有一个字符修改了,整个innerHTML都需要被重新构建,然后解析,这在DOM层面需要销毁所有的节点,然后再重新创建。在真实DOM层面操作这远比JavaScript的运行消耗的时间长。

所以虚拟DOM存在的意义就是将很多需要在真实DOM的操作在虚拟DOM优化,上面讲述了命令式效率一定是高于声明式的效率的,但是我们可以尽量让声明式的效率贴近命令式。

对于虚拟DOM只需要一个渲染函数就可以将虚拟DOM渲染成真实DOM,如:

function Render(obj, root) {
  // 根据节点类型创建节点
  const el = document.createElement(obj.tag)
  // 如果是文本节点直接创建
  if(typeof obj.child === 'string') {
    const text = document.createTextNode(obj.child)
    el.appendChild(text)
  } else if(obj.child) {
    // 如果有子节点则递归创建
    obj.children.forEach((child) => {
      Render(child, el)
    })
  }
  root.appendChild(el)
}

所以在声明式代码在执行时有以下步骤:

  1. 编译(标签 To 对象)
  2. 运行(渲染对象)

流程如下:

在这里插入图片描述

其实有个问题就是为什么不直接从声明式代码编译成真实DOM的执行语句:
在这里插入图片描述

这样的就省略了运行的过程,直接编译完成就行了。以上所述的是纯编译框架,如Svelte就是纯编译的,但是Vue是运行+编译的过程,这是因为Vue在运行时做了很多处理,其性能甚至不输纯编译的框架,这在后面会讲解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/488894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

X3派caffe yolov3 部署demo

yolov3放置在docker中/open_explorer/ddk/samples/ai_toolchain/horizon_model_convert_sample/04_detection/02_yolov3_darknet53/mapper 模型所需要的prototxt和caffe模型yolov3.caffemodel文件放置在docker中的/open_explorer/ddk/samples/ai_toolchain/model_zoo/mapper/de…

78页2023年智慧公安发展构思与建设解决方案(ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 总体架构10 建设方案-网络系统11 物联网15 视频网系统16 视频专网主干网根据运营商链路分为若干个环网部署&#xff0c;市局两台核心交换机位于网络核心层&#xff1b;部分…

SpringCloud 分布式事务组件之Seata

目录 背景介绍什么是分布式事务什么叫做逆向补偿呢互联网最流行的分布式事务组件seata总结 背景 大家好&#xff0c;今天给大家分享一个在2022年出去面试Java几乎必问的一个技术&#xff0c;那就是seata。什么&#xff1f;&#xff1f;你才看了第一句话心里有闪现了无数个问…

024 - C++ 虚函数

本期我们学习的是 C 中的虚函数。 过去的几期&#xff0c;我们一直在讨论类、面向对象编程、继承这些内容&#xff0c;所有的这些内容&#xff0c;包括本期我们将要学习的虚函数&#xff0c;对整个面向对象的概念都非常重要。 虚函数能干什么呢? 虚函数允许我们在子类中重写…

关于C语言的一些笔记

文章目录 May4,2023常量问题基本数据类型补码printf的字符格式控制关于异或、异或的理解赋值运算i和i的区别关系运算符 摘自加工于C技能树 May4,2023 常量问题 //定义常量 const float PI; PI 3.14; //false ,这种声明变量是错误的&#xff0c;常量声明之后就不能修改&…

树脂塞孔有哪些优缺点及应用?

树脂塞孔的概述 树脂塞孔就是利用导电或者非导电树脂&#xff0c;通过印刷&#xff0c;利用一切可能的方式&#xff0c;在机械通孔、机械盲埋孔等各种类型的孔内进行填充&#xff0c;实现塞孔的目的。 树脂塞孔的目的 1 树脂填充各种盲埋孔之后&#xff0c;利于层压的真空下…

关于使用Notion的board做工作安排这件事

关于使用Notion的board做工作安排这件事 Created: May 4, 2023 5:39 PM 壹 最近想用一个工具来实现平时工作的记录、跟踪、留痕以及年终的统计&#xff0c;之前尝试过幕布、微软的todo、手机自带的备忘录等工具&#xff0c;但是还是不能够完全满足需求。之前也用过一段时间的…

SPSS如何进行回归分析之案例实训?

文章目录 0.引言1.线性回归分析2.曲线回归分析3.非线性回归分析4.Logistic回归分析5.有序回归分析6.概率回归分析7.加权回归分析 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对SPSS进行了学习&#xff0c;本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上…

Redis 实战篇:巧用 Bitmap 实现亿级海量数据统计

目录 二值状态统计判断用户登陆态SETBIT 命令GETBIT 命令第一步&#xff0c;执行以下指令&#xff0c;表示用户已登录。第二步&#xff0c;检查该用户是否登陆&#xff0c;返回值 1 表示已登录。第三步&#xff0c;登出&#xff0c;将 offset 对应的 value 设置成 0。 用户每个…

【web】HTTP工作原理及应用

一、浏览器工作 浏览器输入网址后&#xff0c;从DNS服务器中查找对应的IP&#xff0c;并返回客户端浏览器&#xff0c;然后通过ip地址去访问服务器。&#xff08;操作系统中host文件存了一些对应的IP地址&#xff0c;浏览器拿到域名会先从host文件中查找ip&#xff0c;如果找…

重工业生产VR虚拟现实数字化互动展示为后续招商引资打好基础和口碑

智慧工业厂区已经是当今城市规划和发展的重要焦点。华锐视点运用数字孪生&#xff0c;三维虚拟仿真和3D可视化打造的智慧园区管理平台&#xff0c;不仅提升了工业厂区吸引力&#xff0c;而且促进工业厂区可持续发展&#xff0c;给予了园区互联网先进技术发展的基础&#xff0c;…

Noah-MP陆面过程模型建模方法与站点、区域模拟实践技术

查看原文&#xff1a;Noah-MP陆面过程模型建模方法与站点、区域模拟实践技术 目标&#xff1a; 了解陆表过程的主要研究内容以及陆面模型在生态水文研究中的地位和作用&#xff1b;熟悉模型的发展历程&#xff0c;常见模型及各自特点&#xff1b;理解Noah-MP模型的原理&#…

[笔记]Windows使用OpenVpn构建虚拟局域网

文章目录 前言一、Windows Openvpn方案1.1 openvpn server windows端安装目录结构服务端安装复制服务端配置文件修改服务端配置文件配置8080允许通过防火墙启动服务端 1.2 openvpn client windows端安装复制服务端生成的配置文件到客户端的config启动客户端 二、连通测试三、常…

数字孪生可视化平台开发 打通现实与虚拟世界

大数据时代背景下&#xff0c;数字孪生技术被应用到智慧建设中&#xff0c;数字孪生是指在虚拟世界中1:1构建一个与现实世界的物体、场景和其他方面都完全相同的孪生景象。数字孪生可视化平台是一种基于虚拟现实技术的数字化模型&#xff0c;通过将真实世界中的物体或场景数字化…

Ubuntu---mysql出现ERROR1698(28000):Access denied for user root@localhost错误解决方法

查看mysql版本&#xff1a; 安装完成后&#xff0c;登录mysql的时候就出现了如下错误&#xff1a; 因为安装的过程中没让设置密码&#xff0c;可能密码为空&#xff0c;但无论如何都进不去mysql。 下面是处理过程&#xff1a; Step1&#xff1a;修改mysqld.cnf配置文件 在ubun…

ModuleNotFoundError: No module named ‘mmcv._ext‘

mmsegmentation使用pyinstaller打包出现问题 mmsegmentation是商汤开源的语义分割框架&#xff0c;里面包含了大量SOTA模型&#xff0c;十分适合从事语义分割工作的小白学习。 最近想将mmsegmentation打包成exe进行使用&#xff0c;但是遇到了一个问题&#xff0c;在打包的过…

server2012 安装mysql5.6.50.0 msi

1. 安装包下载(包括依赖插件) 下载地址 提取码&#xff1a;pb8z 2.安装依赖插件:NDP452-KB2901907-x86-x64-AllOS-ENU.exe 3. 开始安装mysql5.6 双击 mysql-installer-community-5.6.50.0 安装&#xff0c;接受用户许可协议。 选择安装类型&#xff1a; 1)Developer Defaul…

得物直播低延迟探索 | 得物技术

1.背景 直播的时效性保证了良好的用户体验&#xff0c;根据经验在交易环节&#xff0c;延迟越低转化效果也会越好。传统的直播延迟问题已经成为了一个不容忽视的问题&#xff0c;高延迟不仅破坏了用户的观看体验&#xff0c;也让主播难以实时获取到用户的反馈。为了进一步优化…

【计算机网络(二)】DNS协议

什么是DNS DNS(DOMAIN NAME SYSTEM)是一个域名系统&#xff0c;是万维网上作为域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使用户更方便的访问互联网&#xff0c;而不用去记住能够被机器直接读取的IP数串 DNS 工作流程 客户端发送域名解析请求到本地域名服务器 发…

ESP32(二):GPIO

一.创建例程 打开命令面板&#xff1a;ctrlshiftp&#xff0c;输入&#xff1a;esp-idf:example&#xff1b;选择hello_world工程&#xff0c;点击 Create project using example hello_world&#xff0c;选择保存工程&#xff1b;工具使用代码&#xff1a; #include <stdi…