您好,登錄后才能下訂單哦!
這篇文章給大家介紹怎樣進行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。
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 嵌入到非瀏覽器項目中的可能性。
談到 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 歷時多年的研究,以及一個恰到好處的節點。
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 之父 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 的 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
關于怎樣進行Node.js的分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。