狼叔:Node全棧為前端帶來更多可能
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 構建的。后來它發展成自己自己的框架。
- 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%以上。
我們根據框架的特性進行分類:
框架名稱 | 特性 | 點評 |
---|---|---|
Express | 簡單、實用,路由中間件等五臟俱全 | 最著名的Web框架 |
Derby.js && Meteor | 同構 | 前后端都放到一起,模糊了開發便捷,看上去更簡單,實際上上對開發來說要求更高 |
Sails、Total | 面向其他語言,Ruby、PHP等 | 借鑒業界優秀實現,也是 Node.js 成熟的一個標志 |
MEAN.js | 面向架構 | 類似于腳手架,又期望同構,結果只是蹭了熱點 |
Hapi和Restfy | 面向Api && 微服務 | 移動互聯網時代Api的作用被放大,故而獨立分類。尤其是對于微服務開發更是利器 |
ThinkJS | 面向新特性 | 借鑒ThinkPHP,并慢慢走出自己的一條路,對于Async函數等新特性支持,無出其右,新版v3.0是基于Koa v2.0的作為內核的 |
Koa | 專注于異步流程改進 | 下一代Web框架 |
Egg | 基于Koa,在開發上有極大便利 | 企業級Web開發框架 |
對于框架選型
- 業務場景、特點,不必為了什么而什么,避免本末倒置;
- 自身團隊能力、喜好,有時候技術選型決定團隊氛圍的,需要平衡激進與穩定;
- 出現問題的時候,有人能夠做到源碼級定制。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這方面是先行者,想必開發者對它們都已經非常熟悉了,可以放心使用。
“向前看” or “向錢看”?
生活無非是迷茫的和目標清晰的。迷茫的人想找到目標是非常曲折的一個過程,所以最簡單的辦法就是“向錢看”,市場作為檢驗技術流行程度的一個標準。沒有目標,那就多學點能賺錢的技能。
很多人度過了迷茫期,這時候就需要“向前看”,知道自己想要什么,只能自己該做什么,有自驅能力,這時候更多的是看清趨勢,在變化中總能做對事情,除了做好的分內之事外,無論業務還是技術發展都需要對發展走勢做出正確的判斷。
對于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等,看看你是否關注新技術,加分項;
- 對前端是否了解,加分項;
- 是否參與過或寫過開源項目、技術博客,加分項。
“向前看”不是簡單在一個領域內鉆研,而是能夠在精通一門之后,擴展廣度,提高自身的解決問題能力。當然,如果能夠在架構層面去思考問題,那就更完美了,對未來職業發展有無限好處。
“專注” or “技多不壓身”?
狼叔對自己的定位是專注于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歲后事情,壓力會明顯大得多,比如家庭,孩子,房子,車子,票子,甚至是管理,權利,欲望等。對此,狼叔印象最深的是身體不如從前和記憶力明顯下降。
擁有一個好的大局觀,沒有捷徑,就是多折騰。以前看事情是點,現在看的是趨勢,能夠做到心中有數,自然胸有成竹的感覺。技術發展這么快,作為一個一把年紀的人,每天也需要適當的投入一點精力關注開源,需要不斷的更新自己,才不會讓自己的大局觀過時。
來自:http://www.infoq.com/cn/articles/node-full-stack-bring-more-possibility