当前位置: 首页 > news >正文

Vue.js设计与实现(霍春阳)

Vue.js设计与实现 (霍春阳)

        电子版获取链接:Vue.js设计与实现(霍春阳)

read-normal-img

编辑推荐

适读人群 :1.对Vue.js 2/3具有上手经验,且希望进一步理解Vue.js框架设计原理的开发人员; 2.没有使用过Vue.js,但对Vue.js框架设计感兴趣的前端开发人员。

1.Vue.js 官方团队成员霍春阳倾力打造;

2.基于 Vue.js 3 深入解析 Vue.js 设计细节;

3.Vue.js 作者尤雨溪作序推荐;

4.本书提供源代码下载;

5.业界大咖联袂推荐。

内容简介

本书基于Vue.js 3,从规范出发,以源码为基础,并结合大量直观的配图,循序渐进地讲解Vue.js中各个功能模块的实现,细致剖析框架设计原理。全书共18章,分为六篇,主要内容包括:框架设计概览、响应系统、渲染器、组件化、编译器和服务端渲染等。通过阅读本书,对Vue.js 2/3具有上手经验的开发人员能够进一步理解Vue.js框架的实现细节,没有Vue.js使用经验但对框架设计感兴趣的前端开发人员,能够快速掌握Vue.js的设计原理。

作者简介

霍春阳(HcySunYang)

Vue.js官方团队成员,专注于Web研发领域,是Vue.js 3的核心贡献者之一,Vue.js文档生成工具Vuese的作者,技术社区活跃者,曾撰写大量颇受好评的技术博客。

精彩书评

这本书对Vue.js 3技术细节的分析非常可靠,对于需要深入理解Vue.js 3的用户会有很大的帮助。

--尤雨溪,Vue.js作者

听到春阳在筹备这本书时,我就期待不已。以他对Vue.js的贡献与理解程度,编写这本书真是再适合不过了!春阳从框架设计者的角度巧妙地切入,自底层由浅入深地阐述Vue.js的设计思想。身为Vue.js多年使用者的我,也被书中丰富的细节所震撼,读后受益匪浅。若想更好地理解与使用Vue.js,我极力推荐本书。

--Anthony Fu,Vue.js和Vite核心团队成员

春阳是Vue.js团队中对框架源码钻研最深的人之一。

这本《Vue.js设计与实现》并非简单的源码解析之作,反而深入浅出,既从设计理念的角度阐述了Vue.js的技术选择,也讲解了更为通用的算法知识和JavaScript语言规范细节。这本书不仅能帮助前端新手理解前端框架功能,而且为资深开发者阅读源码提供助力,还能对广大的前端技术爱好者有所启发,非常值得一读。

--蒋豪群,Vue.js和Vite核心团队成员

当前,在开发前端应用程序时,Vue.js已经是**技术之一了。使用Vue.js的开发者数量庞大,其中很多人尝试阅读源码,以期了解更多细节。

本书从核心团队开发者的角度,详细解析了从无到有开发Vue.js的技术细节,以及背后的工程权衡,其细节之丰富,远超第三方源码解读。想要深入框架细节的业务开发者以及各类组件、框架和平台开发者,都可以从本书中受益。此外,作者的技术实力和写作态度,也保证了本书的品质。

--(飞叔)徐飞

数据驱动的前端框架已成为现代前端研发的标准配置。Vue.js作为其中脱颖而出的主流选择之一,有许多值得前端开发者学习、借鉴的思想和实践。作为Vue.js 3的核心贡献者,春阳对Vue.js的各个方面都有很深入的理解。这本书为读者详细展示了Vue.js的设计原理与实践细节,以及框架设计背后的权衡艺术,是一本不容错过的好书。我相信所有对Vue.js、框架设计感兴趣的开发者读完这本书后,都能有更进一步的理解。

--顾轶灵,百度资深研发工程师,Vue.js官方团队成员

我特别喜欢《Vue.js设计与实现》这本书,它会为你打开一扇门,开辟一种新的思维,建立对Vue.js全新的认知。

--刘博文(玖五),《深入浅出Vue.js》作者,阿里巴巴大淘宝前端技术专家

目录

前言

第 1章 权衡的艺术 2

1.1 命令式和声明式 2

1.2 性能与可维护性的权衡 3

1.3 虚拟DOM的性能到底如何 4

1.4 运行时和编译时 8

1.5 总结 11

第 2章 框架设计的核心要素 12

2.1 提升用户的开发体验 12

2.2 控制框架代码的体积 14

2.3 框架要做到良好的Tree-Shaking 15

2.4 框架应该输出怎样的构建产物 17

