2009 年, Node.js 横空出世, 在几年时间里, Node.js 凭借其高性能, 易部署等特点迅速在前端领域脱颖而出, 成为大火的明星. 但一个技术再好, 也是有生命周期的, 许多开发者开始质疑, Node.js 是不是在走下坡路了? Node.js 是不是越来越不吃香了?
为此, InfoQ 独家采访了阿里巴巴前端技术专家, Node 技术传道者桑世龙(狼叔), 为大家解答关于 Node 的问题, 以及开发者在日新月异的技术迭代环境中应该如何建立起自己的 "大局观". 以下是采访的全部内容.
友情提示: 在即将到来的 2018 年 GMTC 大会上, 狼叔将担任 Node 专场的出品人, 喜欢狼叔和对 Node 有兴趣的读者千万别错过.
Node 为解决后端并发而生, 但却无心插柳, 成为大前端的基石. 伴随大前端的发展, Node 也发展得越来越好, 越来越重要, 其应用场景从脚手架, 辅助前端开发 (比如 SSR,PWA 等) 的快速开发实践, 到 API 中间层, 代理层, 到专业的后端开发都有非常成熟的经验. 另外, 前端越来越复杂, 后端服务化, 今日的前端要面临更多的挑战, Node 全栈给大家更多可能, 狼叔对此坚定不移.
2017 年, Node 的日子好过吗?
狼叔主要从以下四个方面介绍了 2017 年 Node 发生的变化:
a)Node 8 进入 LTS 时代
b)企业级 web 开发
c)不可不见的 Api 中间层
d)新领域(深度学习, 区块链等)
a)Node 8 进入 LTS 时代
2017 年, Node.js 最大的变化是进入 Node 8 时代, 它是一个稳定的长期支持版本(LTS), 除了性能提升外, 还有以下几个要点.
Async/Await 支持. 其实在 Node.js v7.6 就可以通过 flag 支持了, 在 node8 里直接落地. 通过 Async 函数可以更好的进行异步流程控制, 远离 Callback Hell. 在 Async 函数里, 你可以通过 await 调用 Promise, 以及通过 co 包裹的 generator, 可以说, 向前是完美的 Async 函数, 向后也完美兼容各种遗留代码, 称为异步终极解决方案不为过.
ES6 模块支持. 通过 vue/react,webpack,babel 和 typescript 等火爆发展, es6 模块得到了广泛普及和应用, 在 Node.js v8.5 可以通过 --experimental-modules 来开启这个体验版特性. 当然, 你想在 Node.js 更早版本里使用 ES6 模块, 可以采用 @std/esm 模块.
HTTP2 支持. 在 Node.js v8.8 就开始默认启用了, http2 对服务器端推送, 多通道复用等特性, 能够更好地为浏览器便利, 是性能优化的利器.
Node v9.9 对 ES2018 支持是 75%, 在 Node v10 里支持是 100%, 还是非常值得期待的, 更多信息参见 http://node.green/#ES2018 .
b)企业级 Web 开发
基础框架除了应用最广泛的主流 Web 框架 Koa 外, Fastify 也是一直劲敌, 作者 Matteo Collina 是 Node.js 核心开发, Stream 掌门, 性能优化专家. Fastify 基于 Schema 优化, 对性能提升极其明显. 狼叔认为这是企业级 Web 开发, 他在这里给我们介绍了 3 个知名框架.
b1)Egg.js
阿里开源的企业级 Node.js 框架 Egg 发布 2.0, 基于 Koa 2.x, 异步解决方案直接基于 Async Function. 框架层优化不含 Node 8 带来的提升外, 带来 30% 左右的性能提升.
Egg 采用的是 微内核 + 插件 + 上层框架 模式, 对于定制, 生态, 快速开发有明显提升, 另外值得关注的是稳定性和安全上, 也是极为出色的.
b2)Nest
Nest 是基于 TypeScript 和 Express 的企业级 Web 框架.
很多人开玩笑说, Nest 是最像 Java 开发方式的, 确实, Nest 采用 TypeScript 作为底层语言, TypeScript 是 ES6 超集, 对类型支持, 面向对象, Decorator(类似于 Java 里注解 Annotation)等支持. 在写法上, 保持 Java 开发者的习惯, 能够吸引更多人快速上手.
TypeScript 支持几乎是目前所有 Node Web 框架都要做的头等大事, 在 2017 年 Nest 算首个知名项目, 值得一提.
b3)ThinkJS
ThinkJS 是一款拥抱未来的 Node.js Web 框架, 致力于集成项目最佳实践, 规范项目让企业级团队开发变得更加简单, 更加高效. 秉承简洁易用的设计原则, 在保持出色的性能和至简的代码同时, 注重开发体验和易用性, 为 WEB 应用开发提供强有力的支持.
ThinkJS 是国产老牌 Web 框架, 在 2017 年 10 月发布 v3 版本, 基于 Koa 内核, 在性能和开发体验上有更好的提升.
整体来看, Node.js 在企业 Web 开发领域日渐成熟, 无论微服务, 还是 Api 中间层都得到了非常好的落地. 2017 年, 唯一遗憾的是 Node.js 在 servless 上表现的不太好, 相关框架实践偏少.
c)不可不见的 Api 中间层
前端越来越复杂, 后端服务化, 今日的前端要面临更多的挑战. 一个典型的场景就是在服务化架构里, 前端面临的最头痛的问题是异构 API, 前后端联调的时候, 多个后端互相推诿, 要么拖慢上线进度, 要么让前端性能变得极其慢. 进度慢找前端, 性能差也找前端, 但这个锅真的该前端来背么?
Node.js 的 Api 中间层应用很好地解决了这个问题. 后端不想改的时候, 实在不行就前端自己做, 更灵活, 更能应变.
透传接口, 对于内网或者非安全接口, 可以采用中间层透传.
聚合接口, 对异构 API 处理非常方便, 如果能够梳理 model, 应变更容易.
Mock 接口, 通过 Mock 接口, 提供前端开发效率, 对流程优化效果极其明显, 比如去哪儿开发的 yapi 就是专门解决这个问题的.
除此之外, 前端如果想做一些技术驱动的事儿, SSR(服务器端渲染)和 PWA(渐进式 Web 应用)也是非常不错的选择.
d)新领域(深度学习, 区块链等)
深度学习, https://github.com/PAIR-code/deeplearnjs
神经网络, https://github.com/BrainJS/brain.js
区块链, http://truffleframework.com/
狼叔说他这部分接触得不多, 不过从这些开源项目可以看到有很多开发者热衷于使用 Node.js 做开发创新, 这是非常值得高兴的.
如何将 Node 的价值发挥到极致?
狼叔说过,"不是 Node 不行, 而是你不会用", 他认为很多人对 Node.js 有很多误解, 从 2009 年诞生到现在, Node.js 的改变进化是非常明显的, 甚至说是有了质的变化.
比如 Callback hell, 现在可以通过 Async 函数解决.
比如作为过渡技术栈的 thunk 函数和 generator, 慢慢的消失在历史舞台.
比如 node 是单进程非常脆弱, 但是你真的部署对了么? 比如
比如数据库事务问题, 这是 node 的锅么? 你用 mongodb 玩不好, 也要赖到 node 身上么?
一般, 后端开发指的是 Web 应用开发中和视图渲染无关的部分, 但现在架构升级, Node 承担了前后端分离重任之后, 有了更多玩法. 从带视图的传统 Web 应用 和
面向 Api 接口应用
, 到通过 RPC 调用封装对数据库的操作, 到提供前端 Api 代理和网关, 服务组装等, 统称为后端开发, 不再是以往只有和数据库打交道的部分才算后端, 这样, 就可以让前端工程师对开发过程可控, 更好的进行调优和性能优化.
对 Node.js 来说, 一直没有在后端取得其合理的占有率. 原因很简单:
1)利益分配, 已有实现大多是 Java 或者其他语言, 基本是没法撼动的, 重写的成本是巨大的, 另外, 如果用 Node 写了, 那么那些写 Java 的人怎么办? 抢人饭碗, 这是要拼命的.
2)Node 相对年轻, 大家对 Node 的理解不够, 回调和异步流程控制略麻烦, 很多架构师都不愿意花时间去学习. 尽管在 Web 应用部分处理起来非常简单高效, 但在遇到问题时并不容易排查定位, 对开发者水平要求略高.
3)开发者技能单一, 很多是从前端转过来的, 对数据库, 架构方面知识欠缺, 对系统设计也知之不多, 这是很危险的, 有种麻杆打狼两头害怕的感觉.
4)Node 在科普, 培训, 布道等方面做的并不好, 国外使用的非常多, 国内却很少人知道, 不如某些语言做得好.
纵览 2017 年 Node.js 的发展路程, 作为一个亲历者, 他觉得 Node 在 4 个方面表现得极为突出:
前端实践, 脚手架, 工程化, 快速开发;
API Proxy 中间层实践, 页面即服务概念;
面向企业开发的 Web 框架;
Node 最新技术与性能调优.
狼叔希望更多的 Node.js 开发者能够参与其中, 本次 GMTC 大会也会围绕这写主题进行 topic 筛选, 希望能够为国内 Node.js 的繁荣做出一点贡献.
如何选择适合自己的 Node 框架?
开发者在面对如此多的 Node 框架时, 总会眼花缭乱, 不知道是该从众还是应当选择自己擅长的框架, 对此, 狼叔是这么说的.
Web 应用大致分 2 种, 带视图的 传统 Web 应用 和 面向 Api 接口应用 , 而 Node.js Web 应用开发框架的演进时间线大致如下:
2010 年 TJ Holowaychuk 写的 Express.
2011 年 Derby.js 开始开发, 8 月 5 日, WalmartLabs 的一位成员 Eran Hammer 提交了 Hapi 的第一次 git 记录. Hapi 原本是 Postmile 的一部分, 并且最开始是基于 Express 构建的. 后来它发展成自己自己的框架.
来源: http://www.tuicool.com/articles/eMrmuqy