前端科普系列(2):Node.js 换个角度看世界,
【前端科普系列】往期精彩內容:
前端科普系列(1):很有趣的一篇前端簡史,作者有心了~主要介紹 web 前端發展的歷史、大事件。
本文為系列文章(2),主要介紹 Node.js 的前世今生、核心科技以及背后的故事。
必須提一下作者:vivo?孔垂亮
一、關于 Node.js
?
1.Node.js 是什么
?
Node.js? is a JavaScript runtime built on Chrome's V8 JavaScript engine.
?
按照?Node.js官網的解釋非常簡單:
Node.js? 是一個基于 Chrome V8 引擎 的 JavaScript 運行時。
?
那我們該怎么理解這句話呢?
-
Node.js 不是 JavaScript 的應用、也不是一種框架、更不是一門語言。它是一個 JavaScript 的運行環境,就和瀏覽器是一個 JavaScript 運行環境一樣。
-
它是構建在 Chrome’s V8 這個著名的 JavaScript 引擎之上的。
?
這里不得不聊聊 Chrome & V8。
?
2.Node.js 誕生的背景
?
2008年,Google開發了Google地圖,但Google地圖那時是安卓的原生應用。為了進一步擴展Google?地圖的服務范圍,Google?針對瀏覽器開發了瀏覽器版本的Google?地圖。而這對瀏覽器的處理能力提出來更高的要求,于是當時的產品經理?Sundar Pichai?極力說服當時的董事會,要求開發一款瀏覽器(也就是現在的Chrome)。
?
當時的瀏覽器市場還是微軟的,因為操作系統內置IE,讓IE幾乎占據整個江山,并且IE是免費的,所以當時要開發一款瀏覽器遭到了董事會極力反對。
?
Sundar Pichai 強調價值不在瀏覽器本身,而在于它能訪問的內容:也就是網絡應用程序。當時最賣錢的產品,像 Google 文檔。Google 地圖 如果想吸引更多的用戶使用,并從其中的廣告銷售牟利,就必須徹底地提高瀏覽器的性能,最終他說服了董事會,把開發瀏覽器立了項。
?
隨之而來的就是如何提高瀏覽器性能的問題?當時項目組認識到,開發者不太愿意使用 JavaScript 是因為它在瀏覽器中運行得太慢了,和傳統語言不是一個量級的。
?
恰在此時,Lars Bak 出現了。這位 Google Chrome 背后的天才,早在1991年就在硅谷引起了人們的注意,后來成為業界最優秀的程序員之一。可是在2000年初,他選擇離開硅谷,回到他的祖國丹麥過幸福的生活,他覺得硅谷的開發者工作太緊張,生活方式不健康。Lars Bak 回到丹麥后,賺了足夠的錢養家糊口,就租了一大片農場,開始粉刷農舍。
?
然后就接到了 Sundar Pichai 的電話。Lars Bak 說 他并不在乎當什么高級經理,他想要做的就是打破技術的邊界,于是他接受了 Google 的 offer,但并沒有回到硅谷,而是在他自己的農場里就開始了工作。
?
2008年9月2日,V8 與 Chrome 在同一天宣布開源。世界以非同尋常的方式發現了 Chrome。Chrome 是通過Google?早前發布的漫畫冊傳出去的。公關忙成一團來回應這個消息,匆匆忙忙地舉行了電話會議,發表博客日志解釋到底發生了什么,隨后決定開新聞發布會,最后在Googleplex舉辦產品展示。
?
看過發布會的同學可能會留意到,當時非常倉促,連一個精美的PPT都沒有。
?
(圖片來源于網絡)
?
漫畫中明確提到了將 V8 嵌入到非瀏覽器項目中的可能性。
?
3.Node.js 的誕生
?
談到 Node.js 的誕生,不可避免的要聊到它的創始人 —— Node.js 之父 Ryan Dahl。Ryan Dahl 在開發 Node.js 之前是高性能Web服務的開發專家,在幫客戶解決性能問題的同時,碰到了Web服務的高并發帶來的性能問題,他嘗試過很多語言,都失敗了。經過多年的研究,Ryan Dahl 大致的感覺到了解決問題的關鍵是通過事件驅動和異步I/O來達成目的。
?
就在他快要絕望的時候,V8 隨著 Chrome 瀏覽器的問世而出現,JavaScript 腳本語言的執行效率得到質的提升,這給 Ryan Dahl 帶來新的啟示:JavaScript 本身就是單線程的,而且瀏覽器發起的 AJAX 請求就是非阻塞的。如果將 JavaScript 和異步 IO 以及一個簡單的 HTTP 服務器集合在一起,就會變成一個很酷的東西。他原本的研究就這樣與 V8 之間碰撞出火花,V8 滿足他關于高性能 Web 服務的所有想象:
?
沒有歷史包袱,沒有同步 I/O。不會出現一個同步 I/O 導致事件循環性能急劇降低的情況。
V8 性能足夠好,遠遠比 Python、Ruby 等其他腳本語言的引擎要快。
JavaScript 語言的閉包特性非常方便,比 C 中的回調函數好用。
?
于是在 2009 年的 2 月,按新的想法他提交了項目的第一行代碼,這個項目的名字最終被定名為"node"。
?
2009 年 5 月,Ryan Dahl 正式向外界宣布他做的這個項目。
?
2009 年底,Ryan Dahl 在柏林舉行的 JSConf EU 會議上發表關于 Node.js 的演講,之后 Node.js 逐漸流行于世。
?
總得來說,Node.js 并不是憑空誕生的,它的出現要歸功于 Ryan Dahl 歷時多年的研究,以及一個恰到好處的節點。
?
二、Node.js 現狀
?
2018 年 5 月 31 日,Node.js 基金會發布的用戶調查報告,顯示學習 Node.js 看起來更容易了,少于 2 年 node 經驗的用戶中,有 43% 的覺得“容易”。絕大多數(85%)Node.js 用戶用于網頁開發,43% 參與一些企業級開發,13% 用于大數據分析,8% 用于嵌入式系統。
?
用戶調查報告中還顯示,受訪的使用者會用如下的詞語來描述 Node.js。
?
?
(圖片來源于網絡)
?
更為重要的是,報告顯示 Node.js 社區仍然在快速成長。而這得益于 Node.js 的應用場景非常廣泛.
?
?
越來越多的開發者開始轉向 Node.js ,幾乎每個公司/小組都會有自己的命令行工具、腳手架。使用 Node.js 能夠快速開發各式各樣的能極大提高開發效率的神器。
?
三、Node.js 核心科技
?
Node.js 采用事件驅動、異步編程,為網絡服務而設計。
?
在前面我們聊 Node.js 誕生的時候,就提過 Node.js 之父 Ryan Dahl 在設計 Node.js 時就是為了解決 web 服務高并發帶來的性能問題,而這個問題隨著 V8 的出現而迎刃而解。
?
如下圖,當網絡請求發生時,如果有文件或者數據庫操作,Node.js 會注冊一個回調函數,然后就去處理下一個請求了。當之前文件或者數據庫操作完成后,觸發之前注冊的事件回調,進而響應之前的網絡請求。
?
?
由于整個設計都是以事件驅動為核心的,它的重要優勢在于,充分利用了系統資源,執行代碼無須阻塞等待某種操作完成,有限的資源可以用于其他的任務。
?
之后的很長一段時間,Ryan Dahl 四處發表演講,試圖說服人們相信阻塞式 IO 是錯誤的方式,如果使用非阻塞的方式來處理所有的事情,那么就可以解決很多難點。
?
關于事件驅動編程,可以參考我的一篇知乎文章:《JavaScript運行機制:事件驅動編程詳解》
?
Node.js 的性能不錯。
?
前面提到的用戶調查報告中顯示,用戶評價 Node.js 最多的就是 Fast ,對,就是快!
?
按照 Ryan Dahl 的說法,性能是 Node.js 考慮的重要因素,選擇 C++ 和 V8 而不是別的也是基于性能的考慮。
?
Node.js 在設計上比較大膽,它以單進程、單線程模式運行(和 Javascript 的運行方式一致),事件驅動機制是 Node.js 通過內部單線程高效地維護事件循環隊列來實現的,沒有多線程的資源占用和上下文切換,這意味著面對大規模的 http 請求,Node.js 憑借事件驅動搞定一切。由此我們可以知道這樣的設計會導致負載的壓力集中在 CPU 而不是內存。所以 Node.js 特別適合 IO 密集型的應用,能夠充分發揮 CPU 的威力。
?
Node.js 支持 JavaScript。
?
這是 Node.js 能夠發展壯大的一個非常重要的間接原因。
-
首先,Javascript 作為前端工程師的主力語言,在技術社區中有相當的號召力。而且,隨著 Web 技術的不斷發展,特別是前端的重要性增加,不少前端工程師開始試水”后臺應用“,在許多采用 Node.js 的企業中,工程師都表示因為習慣了 Javascript,所以選擇 Node.js。
-
其次,Javascript 的匿名函數和閉包特性非常適合事件驅動、異步編程。
-
有 Google V8 引擎的加持,Node.js 的性能也是受益其中。
?
當然事件驅動、異步編程也不是沒有它的弊端,當都寫成回調函數的形勢后,會有違正常人的思維,剛開始會特別不習慣,并且回調太多,容易產生回調地獄,當然后面的 Promise、Async、Await 都致力于解決這個問題。
?
四、Node.js 背后的那些人那些事
?
Node.js 誕生后,就吸引了一群有趣的人參與 Node.js 早期的開發,他們一開始就發現軟件包管理在 Node.js 里將會非常有用武之地,于是他們開始各自開發包管理工具。其中有一個癡迷于 Node.js 的 Yahoo 員工 Isaac Schlueter,他辭掉工作,開始專心開發包管理工具(就是現在的 npm ),他曾經深度參與過 Nodejs 的開發,這使得他可以在 Node.js 中實現 CommonJS 的模塊規范。
?
這款包管理工具足夠優秀,得到了 Node 官方的大力支持,它贏了。這款包管理工具,或者說 npm,開始和 Node 安裝包捆綁打包,它可不是一個單獨的第三方插件,不需要你裝完 Node 再去下載包管理工具。這塊 Node 官方認證的金字招牌一直掛到今天。
?
也就是在這個時候(2010, Node.js 誕生的第二年),一家位于硅谷的創業公司注意到了該項目。這家公司就是 Joyent,主要從事云計算和數據分析等。Joyent 意識到 Node.js 項目的價值,Joyent 用很少一筆錢從 Ryan Dahl 手中買走了 Node.js。
?
Ryan Dahl 就以區區幾萬美元,把 Node.js 包括源碼在內的所有一股腦賣給 Joyent。數百萬人每天用 Node.js 作為 JavaScript 開發的工具,而發明 Node.js 的人只用它賺了幾萬美元。
?
之后,Ryan Dahl 就加入 Joyent ,全職負責 Node.js 的開發,也就是從此刻起,Node.js 進入了它生命歷程里的第二個階段:從個人項目變成一個公司組織下的項目。Joyent 注冊了“Node.js”這個商標,使用其相關內容需要得到法律授權。
?
與此同時,npm 的作者 Isaac Schlueter 被 Joyent 聘來開發 Node.js,但他保留了 npmjs.org 域名、npm 源碼以及源碼中的任何專利的所有權,這些都是他自己的知識產權。這個決定會對后世產生深遠影響……
?
在加入 Joyent 成為全職的 Node 開發人員之后,Ryan Dahl 也隨之成為更加重量級的人物。參加各種大會,被粉絲要求合影拍照,隨便寫點東西都會有很多人響應。但 Ryan 并不喜歡這種狀態,他說:"我是一個程序員,我想寫代碼,我想無拘無束地表達我的想法。我并不喜歡這種狀態……"。
?
2012 年,就在 Node.js 如日中天的時候,Ryan Dahl 選擇離開了 Node.js。npm 的作者 Isaac Schlueter 接替他登上了項目組的領導崗位。就是在這個時候,JavaScript 開發者們紛紛登場了,能用 JavaScript 實現某個工具,他們絕對不會看其他語言一眼!因此他們開始用 Javascript 開發 Node 程序,并且樂在其中。
?
Isaac Schlueter 親眼目睹過 Joyent 給 Ryan Dahl 出的價格是多么低廉,也知道 Node.js 的價值到底應該值多少錢。于是在 2013 年,他決定讓 npm 走商業化路線,因此他向 Joyent 遞交了辭呈,成立了一家公司 —— npm 公司。也就是從這個時候開始,Node.js 出現了很嚴重的問題:貢獻頻率開始下降,代碼提交主要來自社區,代碼的版本下降到三個月才能發布一個小版本,社區一直期待的 1.0 版本遲遲不能發布。另外還發生了人稱代詞事件?致使 Node.js 項目的活躍度更低,Joyent 對于項目的不作為和其他層面對社區其他成員的干預,導致項目進展十分緩慢,用蝸牛的速度來形容一點也不為過。
?
2014 年 8 月,以社區里非常有威望的 Mikeal Rogers 為首,幾個重要的核心貢獻者,發起了 io.js 項目,宣告了 Node.js 社區的正式分裂。io.js 不再是之前的技術負責人模式,取而代之的是技術委員會模式。io.js 于 2015-01-14 發布了 v1.0.0 版本。自此 io.js 一發不可收拾,以周為單位發布新的版本,在架構層面依然保持著 Node.js 的樣子(由 Ryan Dahl 時確立)但是對于 ECMAScript 6 持擁抱態度,又重新保持了周為單位的版本更新頻率。
?
與此同時,Joyent 也意識到了問題,成立了臨時的 Node.js 顧問委員會,想借助顧問委員會的形式來打造一個更加開放的管理模式,以找到辦法來平衡所有成員的需要,為各方提供一個平臺來投入資源到 Node.js 項目。顧問委員會調研了 IBM(Eclipse)、Linux 基金會、Apache 等,決定成立 Node.js 基金會的形式。
?
到了 2015 年 5 月,Node.js 顧問委員會最終決定與 io.js 進行和解,共同制定一個新的管理模式來確保 Node.js 的下一步發展, Joyent 公司本著開放的原則,在這件事情上也做出很大的讓步。但此時,io.js 已經發了 2.0 版本,Node.js 遠遠落后于 io.js ,最終的解決方案是 Node.js 項目和 io.js 項目都將加入 Node.js 基金會,Node.js 基金會之后 Node.js 版本的發布將基于目前 io.js 的進展來進行,也就是說 io.js 會繼續保持發布,而 Node.js 的下個大版本跨過 1.0、2.0、3.0,直接到 4.0。如下圖所示:
然后,npm 也做大做強了,讓 Node.js 的普及率爆炸性增長。所有 JavaScript 開發者都開始用 Node.js 做開發,而 npm 則成為每個 JavaScript 開發者日常工作中不可或缺的一部分。可很少有人知道 npm 是一家企業,是一個由風投資金贊助的私人公司。
?
npm 的經營策略由一個公司來掌舵,其含義是什么?在去年的這個大會上,Node.js 之父 Ryan Dahl 再次登臺演講。他談到了 Node.js 的設計誤區。其中說了一句話:
?
模塊倉庫的中心化(甚至由私人所控制)是一種不幸。—— Ryan Dahl
?
2016年初, npm 圈發生了“一個 11 行的模塊引發的血案”。left-pad 工具模塊被作者從 npm 上撤下,所有直接或者間接依賴這個模塊的 npm 包就憂傷的掛掉了,包括 babel 這樣的熱門項目。
?
而其中的原因大概是這樣:作者 Azer 寫了一個叫 kik 的工具和某個公司同名了,這天公司的律師要求其刪掉這個模塊,把 kik 這個名字“讓”給他們,作者不答應,律師就直接找 npm 了,而 npm 未經作者同意就把包的權限轉移給了這家公司。于是,Azer 一怒沖冠,將他所有的 npm 包全部刪掉了。
?
下一節,聊聊 Commonjs 以及 前端模塊化規范……
?
參考文獻
?
-
如何正確的學習Node.js
-
Lars Bak:Google Chrome瀏覽器背后的天才
-
Node.js 與 io.js 那些事兒
-
深入淺出 Node.js(一):什么是 Node.js
-
NPM的經濟風云(上)
-
從 left-pad 事件我們可以學到什么
-
Node 之父 Ryan Dahl:我不想被定義
-
2018 Node.js 用戶調查報告顯示社區仍然在快速成長
總結
以上是生活随笔為你收集整理的前端科普系列(2):Node.js 换个角度看世界,的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里文娱测试开发专家谈《算法基石:实时数
- 下一篇: 后端工程师面试BAT,被问到了前端?就倒