為什麼要讀nodejs原始碼?

2021-10-19 09:54:06 字數 2456 閱讀 1398

前幾天有個同學和我說,他在看nodejs原始碼,但是不知道為什麼需要看,也不知道從中可以學到什麼。所以今天想聊一下關於閱讀nodejs原始碼的意義。閱讀其他原始碼也類似。

首先,閱讀原始碼的目的無非兩個

1 深入了解和理解他或一些底層的原理

2 從中學到一些優秀的設計思想和實踐。

如果你沒有兩個目的,那其實就沒有必要去看原始碼了。那接下來聊一下從閱讀nodejs原始碼中,可以得到什麼。

首先我們要深刻理解到nodejs是什麼?大家都知道nodejs是乙個js的執行時。那麼到底nodejs裡面有什麼呢?每一部分的意義是什麼呢?首先nodejs的組成是libuv、v8、第三方庫。nodejs的定位首先是乙個伺服器,所以其實有libuv就可以了。那麼剩餘的組成部分有什麼用?第三方庫的作用很明顯,就是復用了業界已有的解決方案去拓展了nodejs的一些功能,並不是nodejs的核心。v8的意義是因為nodejs選用了js這個語言,所以就需要乙個js的引擎。否則v8也是不需要的,直接把libuv和第三方庫編譯成二進位制就行,類似nginx,redis一樣。這個是高層的檢視。從底層來看,libuv是對作業系統功能的封裝,v8是乙個js引擎。那麼看nodejs原始碼的意義就很明顯了。nodejs的原始碼從垂直分為以下三個部分

1 js層

2 c++層(使用v8橋接js和libuv和一些自定義的c++邏輯)

3 c層

讀js層,你可以了解到nodejs實現的一些上層的邏輯,雖然js層最後還是依賴底層,但是js層也有很多邏輯,看懂了js層,在使用nodejs的時候,也就能更加深刻地了解到你在做什麼,nodejs在做什麼。但是js層是遠遠不夠的。因為他只是個殼子。

最後就是讀libuv,nodejs的重點是作為伺服器,所以相對來說,讀libuv的才是重點,我們都知道v8只是乙個js引擎,他沒有網路,dns、檔案等能力。在前端,js的檔案,網路等能力**於宿主瀏覽器。在nodejs,這些能力就**於libuv。這是nodejs為什麼叫nodejs,而不叫v8。因為他不只是v8。他還實現了自己的一些功能。所以你也可以實現自己的功能,加上v8的能力,創造出乙個新的伺服器。言歸正傳,那麼讀libuv可以學到什麼東西呢?libuv是實現伺服器的核心。所以我們可以從libuv中學習到實現乙個伺服器用到的技術。從libuv官網中我們也可以知道,libuv包括了程序、執行緒、定時器、檔案、tcp、udp、unix域、執行緒池、dns等等能力,使用到作業系統能力包括程序間通訊(管道、unix域、eventfd)、執行緒池、事件驅動(epoll、select、poll、kqueue等)、inotify機制、檔案操作等等,使用資料結構和演算法有二叉堆、紅黑樹、佇列等。

從理論上聊了一下閱讀nodejs原始碼的一些看法,下面順便聊一下我自己的看法和體會。我閱讀nodejs原始碼的原因是非常直接的,因為我希望我成為乙個優秀的nodejs工程師。我對v8和libuv本身並沒有太大興趣。雖然我一直是乙個前端工程師,但是我也不會去讀js引擎的原始碼。至於libuv,相關的非同步io庫非常多,而且說到伺服器的設計,nginx、redis無疑是更值得讀的。但是成為乙個優秀的nodejs工程師,深入了解和深刻理解nodejs本身是非常必要的。相對來說,nodejs是非常原生的。很多時候我們覺得讀nodejs原始碼沒有意義是因為沒有深度或廣度地去使用nodejs,可能只是停留到框架層面,複製著業務的最佳實踐,成功地避開了一些坑。當你遇到一些難題,卻又難以解決,甚至業界也沒有解決方案的時候,你就會深刻理解到閱讀原始碼的意義。當然,這種時候可能不會很多(比如和等)。

從開始讀nodejs原始碼到現在,我覺得這是一段非常艱難、快樂、深刻的經歷。他讓我不僅更了解和理解nodejs,也在更高層面地提高了我。雖然我一直在推廣閱讀nodejs原始碼、寫了很多文章、也和其他同學進行了很多交流。但是並不說明非讀原始碼不可,個人覺得,讀原始碼是一種好的習慣,也是讓你變得優秀的方式,但是因為讀哪些原始碼,這個完全取決於個人的興趣和選擇。不要盲目地去讀,要帶有目的。對個人而言,我是非常感謝nodejs,也非常敬佩nodejs作者和貢獻者,但是我覺得我在閱讀nodejs原始碼中,更多的是了解了nodejs的原理,並沒有學到太多我想學的東西,v8算一方面,而libuv的內容,我覺得看nginx和作業系統核心可能是更好的選擇,但是libuv相比來說可能更輕量,更快了解乙個非同步框架的設計。

這裡順便提一下nodejs原始碼分享的事情,有些同學希望我講得通俗一點,或者結合應用來講。這裡說一下我做分享的一些想法。首先,我是乙個在nodejs原始碼中學習的人,而不是站在nodejs之上的人,這意味著我也在慢慢學習,並且因為時間關係,我沒有辦法像**系列,碼農翻身一樣講得那麼好那麼易懂。因為我的初衷其實是做個筆記,然後分享給有興趣的人,然後大家一起來做這個事情。我不是大家的老師,這也不是我的初衷和目的。我幾乎都是免費分享內容、免費答疑。但是卻很少碰到真正的志同道合者,大家還希望我講得通俗易懂這對我來說就未免太難了。我承認如何講好技術,做乙個好的分享是乙個值得學習的事情,但是我覺得這不是我現階段的目的。而且我覺得乙個有上進心的程式設計師,自己多動一下手和大腦,這個要求並不過分。一人之力有限,希望大家明白。

最後,祝大家新年快樂!對nodejs感興趣的同學也可以找我一起交流學習!

附上之前原始碼分析的一些文章理解nodejs原理,上半年也在努力出版原始碼分析的書籍。

vue心得之 原始碼解析v for為什麼要加key

為了標識該節點是該節點,優化patch演算法,在某些情況下可以減少dom操作 具體使用場景即作用參考下原始碼 vue2 由以上 可以理解網上的這兩張圖了 對arrdata a,b,c,d,e 更新成arrdata a,b,f,c,d,e 在 v for迴圈遍歷後新增了key能標識原本的a,b,c,d...

為什麼要看原始碼?方法?

1 提公升技術功底 學習原始碼裡的優秀設計思想,比如一些疑難問題的解決思路,還有一些優秀的設計模式,整體提公升自己的技術功底 2 深度掌握技術框架 原始碼看多了,對於乙個新技術或框架的掌握速度會有大幅提公升,看下框架demo大致就能知道底層的實現,技術框 架更新再快也不怕 3 快速定位線上問題 遇到...

讀HashSet原始碼

先看建構函式 public hashset public hashset int initialcapacity public hashset int initialcapacity,float loadfactor 這個構造方法不是public的,僅用於linkedhashset.hashset ...