Node.js十年,你大爺還是你大爺

Node.js從2009年誕生開始,到現在已有10歲,在這10年裡,它的成長和成熟是大家有目共睹的。它因後端簡化併發編程而被關注,因作為前端輔助開發工具而流行,因異步流程控制和回調地獄而被人詬病,因npm批量安裝模塊而被人敬仰。

作為技術領域裡的明星項目,Node.js自誕生以來就一直處於風口浪尖之上。下面就來聊聊這些年Node.js被人們反覆提起的“黑料”。

01 PART 版本帝?

Node.js 是名副其實的版本帝,版本更新確實很頻繁,時間線如下。

  • 2013年,發佈了0.10版本。
  • 2015年1月,發佈了1.0.0版本(io.js)。
  • 2015年5月,發佈了2.x版本(io.js)。
  • 2015年8月,發佈了3.x版本(io.js)。
  • 2015年9月,Node.js基金會發布了5.0版本與io.js合併後的第一個版本。
  • 2015年10月,Node.js 5.2.0版本成為首個LTS(長期支持)版本。
  • 2015年年底,發佈了5.2.4和5.5.0版本。
  • 2016年3月,發佈了5.5.0 LTS版本和5.9.0 Stable穩定版本。
  • 2016年年底,6.0版本支持95%以上的ES6特性,7.0版本通過flag支持async函數,全面支持99%的ES6特性。
  • 2017年2月,發佈了7.6版本,可以不通過flag使用async函數。
  • 2017年5月,發佈了8.0版本,支持async Hooks,N-API等特性。
  • 2018年4月,發佈了10.0版本,新增http2模塊,將npm從v5.7更新到了v6,並且增強了對ESMModules的支持。
  • 2018年10月,發佈了11.0版本,增加了多線程Worker Threads。

整體上來說,Node.js的發展趨於穩定。成立Node.js基金會能夠讓Node.js在未來獲得更好的開源社區支持;發佈LTS版本意味著Node.js SDK API趨於穩定;頻繁發佈版本雖然被很多人詬病,但換個角度來看,這也是社區活躍的一個體現,如果大家真的看了Changelog,便會發現,新版本相比於舊版本只增加了一些小的改進,而且是邊邊角角的改進,也就是說,Node.js的核心代碼已經非常穩定了,可以大規模使用。

02 PART 已無性能優勢?

Node.js在2009年橫空出世,可以說靠異步特性獲得了很大的性能優勢。所有語言幾乎沒有能和它相比的。但是福禍相依,因為性能太出眾,所以促使很多語言、編程模型都紛紛進行改進,比如產生了Go語言,比如PHP裡的SWoole框架可以支持異步協程了,再比如鳥哥(惠新宸)對PHP的VM進行了改進,大家似乎都以不支持異步為恥。後來的故事大家都知道了,各種語言的性能都得到了提高。

那麼在這種情況下,Node.js還有優勢嗎?

在實現難易度上 ,Node.js除了異步流程控制稍複雜外,其他的都非常簡單。比如在寫法上,你可以選擇編寫面向過程、面向對象、函數式的程序。不要因為Node.js變化快,就覺得自己跟不上潮流。一般後端程序員轉為Node.js開發人員時,幾乎兩週就能精通,這一點相比其他語言還是很有優勢的。

在調優成本上, Node.js即使不進行優化,性能也非常好,另外,對Node.js進行優化也比其他語言更簡單。

在學習成本上, Node.js是有優勢的。學習其他語言,前後端至少要學兩種以上,如果學習Node.js,你只需要學會JavaScript即可,可以少學一種語言。我想問,大前端離得開JavaScript嗎?今日的前端還不夠複雜嗎?你真的有那麼多精力學習更多語言嗎?

其實大家可以關注一下基於npm的開源生態,截至2019年3月,npm上已有超過94.7萬個模塊,“秒殺”無數競品。npm是所有開源包管理中最強大的,我們說“更了不起的Node.js”,其實npm居功甚偉。下圖展示了來自Module Counts的各個包管理模塊的差異。

Node.js十年,你大爺還是你大爺

npm生態是Node.js的優勢,可是說“Node.js沒有性能優勢”真的對嗎?這其實是對Node.js的誤解。Node.js的性能依然很好,不斷迭代的版本其實就是在提升性能。而且Node.js具有npm極其完善的生態,可謂性能與生態雙劍合璧,這是無與倫比的。

03 PART 異步和回調地獄

正因為異步特性,Node.jsAPI設計只能採用錯誤優先(Error-First)風格的回調約定,於是大家硬生生地把多層回調寫成了回調地獄(callback hell),這時就有各種“黑粉”冒出來對Node.js進行攻擊。

但正是因為回調地獄是最差的實踐,所以大家才不得不求變,於是Thunk函數、Promise/A+規範等相繼出現。雖然Promise/A+規範不是那麼完美,但對於解決回調地獄問題來說已經足夠。而且Generator特性和Generator的執行環境co模塊也被逐漸引入新的異步解決方案,使得異步在寫法上越來越接近於同步。當async函數落地的時候,Node.js 已經站在了同C#、Python一樣的高度上,大家還有什麼理由攻擊它呢?

下面列舉了Node.js支持的所有異步解決方案,並給出了推薦建議(5星為最高級別)。

Node.js十年,你大爺還是你大爺

從推薦指數可以看出,我們應首選async函數,但要注意版本問題,要使用最新的版本。其次就是Promise,它都能非常好地駕馭callback和async函數,尤其是在異常捕獲、擴展上,具有明顯的優勢。

