正文
Koa与流行的Express属于“同根生”的关系,它们由同一团队打造。相比Express,新的Koa框架更轻量、更灵活。但Koa的设计在短时间内曾经出现了较大的变动,这主要受到了async/await语法对异步编程的影响。在v2版本中,Koa的middleware抛弃generator转而支持async,所有第三方middleware实现,要么自行升级,要么使用Koa-convert进行包装转换。
目前Koa在Node.js社区的HTTP服务端框架中受到关注度比较高,不过其在npm上latest目前仍处于1.x阶段,预计在2017年4月份发布Node.js v8后,就会升级到2.x。
Koa的轻量级设计意味着你需要大量第三方中间件去实现一个完整的Web应用,目前鲜有看到对Koa的大规模重度使用,因此也就对其无从评价。相信在明年,越来越多的产品应该会尝试部署Koa 2,届时,对第三方资源的依赖冲突也会尖锐起来,这需要一个过程才能让Koa的生态完备起来。预计在2018年,我们会得到一个足够健壮的Koa技术栈。这会促进Node.js在服务端领域的扩展,轻量级的Web服务将会逐渐成为市场上的主流。
今年六月份jQuery发布了3.0版本,距离2.0发布已经有三年多的时间,但重大的更新几乎没有。由于老旧浏览器的逐渐放弃和升级,jQuery需要处理的浏览器兼容性问题越来越少,专注于API易用性和效率越来越多。
随着如Angular、React、Ember、Vue.js等大量具备视图数据单双向绑定能力的框架被普及,使用jQuery编写指令式的代码操作DOM的人越来越少。早在2015年便有人声称jQuery已死,社区中也进行了大量雷同的讨论,今天我们看到确实jQuery的地位已大不如前,著名的sizzle选择器在今天已完全可由querySelector原生方法替代,操作DOM也可以由框架根据数据的变动自动完成。
明年jQuery在构建大型前端产品的过程中的依赖会被持续弱化,但其对浏览器特性的理解和积淀将对现有的和未来的类Angular的MVVM框架的开发依旧具有很大的借鉴意义。
好事多磨,Angular 2的正式版终于在今年下半年发布,相比于1.x,新的版本几乎是完全重新开发的框架,已经很难从设计中找到1.x的影子。陡峭的学习曲线也随之而来,npm、ES2015 Modules、Decorator、TypeScript、Zone.js、RxJS、JIT/AOT、E2E Test,几乎都是业界这两年中的最新概念,这着实给初学者带来了不小的困难。
Angular 2也更面向于开发单页应用(SPA),这是对ES2015 Modules语法描述的模块进行打包(bundle)的必然结果,因此Angular 2也更依赖于Webpack等“bundler”工具。
虽然Angular 声称支持TypeScript、ECMAScript和Dart三种语言,不过显然业界对Dart没什么太大兴趣,而对于ECMAScript和TypeScript,两种语言模式下Angular 2在API和构建流程上都有着隐式的(文档标注不明的)差异化,这必然会给开发者以困扰。加上业界第三方工具和组件的支持有限,TypeScript几乎是现在开发者唯一的选择。
此外,Angular团队已声明并没有完全放弃对1.x组件的支持,通过特有的兼容API,你可以在2.x中使用针对1.x开发的组件。鉴于不明确的风险,相信很少有团队愿意这样折腾。
现在在产品中使用Angular 2,在架构上,你需要考虑生产环境和开发环境下两种完全不同的构建模式,也就是JIT和AOT,这需要你有两套不一样的编译流程和配置文件。在不同环境下模块是否符合期望,可以用E2E、spec等方式来进行自动化测试,好的,那么Angular 2的测试API又可能成了技术壁垒,它的复杂度可能更甚Angular本身。可以确信,在业务压力的迫使下,绝大部分团队都会放弃编写测试。
总之,Angular 2是一个非常具有竞争力的框架,其设计非常具有前瞻性,但也由于太过复杂,很多特性都会成为鸡肋,被开发者所无视。由于React和Vue.js的竞争,Angular 2对社区的影响肯定不如其前辈1.x版本,且其更高级的特性如Server Render还没有被工程化实践,因此相信业界还会持续观望,甚至要等到下一个4.x版本的发布。
Vue.js 绝对是类MVVM框架中的一匹黑马,由作者一人打造,更可贵的是作者还是华人。Vue.js在社区内的影响非常之大,特别是2.0的发布,社区快速生产出了无数基于Vue.js的解决方案,这主要还是受益于其简单的接口API和友好的文档。可见作为提供商,产品的简单易用性显得尤为重要。在性能上,Vue.js基于ES5 Setter,得到了比Angular 1.x脏检查机制成倍的性能提升。而2.0在模块化上又更进一步,开发难度更低,维护性更好。可以说Vue.js准确地戳中了普通Web开发者的痛点。在国内,Vue.js与Weex达成了合作,期待能给社区带来怎样的惊喜。
目前看来,React似乎仍是今年最流行的数据视图层解决方案,并且几乎已经成为了每名前端工程师的标配技能。今年React除了版本从0.14直接跃升至15,放弃了IE8以外,并没有更多爆发式的发展。人们对于使用JSX语法编写Web应用已经习以为常,就像过去十年间写jQuery一样。
React的代码在维护性能上显而易见,如果JSX编写得当,在重渲染性能上也具备优势,但如果只部署在浏览器环境中,那么首屏性能将会受到负面影响,毕竟在现阶段,纯前端渲染仍然快不过后端渲染,况且后端具备天生的chunked分段输出优势。我们在业界中可以看到一些负面的案例,比如某新闻应用利用React全部改写的case,就是对React的一种误用,完全不顾其场景劣势。
围绕着React发展的替代品和配套工具依旧很活跃,preact以完全兼容的API和小巧的体积为卖点,inferno以更快的速度为卖点,等等。每个框架都想在Virtual DOM上有所创新,但它们的提升都不是革命性的,由此而带来的第三方插件不兼容性,这种风险是开发者不愿承担的,笔者认为它们最大的意义在于能为React的内部实现提供另外的思路。就像在自然界,生物多样性是十分必要的,杂交能带来珍贵的进化优势。
今年是React-Native(以下简称RN)支持双端开发的第一年,不断有团队分享了自己在RN上的实践成果,似乎前途一片大好,RN确实有效解决了传统客户端受限于发版周期、H5受限于性能的难题,做到了鱼和熊掌兼得的理想目标。
但我们仍然需要质疑:
首先,RN目前以两周为周期发布新版本,没有LTS,每个版本向前不兼容。也就是说,你使用0.39.0的版本编写bundle代码,想运行在0.35.0的runtime上,这几乎会100%出问题。在这种情况下,如何制定客户端上RN的升级策略?如果升级,那么业务上如何针对一个以上的runtime版本编写代码?如果不升级,那么这意味着你需要自己维护一个LTS。要知道目前每个RN的版本都会有针对前版本的bug fix,相信没有团队有精力可以在一个老版本上同步这些,如果不能,那业务端面对的将是一个始终存在bug的runtime,其开发心理压力可想而知。