2.5 特性开关 19

2.6 错误处理 21

2.7 良好的TypeScript类型支持 23

2.8 总结 25

第3章 Vue.js 3的设计思路 27

3.1 声明式地描述UI 27

3.2 初识渲染器 29

3.3 组件的本质 32

3.4 模板的工作原理 34

3.5 Vue.js是各个模块组成的有机整体 36

3.6 总结 37

第4章 响应系统的作用与实现 40

4.1 响应式数据与副作用函数 40

4.2 响应式数据的基本实现 41

4.3 设计一个完善的响应系统 43

4.4 分支切换与cleanup 50

4.5 嵌套的effect与effect栈 55

4.6 避免无限递归循环 59

4.7 调度执行 60

4.8 计算属性computed与lazy 64

4.9 watch的实现原理 71

4.10 立即执行的watch与回调执行时机 75

4.11 过期的副作用 77

4.12 总结 82

第5章 非原始值的响应式方案 84

5.1 理解Proxy和Reflect 84

5.2 JavaScript对象及Proxy的工作原理 88

5.3 如何代理Object 92

5.4 合理地触发响应 102

5.5 浅响应与深响应 108

5.6 只读和浅只读 110

5.7 代理数组 113

5.7.1 数组的索引与 length 114

5.7.2 遍历数组 119

5.7.3 数组的查找方法 124

5.7.4 隐式修改数组长度的原型方法 129

5.8 代理Set和Map 132

5.8.1 如何代理Set和Map 133

5.8.2 建立响应联系 137

5.8.3 避免污染原始数据 140

5.8.4 处理forEach 143

5.8.5 迭代器方法 147

5.8.6 values与keys方法 152

5.9 总结 155

第6章 原始值的响应式方案 158

6.1 引入ref的概念 158

6.2 响应丢失问题 160

6.3 自动脱ref 164

6.4 总结 166

第7章 渲染器的设计 170

7.1 渲染器与响应系统的结合 170

7.2 渲染器的基本概念 172

7.3 自定义渲染器 175

7.4 总结 179

第8章 挂载与更新 180

8.1 挂载子节点和元素的属性 180

8.2 HTML Attributes与DOM Properties 182

8.3 正确地设置元素属性 184

8.4 class的处理 189

8.5 卸载操作 192

8.6 区分vnode的类型 195

8.7 事件的处理 196

8.8 事件冒泡与更新时机问题 201

8.9 更新子节点 204

8.10 文本节点和注释节点 209

8.11 Fragment 212

8.12 总结 215

第9章 简单Diff算法 218

9.1 减少DOM操作的性能开销 218

9.2 DOM复用与key的作用 221

9.3 找到需要移动的元素 225

9.4 如何移动元素 228

9.5 添加新元素 233

9.6 移除不存在的元素 238

9.7 总结 241

第 10章 双端Diff算法 242

10.1 双端比较的原理 242

10.2 双端比较的优势 252

10.3 非理想状况的处理方式 255

10.4 添加新元素 263

10.5 移除不存在的元素 268

10.6 总结 270

第 11章 快速Diff算法 271

11.1 相同的前置元素和后置元素 271

11.2 判断是否需要进行DOM移动操作 279

11.3 如何移动元素 288

11.4 总结 296

第 12章 组件的实现原理 298

12.1 渲染组件 298

12.2 组件状态与自更新 301

12.3 组件实例与组件的生命周期 304

12.4 props与组件的被动更新 306

12.5 setup函数的作用与实现 311

12.6 组件事件与emit的实现 314

12.7 插槽的工作原理与实现 316

12.8 注册生命周期 318

12.9 总结 320

第 13章 异步组件与函数式组件 322

13.1 异步组件要解决的问题 322

13.2 异步组件的实现原理 324

13.2.1 封装defineAsyncComponent函数 324

13.2.2 超时与Error组件 325

13.2.3 延迟与Loading组件 328

13.2.4 重试机制 331

13.3 函数式组件 333

13.4 总结 335

第 14章 内建组件和模块 337

14.1 KeepAlive组件的实现原理 337

14.1.1 组件的激活与失活 337

14.1.2 include和exclude 342

14.1.3 缓存管理 343

14.2 Teleport组件的实现原理 346

14.2.1 Teleport组件要解决的问题 346

14.2.2 实现Teleport组件 347

14.3 Transition组件的实现原理 350

14.3.1 原生DOM的过渡 351

14.3.2 实现Transition组件 356

14.4 总结 360

第 15章 编译器核心技术概览 364

15.1 模板DSL的编译器 364

15.2 parser的实现原理与状态机 368