有時,將一件事做到極致,也許能收穫另一片天地。異步流程控制是Node.js編程的核心,掌握異步流程控制之後,Node.js中就只剩API需要學習了,後面會詳細講解。

04 PART 技術棧演進

自從ES6規範在Node.js中落地之後,整個Node.js開發領域都發生了翻天覆地的變化。從v0.10開始,Node.js中就逐漸加入了ES6特性,比如Node.js v0.12可以使用Generator,這也促使尋求異步流程控制的TJ Holowaychuk寫出了co這個著名的模塊,進而產生了Koa框架。但是在v5.0之前,必須通過flag才能開啟Generator支持,因此Koa v1.0遲遲未發佈,在Node.js v5.0發佈後,Koa v1.0才發佈。

2015年,傳統寫法終結;2016年,變革寫法開始興起。其中核心變更是支持使用ES6語法編寫Node.js代碼。

  • 可以使用Node.js v5.x+裡的ES6特性,如果想實現更高級的功能,可以使用Babel編譯支持ES7特性,或者使用TypeScript。
  • 合理使用Standard或者xo模塊代碼風格約定。
  • 適當引入ES6語法,只要Node.js SDK內置支持的,都可以使用。
  • 大家要重視面向對象寫法的使用,雖然ES6的面向對象機制不健全,但以後定會不斷完善。面向對象對於大型軟件開發更適合,這其實也是我推薦使用TypeScript的原因之一。

下面對比了變革前後的技術棧選型,希望讀者能夠從中感受到其中的變化。

Node.js十年,你大爺還是你大爺

Node.js十年,你大爺還是你大爺

狼書一出,Node再無遺冊✪

Node.js在2009年橫空出世時,確實是獨一無二的。但在今天,已經10歲的Node.js有了更多、更廣泛的應用場景,它的意義已經遠遠大於設計時的初衷了。隨著大前端領域的蓬勃發展,跨平臺開發、API構建、Web應用開發等場景愈加常見,Node.js也成為大前端開發的必備“神器”。

▊ 《狼書(卷2):Node.js Web應用開發》狼叔 著

Node.js十年,你大爺還是你大爺

本書主要講解Node.js Web應用開發涉及的HTTP基礎知識、常用開發框架、源碼原理、數據庫和項目實戰,旨在向讀者展示如何通過Node.js和Koa編寫出更具前端特色的Web應用。

Koa立身於最“潮”的異步流程控制特性,主要用於改進Node.js開發中的回調地獄痛點,可以說Koa是異步流程控制不斷演進的必然產物。在所有的Node.js Web框架中,Koa無疑是最耀眼的一個。

Node.js十年,你大爺還是你大爺

(掃碼獲取本書詳情)


作 者 簡 介


狼叔(網名i5ting),Node.js 技術佈道者,“Node全棧”公眾號作者,全棧技術實踐者。曾就職於多家知名IT企業,從事前端開發、後端開發、數據分析等工作,目前負責公司內的Node.js開發和基礎框架開發工作。

本 書 內 容


本書共分8章,每章的內容簡介如下。

第1章 下一代Web框架Koa本章將介紹Koa框架的入門知識、優勢、應用場景,Koa腳手架的編寫方式,以及Node.js Web框架的演進過程。基於最新的AVA測試框架編寫測試用例也是本章非常有特色的一節。

第2章 Koa核心擴展機制:中間件

本章將介紹Koa的核心中間件原理,以及Koa中常用的中間件:路由、視圖、靜態服務模塊等。中間件機制是Koa的核心內容,因此本章內容非常重要。

第3章 HTTP必知必會

本章將介紹請求響應模型,也將對HTTP和HTTPS進行講解,同時以mini-proxy和hiproxy為核心對前端最常用的代理進行講解。

第4章 Koa練習

本章將結合第3章的HTTP相關知識進行Koa框架內置方法的練習,比如地址解析、參數獲取、body解析、API開發,還將介紹各種測試模塊和工具軟件的用法。

第5章 數據庫基礎

本章將介紹Node.js數據庫選型和MVC模型層的用法,以及使用Mongoose模塊操作MongoDB的方法,其中涉及Mongoose中的一些進階技巧:模型擴展、虛擬屬性、回調鉤子和插件機制。

第6章 數據庫進階

本章將在第5章的基礎上介紹數據庫中的進階技巧:分頁、關聯查詢、事務、性能調優等。通過本章大家能夠對Node.js數據庫選型掌握得更好。

第7章 前端視圖模板

本章將從public目錄講起,介紹前端相關知識,主要涉及模板編譯原理、Webpack進階知識。本章還將介紹前後端分離和服務器端渲染的演進,並提出對未來Serverless環境下前端渲染層的見解。

第8章 項目實戰

本章將以CNode項目為核心,介紹基於Egg.js框架的項目代碼,還會介紹基於Docker快速開發Node.js Web應用的方法。

————

本書中的各章在內容上基本是相互獨立的,因此各位讀者可以挑選自己感興趣的章節閱讀。這本書是《狼書》系列圖書的第2卷,第1卷主要介紹Node.js基礎知識,第3卷主要介紹Node.js高級應用。3卷搭配閱讀,效果更好。

  • 《狼書(卷1):更了不起的Node.js》
  • 《狼書(卷3):Node.js高級技術》(即將出版)


分享到:


相關文章: