本书以San 为例,结合具体的实现,从框架设计、工程链路、跨端开发和全栈实现等方面说明了如何优化前端框架的性能。主要内容包括:San 的组件化设计、响应式的数据设计,以及数据流管理等知识;San SSR 的设计及其在业务中的具体运用;在“开发– 调试– 编译– 部署”工作流中用于提升效率的工具,专门为San 开发的命令行工具San CLI,以及对应的可视化界面实现;San 的跨端融合支持;San 的发展规划。
本书适合所有前端开发人员阅读。
GitHub Star 4.5K 项目 San 核心人员倾力打造
从 0 到 1,用 JavaScript 动手做一个 MVVM 框架
揭秘支撑百度搜索、Feed、小程序三大业务的MVVM框架设计
带你跳出框架,领悟高性能跨端全栈设计思想
跳出框架,阐述设计思想
跨端开发,专注性能优化
全站全端,场景自由切换
本书在以下几个方面有所创新和突破:
1.设计思想:跳出框架之外,带大家了解为何需要框架,以及框架如何设计的书;
2.性能为上:在框架设计、工程链路、跨端开发、全栈实现等方面结合具体实现说明性能如何优化的书;
3.全栈全端:介绍从服务端客户端、从浏览器到客户端,基于多个场景、多种研发模式下进行框架设计和业务配合的书;
4.全景展现:把工具链路设计、调试方案、插件设计等结合框架一起讲的书,让读者对于前端框架有一个全景式的把握。
百度 KFive 是百度 App 大前端团队,在业务支持之外,KFive 研究的技术方向很广,包括人工智能、跨端融合,等等。KFive 的名称不仅来源于起初的办公地点在百度科技园 5 号楼,更体现了其对软件开发的理解,即“五 Key”:Key1者,精益求精;Key2 者,大巧不工;Key3 者,独运匠心;Key4 者,百炼千锤;Key5 者,善始善终。
作者简介:
王永青 :网名“三水清”,百度资深研发专家,曾经先后服务于微博、腾讯,2013 年加入百度,开始移动前端开发工作。先后负责百度 App 的前端技术架构、垂类、用户增长、小游戏、Feed 等业务。目前主要从事 Feed 前端架构、San 框架工具链研发等工作。对于跨端开发、工程化、性能优化和前端架构等有较丰富的经验。
樊中恺 :百度资深研发专家,2011 年加入百度,2013 年开始移动研发工作。对前端技术架构、前端 AI、前端智能化、微前端等方向有丰富的开发经验。目前工作主要面向前后端架构设计、Web AI 和跨端研发等方向。曾参与清华大学前端公开课程建设,多次出品和参与前端方向的主题会议,翻译出版多部技术图书。
钱思成 :百度资深研发工程师,长期负责搜索性能优化和前端架构开发。曾负责搜索性能评价和监控体系建设、组件化、微前端化、UI 自动化等方向的工作,是极速搜索、简单搜索、手机百度 App 搜索等重要项目的核心参与者。
王凯 :百度资深前端研发工程师,2017 年加入百度,长期深耕百度通用组件、工程效能平台、电商等技术业务方向。经历和推进了百度搜索乐高平台化配置系统的全面架构进化和落地,在组件、主题、样式等领域积累了大量实践经验,影响搜索 PV 十亿级别日流量,主导开发的组件库涉及 H5、NA、小程序等业务场景。
梅旭光 :百度资深研发工程师,目前负责搜索组件化渲染框架、服务端渲染架构的研发工作。Node.js Core Collaborator,GMTC 讲师,San-SSR Maintainer,曾发布语言转换器 ts2php、多端统一开发框架 Mars 等开源项目。对前端框架、服务端渲染设计和实现有较为丰富的经验,致力于提升 Web 产品的用户体验。
钱思成 :2016 年加入百度,曾参与百度 MIP 项目,负责搜索结果页极速浏览框架、San 服务器端渲染框架、搜索结果页前端架构改进。2021 年加入微软中国,任资深软件工程师。QCon+ 讲师,百度技术学院讲师,LiquidJS 模板引擎作者,翻译出版多部技术图书。
杨珺:百度资深研发工程师,长期负责搜索性能优化和前端架构开发。曾负责搜索性能评价和监控体系建设、组件化、微前端化、UI 自动化等方向的工作,是极速搜索、简单搜索、手机百度 App 搜索等重要项目的核心参与者。
金展 :百度资深前端研发工程师,曾先后负责百度知道、百度经验、百度 App、百家号等多个百度产品线的前端技术迭代和性能优化工作,以及 San 命令行工具 San CLI、San 组合式 API、前端组件库 Santd 等开源生态的升级维护。
廖焕宇 :百度前端工程师,主要关注跨端动态渲染技术,前端代码规范,效能提升与性能优化;深度参与 San 生态建设;喜欢分享软件开发经验,在 GitHub 中创建了一些实用的提效工具。
朱国玺 :技术专家,百度资深研发工程师,2016 年加入百度,先后参与百度贴吧、MIP、搜索、百度 App 等项目的架构设计与研发,具有多年跨端融合研发经验,目前专注于百度 App 动态 NA 化等技术方向。
第 1章 San,一个新的起点 1
1.1 San的诞生 3
1.2 San的特性 3
1.3 框架对比 6
1.3.1 抽象程度 6
1.3.2 运行时和预编译 7
1.3.3 同构与跨端 8
1.3.4 生态 8
1.4 为什么选择San 9
1.5 小结 10
第 2章 组件,一切的起点 11
2.1 从实际项目出发,实现一个简单的San 11
2.1.1 实现一篇文章 11
2.1.2 实现文章列表 13
2.1.3 抽象出文章类 16
2.1.4 数据驱动视图的逻辑 18
2.2 编写第 一个San组件 21
2.2.1 安装San 21
2.2.2 Hello San 23
2.3 使用San实现文章项 24
2.3.1 使用HTML语法描述结构 25
2.3.2 使用CSS控制样式 25
2.4 声明式的视图模板 26
2.4.1 插值语法 27
2.4.2 属性绑定 30
2.4.3 表达式 32
2.4.4 方法 33
2.4.5 过滤器 34
2.5 事件 35
2.5.1 事件修饰符 38
2.5.2 自定义事件 39
2.6 指令 41
2.6.1 条件 41
2.6.2 循环 44
2.6.3 源码解析 47
2.7 San组件 49
2.7.1 组件定义 50
2.7.2 生命周期 51
2.7.3 视图模板 53
2.7.4 数据 54
2.7.5 组件引用 56
2.8 双向绑定 58
2.9 工程搭建 61
2.10 小结 66
第3章 数据,组件的基石 68
3.1 响应式原理 69
3.1.1 如何追踪数据变化 69
3.1.2 主动式数据变化追踪 72
3.1.3 如何收集依赖 81
3.1.4 如何触发视图更新 86
3.2 视图更新 87
3.2.1 视图更新过程 87
3.2.2 ANode 91
3.2.3 基于ANode的预处理 92
3.2.4 节点遍历中断 99
3.3 数据及其更新 100
3.3.1 数据定义 101
3.3.2 数据校验 106
3.4 状态管理 111
3.4.1 为什么要进行状态管理 111
3.4.2 基础使用 113
3.4.3 san-store的实现原理 117
3.4.4 san-update库 128
3.4.5 实例 135
3.5 小结 138
第4章 组件进阶,构造复杂的前端应用 139
4.1 组件间通信 141
4.1.1 父子组件通信 142
4.1.2 更多组件通信方式 149
4.2 插槽 151
4.2.1 数据环境 152
4.2.2 命名 153
4.2.3 作用域插槽 155
4.3 路由 157
4.4 动画和过渡 160
4.4.1 s-transition 161
4.4.2 动画控制器 161
4.5 APack 163
4.6 小结 164
第5章 服务端渲染 166
5.1 服务端渲染的用途 166
5.1.1 单页应用的问题 166
5.1.2 引入服务端渲染 167
5.1.3 应用场景评估 168
5.2 如何做服务端渲染 169
5.2.1 立即使用San SSR 170
5.2.2 开发支持SSR的组件 172
5.2.3 编译到其他语言和平台 174
5.3 San SSR的工作原理 176
5.3.1 San服务端渲染过程 176
5.3.2 组件信息解析 177
5.3.3 编译到render AST 178
5.3.4 render的代码生成 180
5.4 客户端反解 182
5.4.1 组件反解的概念 182
5.4.2 数据注释 183
5.4.3 复合插值文本 184
5.4.4 调用组件反解 184
5.5 服务端渲染优化 185
5.5.1 预渲染优化 186
5.5.2 正确使用render 187
5.5.3 编译到源码 188
5.5.4 复用运行时工具库 189
5.6 小结 190
第6章 San命令行工具 192
6.1 为什么需要San CLI 192
6.2 命令行工具的实现 193
6.2.1 解析命令行参数 193
6.2.2 命令行工具的发布和调试 194
6.2.3 基于yargs的命令行模块 195
6.2.4 命令行插件化的实现 197
6.3 打造San项目脚手架 198
6.3.1 实现简单的项目脚手架 199
6.3.2 实现可交互的项目脚手架 200
6.3.3 脚手架的完整实现逻辑 209
6.3.4 更好地组织代码 210
6.4 San CLI的构建方案 213
6.4.1 编译与构建 214
6.4.2 构建方案的技术选型 217
6.4.3 San CLI的构建方案 218
6.5 San CLI的整体架构 231
6.6 开箱即用的最佳实践 233
6.6.1 语言层面的支持 233
6.6.2 开发调试 235
6.6.3 面向项目部署 239
6.6.4 性能优化 242
6.7 小结 248
第7章 组件编译和HMR 249
7.1 San单文件组件 249
7.1.1 一个简单的San单文件组件 249
7.1.2 单文件组件的特性 250
7.2 单文件组件编译的配置 251
7.2.1 加载器和插件 251
7.2.2 San加载器简介 254
7.3 单文件组件编译的原理 254
7.3.1 提取San文件中的模板、脚本和样式 255
7.3.2 从单文件组件到San组件 259
7.3.3 San加载器的构建流程 261
7.3.4 San加载器的整体运行流程 270
7.4 实现组件的HMR 271
7.4.1 webpack HMR简介 271
7.4.2 HMR的工作原理 271
7.4.3 san-hot-loader简介 275
7.4.4 San组件的HMR的实现 276
7.5 利用APack实现组件的传输优化 284
7.5.1 从模板到ANode 284
7.5.2 从ANode到APack 286
7.5.3 APack的实现原理 287
7.6 小结 296
第8章 测试与调试 297
8.1 San DevTools简介 297
8.1.1 San DevTools的设计初衷 297
8.1.2 技术选型 298
8.2 San DevTools中的通信 299
8.2.1 工作原理 299
8.2.2 构建WebSocket服务 300
8.2.3 构建Bridge与协议解耦 301
8.2.4 构建调试页面与被调试页面之间的通信信道 303
8.3 San DevTools中的数据收集和处理 307
8.3.1 收集页面中的San数据 307
8.3.2 构建Agent 309
8.3.3 构建页面组件树 311
8.3.4 实时修改组件数据 315
8.3.5 组件性能数据的处理 317
8.3.6 事件与消息 324
8.3.7 san-store中的时间旅行 326
8.4 单元测试 332
8.4.1 DOM测试 332
8.4.2 快照测试 335
8.5 小结 336
第9章 San Native跨端融合 337
9.1 跨平台开发 337
9.1.1 JavaScript驱动的NA原生渲染 338
9.1.2 跨端渲染方案的优缺点 338
9.2 渲染引擎 342
9.2.1 供JavaScript调用的渲染API 342
9.2.2 宿主所使用的渲染引擎 342
9.2.3 实现JavaScript代码 343
9.3 高性能的跨端技术方案 343
9.3.1 响应式驱动NA渲染 344
9.3.2 适配跨端渲染 345
9.3.3 视图设计 346
9.3.4 事件系统 348
9.3.5 样式选择器 351
9.4 San Native的Web化 362
9.4.1 Web化的背后原理 362
9.4.2 Native渲染与Web渲染的差异 364
9.5 共享机制和多bundle 365
9.6 小结 368
第 10章 San的未来 369