为此,InfoQ 采访了阿里巴巴前端技术专家、Node 技术传道者桑世龙(狼叔),为大家解答关于 Node 的问题,以及开发者在日新月异的技术迭代环境中应该如何建立起自己的“大局观”。以下是采访的全部内容。
友情提示:在即将到来的 2018 年 GMTC 大会上,狼叔将担任 Node 专场的出品人,喜欢狼叔和对 Node 有兴趣的读者千万别错过。
Node 为解决后端并发而生,但却无心插柳,成为大前端的基石。伴随大前端的发展,Node 也发展得越来越好,越来越重要,其应用场景从脚手架、辅助前端开发(比如 SSR、PWA 等)的快速开发实践,到 API 中间层、代理层,到专业的后端开发都有非常成熟的经验。另外,前端越来越复杂,后端服务化,今日的前端要面临更多的挑战,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。
基础框架除了应用最广泛的主流 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 上表现的不太好,相关框架实践偏少。
前端越来越复杂,后端服务化,今日的前端要面临更多的挑战。一个典型的场景就是在服务化架构里,前端面临的最头痛的问题是异构 API,前后端联调的时候,多个后端互相推诿,要么拖慢上线进度,要么让前端性能变得极其慢。进度慢找前端,性能差也找前端,但这个锅真的该前端来背么?
Node.js 的 Api 中间层应用很好地解决了这个问题。后端不想改的时候,实在不行就前端自己做,更灵活,更能应变。
透传接口,对于内网或者非安全接口,可以采用中间层透传。
聚合接口,对异构 API 处理非常方便,如果能够梳理 model,应变更容易。
Mock 接口,通过 Mock 接口,提供前端开发效率,对流程优化效果极其明显,比如去哪儿开发的 yapi 就是专门解决这个问题的。
除此之外,前端如果想做一些技术驱动的事儿,SSR(服务器端渲染)和 PWA(渐进式 Web 应用)也是非常不错的选择。
深度学习,https://github.com/PAIR-code/deeplearnjs
神经网络,https://github.com/BrainJS/brain.js
区块链,http://truffleframework.com/
狼叔说他这部分接触得不多,不过从这些开源项目可以看到有很多开发者热衷于使用 Node.js 做开发创新,这是非常值得高兴的。
狼叔说过,“不是 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 框架时,总会眼花缭乱,不知道是该从众还是应当选择自己擅长的框架,对此,狼叔是这么说的。
Web 应用大致分 2 种,带视图的 传统 Web 应用 和 面向 Api 接口应用,而 Node.js Web 应用开发框架的演进时间线大致如下:
2010 年 TJ Holowaychuk 写的 Express。
2011 年 Derby.js 开始开发,8 月 5 日,WalmartLabs 的一位成员 Eran Hammer 提交了 Hapi 的第一次 git 记录。Hapi 原本是 Postmile 的一部分,并且最开始是基于 Express 构建的。后来它发展成自己自己的框架。
2012 年 1 月 21 日,专注于 Rest api 的 Restify 发布 1.0 版本,同构的 Meteor 开始投入开发,最像 Rails 的 Sails 也开始了开发。
2013 年 TJ Holowaychuk 开始玩 es6 generator,编写
co
这个 Generator 执行器,并开始了 Koa 项目。2013 年下半年李成银开始 ThinkJS,参考 ThinkPHP。2014 年 4 月 9 日,Express 发布 4.0,进入 4.x 时代持续到今天,MEAN.js 开始随着 MEAN 架构的提出开始开发,意图大一统,另外 Total.js 开始起步,最像 PHP 里 Laravel 或 Python 里的 Django 或 ASP.NET MVC 的框架,代表着 Node.js 的成熟,开始从其他语言里的成熟框架借鉴。
2015 年 8 月 22 日,下一代 Web 框架 Koa 发布 1.0,可以在 Node.js v0.12 下面,通过
co
和 generator 实现同步逻辑,那时候co
还是基于thunkfy
的,在 2015 年 10 月 30 日,ThinkJS 发布了首个基于 Es2015+ 特性开发的 v2.0 版本。2016 年 09 月,蚂蚁金服的 Eggjs,在 JSConf China 2016 上亮相并宣布开源。
2017 年 2 月,下一代 Web 框架 Koa 发布 v2.0 正式版。
2017 年 10 月,ThinkJS v3 发布,基于 Koa 内核。
2017 年 12 月,阿里巴巴开源 Egg.js v1,采用的是 『微内核 + 插件 + 上层框架』 模式。
2018 年 3 月,阿里巴巴开源 Egg.js v2,全面支持 async 函数,性能提升 30% 以上。
我们根据框架的特性进行分类:
对于框架选型
业务场景、特点,不必为了什么而什么,避免本末倒置;
自身团队能力、喜好,有时候技术选型决定团队氛围的,需要平衡激进与稳定;
出现问题的时候,有人能够做到源码级定制。Node.js 已经有 8 年历史,但模块完善程度良莠不齐,如果不慎踩到一个坑里,需要团队在无外力的情况能够搞定,否则会影响进度;
个人学习求新,企业架构求稳,无非喜好与场景而已。
Node.js 本来就为了做后端而设计的,这里我们再看看利益问题。Node.js 向后端延伸,必然会触动后端开发的利益。那么 Proxy 层的事儿,前后端矛盾的交界处,后端不想变,前端又求变,那么长此以往,Api 接口会变得越来越恶心。后端是愿意把 Api 的事儿叫前端的,对后端来说,只要你不动我的数据库和服务就可以。
但是 Node.js 能不能做这部分呢?答案是能的,这个是和 Java、PHP 类似的,一般是和数据库连接到一起,处理带有业务逻辑的。目前国内大部分都是以 Java、PHP 等为主,所以要想吃到这部分并不容易。
小公司,创业公司,新孵化的项目更倾向于 Node.js ,简单,快速,高效;
微服务架构下的某些服务,使用 Node.js 开发,是比较合理的。
国内这部分一直没有做的很好,所以 Node.js 在大公司还没有很好的被应用,安全问题、生态问题、历史遗留问题等,还有很多人对 Node.js 的误解。
单线程很脆弱,这是事实,但单线程不等于不能多核并发,而且你还有集群呢!
运维,其实很简单,比其他语言之简单,日志采集、监控也非常简单。
模块稳定性,对于
MongoDB
、MySQL
、Redis
等还是相当不错,但其他的数据库支持可能没那么好。安全问题是个伪命题,所有框架面临的都是一样的。
这些对于提供 Api 服务来说已经足够了。
对于企业 Web 开发来说,更重视稳定性和安全性,通过约定开发方式,提供高效开发效率。目前 Egg、Thinkjs、Nest 这方面是先行者,想必开发者对它们都已经非常熟悉了,可以放心使用。
生活无非是迷茫的和目标清晰的。迷茫的人想找到目标是非常曲折的一个过程,所以最简单的办法就是“向钱看”,市场作为检验技术流行程度的一个标准。没有目标,那就多学点能赚钱的技能。
很多人度过了迷茫期,这时候就需要“向前看”,知道自己想要什么,只能自己该做什么,有自驱能力,这时候更多的是看清趋势,在变化中总能做对事情,除了做好的分内之事外,无论业务还是技术发展都需要对发展走势做出正确的判断。
对于 Node.js 开发者来说,
1)“向钱看”:学会,能用,如果学会 Node.js 不能在收入或者潜在收入有提升,那也没啥意思。
Node.js 编写的包管理器 npm 已成为开源包管理了领域最好的生态,直接到 2017 年 10 月份,有模块超过 47 万,每周下载量超过 32 亿次,每个月有超过 700 万开发者使用 npm。现在早已经超过 60 万个模块了。在此,狼叔举了一个例子,他说曾有开发者向他讨教调整状态的办法,而狼叔的建议是,让他每天看 10 个 npm 模块。
狼叔认为,对于学习 Node.js 迷茫的人来说,这是最好的方式,当你不知道如何做的时候,就要向前(钱)看,你要知道积累哪些技能对以后有好处。对于学习 Node.js 必经之路,一定是要掌握很多模块用法,并从中汲取技巧、思路、设计思想的。与其不知道学什么,为什么不每天积累几个技巧呢?
2)“向前看”:用好,创造更多价值。各家公司都有 KPI,怎么能够通过 Node 快速达成自己的 KPI 是非常重要的。
a)遇到各种问题,解决不了,能不能用 node?
b)技术驱动,能不能在 node 层做一些创新?
c)提高开发效率,能否让团队用好 node,梳理出工程化最佳时间。
d) 在遇到性能瓶颈的时候,node 能否解决这些问题。
对此,狼叔给出了他的招人标准:
基本的 Node.js 几个特性,比如事件驱动、非阻塞 I/O、Stream 等;
异步流程控制相关,Promise 是必问的;
掌握 1 种以上 Web 框架,比如 Express、Koa、Thinkjs、Restfy、Hapi 等,会问遇到过哪些问题、以及前端优化等常识;
数据库相关,尤其是 SQL、缓存、Mongodb 等;
对于常见 Node.js 模块、工具的使用,观察一个人是否爱学习、折腾;
是否熟悉 linux,是否独立部署过服务器,加分项;
js 语法和 es6、es7,延伸 CoffeeScript、TypeScript 等,看看你是否关注新技术,加分项;
对前端是否了解,加分项;
是否参与过或写过开源项目、技术博客,加分项。
“向前看”不是简单在一个领域内钻研,而是能够在精通一门之后,扩展广度,提高自身的解决问题能力。当然,如果能够在架构层面去思考问题,那就更完美了,对未来职业发展有无限好处。
狼叔对自己的定位是专注于 Node.js 技术,如果没法做更多 Node.js 相关的内容,不如就离开,但这是不是意味着与“技多不压身”的观点相悖呢?对此,狼叔是这么解释的。
《Node.js in action》一书里说,Node.js 所针对的应用程序有一个专门的简称:DIRT。它表示数据密集型实时(data-intensive real-time)程序。因为 Node.js 自身在 I/O 上非常轻量,它善于将数据从一个管道混排或代理到另一个管道上,这能在处理大量请求时持有很多开放的连接,并且只占用一小部分内存。它的设计目标是保证响应能力,跟浏览器一样。
这话不假,但在今天来看,DIRT 还是范围小了。其实 DIRT 本质上说的 I/O 处理的都算,但随着大前端的发展,Node.js 已经不再只是 I/O 处理相关,而是更加的“Node”!
Node.js 使用场景主要分为 4 大类:
1)跨平台:覆盖你能想到的面向用户的所有平台,传统的 PC Web 端,以及 PC 客户端
nw.js/electron
、移动端cordova
、HTML5、react-native
、weex
,硬件http://ruff.io
等。2)Web 应用开发:网站、Api、RPC 服务等。
3)前端:三大框架 React
Vue
Angular
辅助开发,以及工程化演进过程(使用Gulp
/Webpack 构建 Web 开发工具)。4)工具:
npm
上各种工具模块,包括各种前端预编译、构建工具Grunt
/Gulp
、脚手架,命令行工具,各种奇技淫巧。
可以说目前大家能够看到的、用到的软件都有 Node.js 身影,当下最流行的软件写法也大都是基于 Node.js 的,比如 PC 客户端 luin/medis 采用 electron
打包,写法采用 React + Redux。他一直实践的【Node 全栈】,也正是基于这种趋势而形成的。在未来,Node.js 的应用场景会更加的广泛,更多参见 sindresorhus/awesome-nodejs。
狼叔亲历了从 node 0.10 到 iojs,从 node4 到目前的 node9,也写了很多文章,参加很多技术大会,做过很多次演讲,有机会和业内更多高手交流的机会。当然他也从 qunar 到阿里经历了各种 node 应用场景,对于 node 的前景他是非常笃定的。正如上文所说,善于使用 node 有无数好处,如快速出成绩、性能调优、优化团队结构、人员招聘等诸多利好,让他坚定地守护 Node.js。
Node.js 目前的应用场景和招聘市场都是极大的,很多公司都使用 Node.js,阿里、腾讯、百度和去哪儿等,还有青岛的海尔集团这样的传统名企,video++、石墨文档这样的创业互联网公司,Node 产生的商业价值是无法估量的。
狼叔的定位是 Node 全栈,以大前端为主,Node 辅助,把所有和用户直接相关的开发囊括。他认为这是趋势,他也在自身的经历中体验到了好处。而大前端目前没有形成固定模式,还在混乱发展,所以前景是非常看好的。
但他认为“笃定 Node”和“技多不压身”的观点不冲突,一个前端领域已经足够复杂,如果是大前端涵盖得更广,可谓进可攻退可守。在这种背景下,Node 其实是增加自身附加值的。个人经历优先,无法覆盖更多,这样的定位也算是另外一种专注吧。
“年轻时死磕,年长点让小弟死磕,现在抓个专家一起吃饭,没有什么是一顿饭解决不了的,不行就二顿”,这句话虽然是调侃,但也是实话,每个阶段做好每个阶段该做的事儿就好。有一句名言说的特别好,“高筑墙,广积粮,缓称王”。
年轻死磕是为了长本事,少抱怨,多思考,未来更美好。30 岁以前都可以这样做。
带团队后,要懂得任务下放,让更多人帮你,别带人越多越累。
30 岁之后是打牌阶段,技能积累足够用,这时要注重社交,打组合拳才能玩的更好。
大部分人都会认为 30 岁后事情,压力会明显大得多,比如家庭,孩子,房子,车子,票子,甚至是管理,权利,欲望等。对此,狼叔印象最深的是身体不如从前和记忆力明显下降。
拥有一个好的大局观,没有捷径,就是多折腾。以前看事情是点,现在看的是趋势,能够做到心中有数,自然胸有成竹的感觉。技术发展这么快,作为一个一把年纪的人,每天也需要适当的投入一点精力关注开源,需要不断的更新自己,才不会让自己的大局观过时。
「前端之巅」是 InfoQ 旗下关注大前端技术的垂直社群。紧跟时代潮流,共享一线技术,欢迎关注。
PWA、小程序、RN... 大前端的下一站在哪里?前端工程师的价值和成长路径是什么?前端工程师如何快速升职加薪?
2018 年 6 月 21-22 日,GMTC 全球大前端技术大会将于北京盛大开启。我们精心打造了 Web 框架、PWA、性能优化、Node 等 12+ 热门主题,并邀请了来自 Google、Facebook、BAT 等 60+ 国内外一线前端大牛,与您面对面探讨大前端领域最新技术趋势和实践。
想要获得最强实战干货,点击「阅读原文」或 识别图中二维码。目前大会 6 折抢票倒计时最后一周,立减 1440 元。有任何问题欢迎咨询票务经理 Amy,电话:18514549229(同微信)