15.3 构造AST 374

15.4 AST的转换与插件化架构 383

15.4.1 节点的访问 383

15.4.2 转换上下文与节点操作 387

15.4.3 进入与退出 392

15.5 将模板AST转为JavaScript AST 396

15.6 代码生成 402

15.7 总结 407

第 16章 解析器 409

16.1 文本模式及其对解析器的影响 409

16.2 递归下降算法构造模板AST 413

16.3 状态机的开启与停止 419

16.4 解析标签节点 426

16.5 解析属性 430

16.6 解析文本与解码HTML实体 436

16.6.1 解析文本 436

16.6.2 解码命名字符引用 438

16.6.3 解码数字字符引用 445

16.7 解析插值与注释 449

16.8 总结 451

第 17章 编译优化 453

17.1 动态节点收集与补丁标志 453

17.1.1 传统Diff算法的问题 453

17.1.2 Block与PatchFlags 454

17.1.3 收集动态节点 457

17.1.4 渲染器的运行时支持 459

17.2 Block树 461

17.2.1 带有v-if指令的节点 462

17.2.2 带有v-for指令的节点 464

17.2.3 Fragment的稳定性 465

17.3 静态提升 466

17.4 预字符串化 468

17.5 缓存内联事件处理函数 469

17.6 v-once 470

17.7 总结 471

第 18章 同构渲染 474

18.1 CSR、SSR以及同构渲染 474

18.2 将虚拟DOM渲染为HTML字符串 478

18.3 将组件渲染为HTML字符串 484

18.4 客户端激活的原理 489

18.5 编写同构的代码 494

18.5.1 组件的生命周期 494

18.5.2 使用跨平台的API 496

18.5.3 只在某一端引入模块 496

18.5.4 避免交叉请求引起的状态污染 497

18.5.5 组件 498

18.6 总结 499

本文禁止转载或摘编

相关文章:

Vue.js设计与实现(霍春阳)

Vue.js设计与实现 (霍春阳) 电子版获取链接:Vue.js设计与实现(霍春阳) 编辑推荐 适读人群 :1.对Vue.js 2/3具有上手经验,且希望进一步理解Vue.js框架设计原理的开发人员; 2.没有使用过Vue.js,但对Vue.js框架设计感兴趣…...

go消息队列RabbitMQ - 订阅模式-fanout

