溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行對nodejs源碼研究的分析

發(fā)布時間:2021-12-13 17:45:19 來源:億速云 閱讀:127 作者:柒染 欄目:大數(shù)據(jù)

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)如何進行對nodejs源碼研究的分析,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

回首對nodejs的源碼研究,時間已經(jīng)過去了一年多。我很喜歡js這門語言,有時候感覺他和c語言一樣,在c語言里,很多東西都需要自己實現(xiàn),讓我們可以發(fā)揮無限的創(chuàng)造力和想象力,js雖然很多東西在v8里已經(jīng)提供,但是用js,依然可以創(chuàng)造很多好玩的東西,還有好玩的寫法。js應該我見過唯一的一門沒有實現(xiàn)網(wǎng)絡和文件功能的語言?;蛘哒f沒有向用戶提供這種功能。這也是我對js最大的偏見。因為網(wǎng)絡和文件,是一個很重要的能力。對于程序員來說,也是很核心很基礎的知識。因為js的使用場景是運行在瀏覽器。如果js提供了文件操作的話,這就意味著js可以訪問用戶電腦上面的數(shù)據(jù),這也是不顯示的,所以,js不可能會提供這樣的能力,讓我們可以像其他語言一樣,隨意操作用戶的資源。

很幸運,nodejs被創(chuàng)造出來了。nodejs在js的基礎上,使用v8提供的能力,極大地拓展、豐富了js的能力。尤其是網(wǎng)絡和文件。這樣我就不僅可以使用js,還可以使用網(wǎng)絡、文件等功能。這是我逐漸轉(zhuǎn)向nodejs方向的原因之一。也是我開始研究nodejs源碼的原因之一。因為nodejs滿足了我喜好和技術(shù)上的需求。不過一開始的時候,我并沒有全身心地投入代碼的研究,只是偶爾會看一下某些模塊的實現(xiàn)。真正的開始,是為了做<nodejs是如何利用libuv實現(xiàn)事件循環(huán)和異步>的分享。從那時候起,大部分業(yè)余時間和精力都投入源碼的研究。

我首先從libuv開始研究,因為libuv是nodejs的核心之一。因為曾經(jīng)研究過一些linux的源碼,也一直在學習操作系統(tǒng)的一些原理和實現(xiàn),所以在閱讀libuv的時候,算是沒有遇到太大的困難。c語言函數(shù)的使用和原理,基本都可以看明白。重點在于業(yè)務邏輯上,需要把各個邏輯捋清楚。我使用的方法就是注釋和畫圖。我個人比較喜歡寫注釋。雖然說代碼是最好的注釋,但是我還是愿意花時間用注釋去把代碼的背景和意義闡述一下,因為并不是每個程序員都能做到代碼即注釋這一境界。而且注釋會讓大部分人更快地能讀懂代碼的含義。讀libuv的時候,也穿插地讀了一些js和c++層的代碼。閱讀nodejs源碼的方式是,選擇一個模塊,垂直地從js層分析到c++層,然后到libuv層。

讀完libuv,接下來讀的是js層的代碼,js雖然容易看懂,但是js層的代碼非常多,而且我感覺邏輯上也非常繞,所以至今,我還有很多沒有細讀。這個作為后續(xù)的計劃。nodejs中,c++算是膠水層,很多時候,不會c++,其實也不影響nodejs源碼的閱讀,因為c++很多時候,只是一種透傳的功能,他把js層的請求,通過v8,傳給libuv。然后再反過來。所以c++層我是放到最后才細讀。c++層我覺得是最難的,難的不是看不懂他的代碼邏輯。而是真正明白他的工作原理,這時候,我又不得不開始讀v8的源碼了,v8的源碼可以說,非常難。我選取的幾乎是最早的版本0.1.5。然后結(jié)合8.x版本。通過早期版本,先學習v8的大概原理和一些早期實現(xiàn)上的細節(jié)。因為后續(xù)的版本雖然變化很大,但是也只是功能的增強和優(yōu)化,有很多核心的概念還是沒有變化的,這是我選取早期版本的原因,避免一開始就陷入無窮無盡的代碼中,迷失了方向,失去了動力。哪怕是早期的版本,有很多內(nèi)容依然非常復雜。結(jié)合新版本是因為有些功能在早期版本里沒有實現(xiàn),這時候要明白他的原理,就只能看新版的代碼,有了早期版本的經(jīng)驗,閱讀新版的代碼也有一定的好處。多多少少也知道了一些閱讀技巧。

nodejs的大部分代碼都在c++和js層,所以目前仍然是在不斷地閱讀這兩層的代碼。還是按照模塊垂直分析。閱讀nodejs代碼,讓我更了解nodejs的原理,也更了解js。不過代碼量非常大,需要源源不斷的時間和精力投入。所以我也一直在尋找志同道合的人一起分析,加快對nodejs源碼的研究,不過真正能啃源碼的人不多。源碼的閱讀可能并不一定能幫助你的工作變得更好,很多時候也往往不需要深入到這種程度。不像學一個框架,一門語言一樣,我們立刻就能看到效果,這極大地增強了我們的積極性。就像現(xiàn)在可能很少人學c、c++一樣,使用底層語言,實現(xiàn)一個能用的東西,會變得異常不容易。但是使用一些腳本語言,我們很快就能看到我們想要的東西。最主要的是,使用更難的語言,并不會增加我們的工資。所以,這是一個選擇的問題,不是對錯的問題。做技術(shù),知其然知其所以然的感覺是非常美妙的,你靠著一門技術(shù)謀生,卻對他知之甚少,這種感覺并不好。閱讀源碼,雖然不會為你帶來直接的、迅速的收益,但是有幾個好處是必然的。第一是他會決定你的高度,第二你寫代碼的時候,你看到的不再是一些冰冷冷、無生命的字符。這可能有點夸張,但是你了解了技術(shù)的原理,你在使用技術(shù)的時候,的確會有不同的體驗,你的思維也會有了更多的變化。第三是提高了你的學習能力,當你對底層原理有了更多的了解和理解,你在學習其他技術(shù)的時候,就會更快地學會,比如你了解了epoll的實現(xiàn),那你看nginx、redis、libuv等源碼的時候,關(guān)于事件驅(qū)動的邏輯,基本上就沒有太大的壓力了。

上述就是小編為大家分享的如何進行對nodejs源碼研究的分析了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI