王逸嘉 冯彦
1. 上海大学附属南通医院(南通市第六人民医院) 江苏 南通 226000;2. 江苏商贸职业学院 江苏 南通 226000
在如今的WEB开发中,前端在系统中承担了更多的工作,页面中的交互设计和数据处理日趋复杂。原本的MVC模式的前端框架已经不能满足当今开发人员的开发需求,相继出现了MVP、MVVM[1]模式的前端框架来满足日趋复杂的View层的开发需求。其中,采用MVVM的Vue.js[2]开发框架发展迅猛,灵活易用和高性能的优点使其已经成为企业级前端开发中不可或缺的重要工具。如今,Vue.js3.0已经被广泛使用,本文在介绍和分析Vue.js最新特性的基础上探究前端框架发展方向和趋势。
Vue.js是目前非常流行的MVVM前端框架,可以用于快速搭建用户界面,它采用数据驱动和组件化的思想设计,为开发者提供了独特的响应机制以及灵活的、模块化的开发环境。同时,Vue.js还拥有极为丰富和活跃的生态环境[3],使其在状态管理、路由管理、依赖管理、服务端渲染和前端工程化等方面都具备日益强大的能力。下面总结目前Vue.js比较突出的优点。
2.1.1 方便的数据响应机制。在过去,前端开发者在数据发生改变时,需要在JavaScript代码中书写大量的DOM操作语句,这样的做法不仅容易出现性能问题也使得开发中的代码量急剧上升。Vue.js中的数据响应机制,当数据发生变化时,会自动根据变化的数据渲染页面,使开发人员能够将注意力集中在业务逻辑的开发中,极大提升了效率。
2.1.2 虚拟DOM的引入。虚拟DOM概念是为了解决现代WEB开发中对DOM的频繁操作而产生的性能问题。虚拟DOM机制可以将多次的DOM操作先进行保存,然后一次性对真实的DOM树进行更新,从而降低了操作DOM的次数,有效减少了浏览器性能的损失。Vue.js中引入了虚拟DOM机制与数据响应机制配合,提供了高性能的页面渲染表现。
2.1.3 对HTML模板的支持。HTML是前端开发者的基础标记语言,在Vue.js中引入HTML模板可以让开发者的学习成本急剧降低,Vue.js让HTML模板具备虚拟DOM的能力,使得开发者已有的WEB应用也能快速拥有Vue.js的数据响应机制。
目前的前端开发框架正朝着更快、更轻、更易于维护的方向发展。因此,Vue.js3.0版本进行了大量优化和重构,在性能、灵活性、以及模块化等诸多方面进行了大量改进。以下分析Vue.js3.0版本中比较重要的最新特性,并选择性与旧版本实现方法进行比较。
Composition API是Vue.js3.0重新设计的组件API,允许开发者使用JavaScript原声的函数来描述组件中的可用资源,灵活地组合组件逻辑[4-5]。而在当前的版本中,Vue.js使用的是Options API进行组件化开发,在开发中,开发者需要在组件中添加可选的属性进行组件的设计。Options API存在着一些问题,最为突出的是具有复杂层级的多个组件的逻辑和重用问题。
3.1.1 mixins的使用问题。开发者通常会使用mixins直接引入一些资源到组件中,这在开发中十分常见,这些新引入的资源有可能会导致属性的命名冲突,也会因为其中自带的某些行为而扰乱当前组件的逻辑。
3.1.2 作用域插槽的使用问题。作用域插槽和mixins都有数据来源不明确的问题,而且只能在模板中的组件作用域内使用引入的数据或资源。
3.1.3 高阶组件的使用问题。在使用组件进行开发时,开发者会将一些可以复用的属性和方法封装到父级组件当中来提高开发效率。在项目中,多个组件间的关系会变得十分复杂,会导致子组件渲染的时候也会加载一些高阶组件中不必要的一些资源,导致性能的浪费。
在Vue.js2.x版本中响应机制使用的是基于Object.defineProperty的观察者模式[6],其原理是对Vue实例中data属性下的数据使用Object.defineProperty创建对象访问器:getter和setter,从而实现对数据变化的响应机制。但是,这种方式存在非常明显的缺点。
3.2.1 无法监测数组下标发生的变化。例如开发者在开发中直接使用操作数组下标的形式对数组进行添加元素操作时,系统无法监测到数据变化,视图层也不会随之更新。
3.2.2 只能对对象的属性进行监测。在Vue.js2.x版本中,Vue.js的响应式机制只能监测对象的属性变化,而对于复杂的对象,例如对象的某些属性也是一个对象,则需要使用递归的方法去遍历对象更深层次的属性。
代码中使用基于Object.defineProperty的观察者模式,当修改对象data中某个对象类型属性的属性值时,需要在observer方法中进行多次遍历,直到传入defineReactive方法中的value参数不再是一个对象。
在Vue.js3.0版本中,采用了基于Proxy(代理)的观察者模式。Proxy类似于一种“拦截器”,当外部需要访问目标对象时,需要经过Proxy进行代理,而在这个过程中,Proxy可以对数据的基本操作进行自定义[7]。例如在设置对象属性前进行验证、读取对象数据时进行一些对象的格式化工作以及扩展原有的构造函数。同时,Proxy也解决了以上提到的使用Object.defineProperty这种方式的两个缺点,Proxy可以实现对整个对象的劫持监测,也能够监测到直接操作数组下标进行的数组更新。
Tree-shaking原本是JavaScript模块打包器Rollup.js的重要特性。它能够在开发中避免不必要的模块引入,减少最终打包到生产环境的代码包的体积。在Vue.js3.0中全局API将能够使用Tree-shaking。在Vue.js2.x版本中,无论需求是什么,都需要导入Vue.js的核心模块。
而在目前公布的的Vue.js3.0预览版源代码中,通过使用Tree-shaking特性可以指定当前需要导入的模块,且打包到生产环境时,只会打包代码中声明导入的模块。
只有导入的nextTick和observable模块会被打包到生产环境,这种特性更利于开发者开发出更小更轻的WEB应用[8]。
Vue.js3.0版本全面提高了可维护性,这种提升是从多方面进行的,包括调试工具的升级、编译器的重写以及更加模块化的包结构等。可维护性的提升对于Vue.js的发展有非常重要的意义,将会使得让Vue.js在未来获得更多前端开发者的欢迎。以下介绍Vue.js可维护性提升的几个重要改进:
3.4.1 全面提升的模块化体验。在Vue.js3.0代码中,可以看到大部分模块进行了重新解耦,使得每个模块都可以独立运行,极大降低了各个包之间的耦合程度。解耦后的包被放在框架中的packages文件夹下。这种提升给予了开发者更大的灵活性和自由度,开发者可以深入分析源码,对模块进行定制和二次开发。
3.4.2 编译器重写。Vue.js2.x版本中,运行时的错误提示准确度和可读性一直为人诟病。在Vue.js3.0版本中,对编译器进行了重写,提高了错误提示的准确度。另外,编译器重写后,对于IDE的支持会更加优秀,性能也得到了提升。
3.4.3 对TypeScript的支持。由于JavaScript不是强类型语言,在输入操作时容易输入错误的数据,通常开发人员会使用flow和TypeScript两种方案,而flow对于开发人员的水平要求较高,使用较为复杂,多人协作和团队开发时也会产生一些困难。TypeScript是JavaScript的超集,对于前端人员学习成本较低,Vue.js3.0版本目前已经支持了TypeScript。
Vue.js作为目前非常流行的前端框架,其新版本的特性蕴含了前端框架升级趋势以及前端领域的发展方向,值得关注。事实上,Vue.js新版本许多方面的升级,也借鉴了React,js和Angular.js的特性,使得Vue.js的新特性会更加具有代表性[9]。从Vue.js3.0版本的代码中,作者总结出前端框架的几个发展趋势:
根据以上对于Vue.js的新特性的分析,其中最突出的改进是对于性能表现的提升,Proxy机制和Composition API都为性能的提升做出了贡献,另外Tree-shaking特性的引入不仅使得打包到生产环境的源码包体积减小,同样也为性能的提升争取到了更大空间。目前,主流的前端框架大多使用MVVM的开发模式,而MVVM开发模式对视图的频繁更新容易引起性能问题,所以目前主流的前端框架都把性能的提升作为更新的重点之一。
目前前端主流框架之间并没有实现很好的合作或兼容,但是它们之间的升级和优化的方向上十分相似,在许多问题的处理上也使用了相同的解决方案。如2.x版本的Vue.js的写法就与React.js十分相似,同时它们也都使用虚拟DOM、响应式机制以及组件化开发方式。从长远发展来看,前端的主流框架将会朝着标准化统一化的方向发展,开发者的学习成本和开发效率都会更高。
如今前端项目的高复杂度使得前端技术也获得了长足发展,特别是前后端分离的应用结构的流行,前端开发已经是一项成熟的软件工程,随之配套的开发、测试、部署工具也日益成熟。在开发工作中,前端工程化包括了框架选型,开发流程设计、代码规范制定,项目构建和发布运维等。当前主流的前端框架都有着非常丰富的生态系统,随着使用的开发者的增多,大部分框架都已经形成了一套稳定的、成体系的前端工程化方案,前端工程化的发展也将会更加的深化。
Vue.js的新特性在目前前端框架的发展趋势中是具有代表性的变化和升级,从这些新特性中很容易发现前端领域正朝着轻量化和更高性能的方向发展,同时也更加人性化。Vue.js新特性在项目可维护性上做出的努力以及赋予开发者更多的灵活性和自由度都体现了前端框架对于开发者更多的关注。
目前来着,前端框架之间各自的发展方向日益趋同,如果在未来可以实现更多合作甚至遵循统一标准进行开发,前端的开发效率将会实现飞跃。