此公众号并没有scope


Vue.js是一款我在2014年2月开源的前端开发库,它通过简洁的API提供了高效的数据绑定和灵活的组件系统。Vue.js的诞生源于我对前端开发的深度理解和实际需求。

开发初衷

在2013年末,我仍在Google Creative Lab工作,当时在项目中使用了一段时间的Angular。虽然数据绑定带来了生产力的提升,但我也感受到Angular的API设计过于繁琐,学习曲线陡峭。出于对数据绑定原理的好奇,我决定尝试自己实现一个基于依赖收集的数据绑定库,这就是Vue.js的前身。在实际开发中,我发现用户界面可以完全用嵌套的组件树来描述,而一个组件恰恰可以对应MVVM中的ViewModel。于是我决定将我的数据绑定实验改进成一个真正的开源项目,其核心思想就是“数据驱动的组件系统”。

MVVM数据绑定

MVVM的本质是通过数据绑定链接View和Model,让数据的变化自动映射为视图的更新。Vue.js在数据绑定的API设计上借鉴了Angular的指令机制。用户可以通过具有特殊前缀的HTML属性来实现数据绑定,也可以使用常见的插值模板语法,或是在表单元素上使用双向绑定。基于指令的数据绑定使得具体的DOM操作都被合理地封装在指令定义中,业务代码只需要涉及模板和对数据状态的操作即可。这使得应用开发效率和可维护性都大大提升。与Angular不同的是,Vue.js的API里没有繁杂的概念,一切都是以“ViewModel实例”为基本单位。

数据观测的实现

Vue.js的数据观测实现原理和Angular有着本质的不同。Vue.js采用的是基于依赖收集的观测机制,而Angular采用的是脏检查机制。依赖收集的优点在于可以精确、主动地追踪数据的变化,不存在脏检查的两个问题:任何数据变动都意味着当前作用域的每一个watcher需要被重新求值,以及当数据变动时,框架并不能主动侦测到变化的发生。Vue.js利用了ES5的Object.defineProperty方法,直接将原生数据对象的属性改造为getter和setter,在这两个函数内部实现依赖的收集和触发。对于数组,则通过包裹数组的可变方法来数组的变化。这使得操作Vue.js的数据和操作原生对象几乎没有差别。

组件系统

在大型应用中,为了分工、复用和可维护性,我们不可避免地需要将应用抽象为多个相对独立的模块。Vue.js将组件作为一个核心概念,可以说每一个Vue.js应用都是围绕着组件来开发的。注册一个Vue.js组件非常简单,包括模板、初始数据、接受的外部参数、方法、生命周期钩子函数等。除此之外,同一颗组件树之内的组件之间还可以通过内建的事件API来进行通信。Vue.js提供了完善的定义、复用和嵌套组件的API,让开发者可以像搭积木一样用组件拼出整个应用的界面。

基于构建工具的单文件组件格式

Vue.js的核心库只提供基本API,本身并不约束如何应用的文件结构。但在构建大型应用时,推荐使用Webpack+vue-loader组合以使组件开发更高效。我也在Webpack的loader API基础上开发了vue-loader插件,从而让Vue组件可以用单文件格式来书写,整合各种预处理器,提高开发效率和复用性。Vue.js还支持组件的异步加载,配合Webpack的分块打包功能,可以轻松地实现组件的异步按需加载。

其他特性

Vue.js还有诸如异步批量DOM更新、动画系统、可扩展性等特点。同时与Web Components相比,Vue.js的组件和Web Components的区别在于Web Components是底层规范,而Vue.js则提供了更丰富的功能和更广泛的浏览器支持。在支持Web Components的环境中,我们也可以将Vue.js组件封装在真正的自定义元素中,实现无缝整合。Vue.js不仅适用于轻量级的嵌入式使用场景,也完全有能力担当复杂的大型应用的开发。从诞生到现在的一年半时间里,Vue.js经历了彻底的重组和多次API设计改进,已经趋于稳定并广泛应用于各种生产环境中。我们相信它在未来会继续发展和完善,为前端开发者提供更多便利和惊喜。