當前位置:
首頁 > 最新 > 狼叔:Node全棧為前端帶來更多可能

狼叔: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 身上么?

一般,後端開發指的是 應用開發中和視圖渲染無關的部分,但現在架構升級, 承擔了前後端分離重任之後,有了更多玩法。從帶視圖的傳統 和 ,到通過 調用封裝對資料庫的操作,到提供前端 代理和網關,服務組裝等,統稱為後端開發,不再是以往只有和資料庫打交道的部分才算後端,這樣,就可以讓前端工程師對開發過程可控,更好的進行調優和性能優化。

對 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,編寫 這個 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 下面,通過 和 generator 實現同步邏輯,那時候 還是基於 的,在 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 的誤解。

單線程很脆弱,這是事實,但單線程不等於不能多核並發,而且你還有集群呢!

運維,其實很簡單,比其他語言之簡單,日誌採集、監控也非常簡單。

模塊穩定性,對於 、、 等還是相當不錯,但其他的資料庫支持可能沒那麼好。

安全問題是個偽命題,所有框架面臨的都是一樣的。

這些對於提供 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 客戶端 、移動端 、HTML5、、,硬體 等。

2)Web 應用開發:網站、Api、RPC 服務等。

3)前端:三大框架 React 輔助開發,以及工程化演進過程(使用/Webpack 構建 Web 開發工具)。

4)工具:上各種工具模塊,包括各種前端預編譯、構建工具 / 、腳手架,命令行工具,各種奇技淫巧。

可以說目前大家能夠看到的、用到的軟體都有 Node.js 身影,當下最流行的軟體寫法也大都是基於 Node.js 的,比如 PC 客戶端 luin/medis 採用 打包,寫法採用 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+ 國內外一線前端大牛,與您面對面探討大前端領域最新技術趨勢和實踐。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

每日推薦歌單:Mi2的《勇敢愛》,不知不覺我愛上了他
為什麼書畫越來越難做,而畫家卻一直在漲價?

TAG:全球大搜羅 |