1、发布订阅 订阅模式,消息被路由投递给多个队列,一个消息被多个消费者获取。 1) 可以有多个消费者 2) 每个消费者有自己的queue(队列) 3) 每个队列都要绑定到Exchange(交换机&…...

科普类——5G远程实时操控技术在国内港口应用简介(十三)

在中国,5G远程实时操控技术已经在多个港口得到应用,并且应用规模不断扩大,展现出良好的发展前景。以下是一些具体的应用案例: 上港集团洋山港:上港集团与华为合作,在全球港口首次将F5G技术应用于超远程控制…...

整理:汉诺塔简析

大体上,要解决一个汉诺塔问题,就需要解决两个更简单的汉诺塔问题 以盘子数量 3 的汉诺塔问题为例 要将 3 个盘子从 A 移动到 C,就要: 将两个盘子从 A 移动到 B(子问题 1) 为了解决子问题 1,就…...

Android 8.1 设置--声音中增加通话音量

Android 8.1 设置--声音中增加通话音量 近来收到项目需求&#xff0c;想要在设置--声音中增加一项通话音量调节&#xff0c;具体修改参照如下&#xff1a; /vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/strings.xml <!-- Sound: Title for the opt…...

C#中使用OpenCvSharp4绘制直线、矩形、圆、文本

C#中使用OpenCvSharp4绘制直线、矩形、圆、文本 继之前的Python中使用Opencv-python库绘制直线、矩形、圆、文本和VC中使用OpenCV绘制直线、矩形、圆和文字&#xff0c;将之前的Python和C示例代码翻译成C#语言&#xff0c;很简单&#xff0c;还是借用OpenCvSharp4库中的Line、…...

Qt程序设计-自定义控件(提升法)

本文讲解如何使用提升法自定义控件,控件有界面。 实现自定义一个开关控件,控件上显示当前的状态。实现过程如下: 1、在创建的项目上,添加qt设计界面类。 2、选择widget 3、更改名称为MySwitchButton 4、添加两个图标资源文件,用来显示开关状态 5、添加两个label,一个…...

计算机网络基础知识笔记

1 HOST和PORT Claude-2-100k: 我来用简单的语言解释一下HOST和PORT这两个网络术语&#xff1a; HOST就是设备的IP地址,比如"127.0.0.1"就是我们本机的IP地址&#xff1b; PORT就是端口号,可以把它简单理解为设备上的门牌号。 举个类比,我们要给某个人发信件,需要知道…...

【iOS ARKit】2D肢体动作捕捉

人体肢体动作捕捉在动漫影视制作、游戏CG 动画、实时模型驱动中有着广泛的应用&#xff0c;利用 ARKit&#xff0c;无须额外的硬件设备即可实现 2D和3D人体一系列关节和骨骼的动态捕捉&#xff0c;由于移动AR 的便携性及低成本&#xff0c;必将促进相关产业的发展。 ARBody Tr…...

MAC word删除空白页

问题&#xff1a;MAC word删除空白页 解决&#xff1a; option删除键...

字面跳动前端面试题:React Hook为什么不能放在if/循环/嵌套函数里面?

答&#xff1a;首先&#xff0c;React Hooks 是为了简化组件逻辑和提高代码可读性而设计的。将 Hook 放在 if/循环/嵌套函数中会破坏它们的封装性和可预测性&#xff0c;使得代码更难维护和理解。同时&#xff0c;这样做也增加了代码的复杂度&#xff0c;可能会导致性能下降和潜…...

【SpringBoot】SpringBoot的web开发

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;SpringBoot ⛺️稳重求进&#xff0c;晒太阳 Wbe开发 使用Springboot 1&#xff09;、创建SpringBoot应用&#xff0c;选中我们需要的模块&#xff1b; 2&#xff09;、SpringBoot已经默…...

houdini 入门指南-参考自用,内有翻译错误

HOUDINI 18.5列1 GETTING STARTED 入门指南 What’s new in Houdini 18.5 胡迪尼18.5有什么新内容 New features and changes in Houdini 18.5.胡迪尼18.5的新功能和变化。Basics基础The basics of working with Houdini’s user interface.使用胡迪尼用户界面的基本知识。Shel…...

【笔记】SPN和PLMN 运营商网络名称显示

一、业务术语 缩写 全称 释义 CDNR Carrier Display Name Ressource 运营商显示名称资源 PLMN Public Land Mobile Network 公共陆地移动网络。 表示最终显示的网络运营商名字 SPN Service Provider Name SIM卡EF文件6F46。表示服务提供商名字,主要是SIM卡服务 OPL Operator …...

Selenium处理Alert弹窗

页面弹窗有 3 种类型&#xff1a; alert&#xff08;警告信息&#xff09; confirm&#xff08;确认信息&#xff09; prompt&#xff08;提示输入&#xff09; 对于页面出现的 alert 弹窗&#xff0c;Selenium 提供如下方法&#xff1a; 序号 方法/属性 描述 1 ac…...

FCIS 2023:洞悉网络安全新前沿,引领未来安全创新狂潮

在数字化浪潮席卷全球的今天&#xff0c;网络安全问题愈发凸显其重要性。 FCIS 2023网络安全创新大会作为业界瞩目的盛会&#xff0c;不仅汇聚了国际顶尖的网络安全专家&#xff0c;更展示了最前沿的安全技术与研究成果。那么&#xff0c;参与这场大会&#xff0c;我们究竟能学…...

4个最佳的免费全磁盘加密程序,总有一款适合你

全磁盘加密软件加密整个驱动器,而不仅仅是几个文件或文件夹。加密计算机的驱动器可以使你的私人数据免受窥探,即使你的计算机被盗。 你也不仅仅局限于一个硬盘驱动器。闪存驱动器和外部硬盘驱动器等外部设备也可以通过磁盘加密软件进行加密。 注意:Windows和macOS都集成了…...

SQL语句创建数据库

在SQL中&#xff0c;可以使用CREATE DATABASE语句来创建数据库。下面是一个示例&#xff1a; CREATE DATABASE database_name;其中&#xff0c;database_name是要创建的数据库的名称。你可以将其替换为你想要的数据库名称。 请注意&#xff0c;在不同的SQL数据库管理系统中&a…...

【lesson38】让minishell支持重定向

文章目录 minishell支持重定向minishell完整代码 minishell支持重定向 支持重定向的核心逻辑&#xff1a; 1.分析字符串是否含有重定向的符号&#xff0c;并且提取文件名。 #define INPUT_REDIR 0 //输入重定向 #define OUTPUT_REDIR 1 //输出重定向 #define APPEND_REDIR…...

【安装指南】maven下载、安装与配置详细教程

&#x1f33c;一、概述 maven功能与python的pip类似。 Apache Maven是一个用于软件项目管理和构建的强大工具。它是基于项目对象模型的&#xff0c;用于描述项目的构建配置和依赖关系。以下是一些关键的 Maven 特性和概念&#xff1a; POM&#xff08;Project Object Model&…...

shadcn/ui

文章目录 前言✅ 核心特点&#x1f4e6; 支持组件&#xff08;常用&#xff09;&#x1f680; 安装使用&#xff08;框架支持&#xff09;初始化&#xff08;Next.js 项目为例&#xff09;添加一个组件 &#x1f9e0; 对比其他组件库&#x1f4d8; 官方资源✅ 总结✅ 功能特性&…...

【笔记】Windows 系统安装 Scoop 包管理工具

#工作记录 一、问题背景 在进行开源项目 Suna 部署过程中&#xff0c;执行设置向导时遭遇报错&#xff1a;❌ Supabase CLI is not installed. 根据资料检索&#xff0c;需通过 Windows 包管理工具Scoop安装 Supabase CLI。 初始尝试以管理员身份运行 PowerShell 安装 Scoop…...

【Zephyr 系列 2】用 Zephyr 玩转 Arduino UNO / MEGA,实现串口通信与 CLI 命令交互

🎯 本篇目标 在 Ubuntu 下将 Zephyr 运行在 Arduino UNO / MEGA 上 打通串口通信,实现通过串口发送命令与反馈 使用 Zephyr Shell 模块,实现 CLI 命令处理 🪧 为什么 Arduino + Zephyr? 虽然 Arduino 开发板通常用于简单的 C/C++ 开发,但 Zephyr 的支持范围远超 STM32…...

HTML实战项目:高考加油和中考加油

设计思路 页面加载后会自动显示高考内容&#xff0c;点击顶部按钮可以切换到中考内容。倒计时会每秒更新&#xff0c;为考生提供实时的备考时间参考。 使用代表希望的蓝色和金色渐变作为主色调 顶部导航栏可切换高考/中考内容 添加动态倒计时功能 设计励志名言卡片和备考小贴…...

WebVm:无需安装,一款可以在浏览器运行的 Linux 来了

WebVM 是一款可以在浏览器中运行的Linux虚拟机。不是那种HTMLJavaScript模拟的UI&#xff0c;完全通过HTML5/WebAssembly技术实现客户端运行。通过集成CheerpX虚拟化引擎&#xff0c;可直接在浏览器中运行未经修改的Debian系统。 Stars 数13054Forks 数2398 主要特点 完整 Lin…...

Rust入门之并发编程基础(一)

Rust入门之并发编程基础&#xff08;一&#xff09; 无畏并发 本文源码 安全且高效地处理并发编程是 Rust 的另一个主要目标。并发编程&#xff08;Concurrent programming&#xff09;&#xff0c;代表程序的不同部分相互独立地执行&#xff0c;而 并行编程&#xff08;par…...

打印Yolo预训练模型的所有类别及对应的id

有时候我们可能只需要用yolo模型检测个别类别&#xff0c;并显示&#xff0c;这就需要知道id&#xff0c;以下代码可打印出 from ultralytics import YOLO# 加载模型 model YOLO(yolo11x.pt)# 打印所有类别名称及其对应的ID print(model.names) {0: person, 1: bicycle, 2: c…...

树莓派设置静态ip 永久有效 我的需要设置三个 一个摄像头的 两个设备的

通过 systemd-networkd 配置 此方法适用于较新的Raspberry Pi OS版本&#xff0c;支持同时绑定多个IP地址到同一网卡&#xff0c;且配置清晰稳定。 1.禁用DHCP客户端对eth0的管理:编辑/etc/dhcpcd.conf文件&#xff0c;添加以下内容以忽略eth0接口的自动分配 sudo nano /etc…...

Redisson学习专栏(一):快速入门及核心API实践

文章目录 前言一、Redisson简介1.1 什么是Redisson&#xff1f;1.2 解决了什么问题&#xff1f; 二、快速入门2.1 环境准备 2.2 基础配置三、核心API解析3.1 分布式锁&#xff08;RLock&#xff09;3.2 分布式集合3.2.1 RMap&#xff08;分布式Map&#xff09;3.2.2 RList&…...

告别延迟!modbus tcp转profine网关助力改造电厂改造升级

发电需求从未如此旺盛。无论您是为客户发电还是为自身运营发电&#xff0c;您都需要提高运营效率&#xff0c;并在资产老化、资源萎缩的情况下&#xff0c;紧跟不断变化的法规。如今&#xff0c;智能系统和技术能够帮助您实现运营转型&#xff0c;提高可视性并实现关键流程自动…...