序一

近几年,JavaScript的流行库和框架带有元编程(metaprogramming)的特征。所谓元编程,简单来说,是指框架的作者使用一种编程语言固有的语言特性,创造出相对新的语言特性,使得最终使用者能够以新的语法和语义来构建他们的应用程序,从而在某些领域开发中获得更好的开发体验。

早期的jQuery库之所以获得开发者们的认可,很大程度上是因为它独创的链式语法和隐式迭代语义。尽管jQuery仅仅通过巧妙设计API就能支持上述特性,并不依赖于编程语言赋予的元编程能力,但是毫无疑问,它以一种精巧的设计理念和思路,为JavaScript库和框架的设计者打开了一扇创新的大门。

今天的Web产品对构建用户界面的要求越来越高,jQuery的方式不能满足构建复杂用户界面的需要,新的UI框架快速发展,其中一个最流行的框架就是Vue.js。与jQuery相比,Vue.js更强大,也具有更加明显的元编程特征。动态绑定属性和变化侦测、内置模板和依赖于模板语法的声明式渲染、可扩展的指令、支持嵌套的组件,这些原生JavaScript并不具备的特征和能力被一一融入,框架的使用者在使用Vue.js开发Web应用时,事实上获得了超越JavaScript原生语言特性的能力。

尽管Vue.js框架赋予开发者众多特性和能力,但它仍然是使用原生JavaScript实现的应用框架。JavaScript自身提供了许多元编程特性,比如从ES5就开始支持的属性访问器(property accessor),ES6支持的代理(proxy),还有标准提案已经处于Stage 3阶段的装饰器(decorator)。基于这些语言特性,我们能够比较方便地扩展新的语言特性,将这些特性融入应用框架,从而使得应用开发者能够更加得心应手地使用框架开发出优雅、简洁的应用程序模块。

如何设计API和如何使用元编程思想将新特性融入到框架中,是现代JavaScript框架设计的两个核心,Vue.js更侧重于后者。理解元编程思想有助于深刻理解Vue.js的本质。而理解元编程思想本身最好的方法又是通过深入研究Vue.js的源码,因为元编程思想一旦涉及具体实现,不仅仅是使用JavaScirpt提供的特性来扩展能力那么简单,这其中有许多细节需要考虑,比如要做到向下兼容,那么就要对一些特性的实现方式做出取舍,一些语言能力可以通过书写向下兼容代码来弥补,而另一些则需要通过编译机制来做到,还有一些则必须舍弃;同样,基于性能考虑,一些特性也可能需要做出一定的修改或妥协。这些问题不仅在框架设计和实现的过程中会遇到,而且在具体实现应用程序的过程中也会遇到。因此,通过学习Vue.js,我们不仅能够掌握设计应用程序框架的一般性技巧,还可以在实现应用程序时运用其中的具体设计思想和方法论。

本书的作者刘博文是我的同事,也是奇舞团的一员,后来由于业务变动,博文所在的团队从奇舞团独立了出去,但是同为360的前端团队,我们也始终保持着项目合作和技术交流。很早就听到博文要写这样一本书,当时我很高兴,我一直鼓励大家写书,因为这种创作既能使自己成长,又能使读者获益。我自己也写过技术类的书,深知技术创作的不易,要把Vue.js这样的流行框架讲透也着实需要下一番苦功。有时候,作为朋友,我会和博文开玩笑,说他的书再不出版,Vue.js 3.0版本就要发布了,但这仅仅是玩笑,我不愿意博文因为要赶出版时间而草草了事,那样就无法真正做到“深入浅出”,毕竟这不是一本Vue.js的使用手册,而是真正能够透过Vue.js的设计思路去学习元编程思想,并将这种思想运用于程序开发中的书。只有这样,读者才能真正从这本书中获益。我想,在这一点上,博文没有让我失望,我也希望这本书没有让你们失望。

月影

360奇舞团团长

2019年2月1日

目录

  • 序一
  • 序二
  • 前言
  • 第1章 Vue.js简介
  • 第一篇 变化侦测
  • 第2章 Object的变化侦测
  • 第3章 Array的变化侦测
  • 第4章 变化侦测相关的API实现原理
  • 第二篇 虚拟DOM
  • 第5章 虚拟DOM简介
  • 第6章 VNode
  • 第7章 patch
  • 第三篇 模板编译原理
  • 第8章 模板编译
  • 第9章 解析器
  • 第10章 优化器
  • 第11章 代码生成器
  • 第四篇 整体流程
  • 第12章 架构设计与项目结构
  • 第13章 实例方法与全局API的实现原理
  • 第14章 生命周期
  • 第15章 指令的奥秘
  • 第16章 过滤器的奥秘