自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

為什么要讀Nodejs源碼?

開發(fā) 前端
前幾天有個同學和我說,他在看nodejs源碼,但是不知道為什么需要看,也不知道從中可以學到什么。所以今天想聊一下關于閱讀nodejs源碼的意義。閱讀其他源碼也類似。

[[381665]]

本文轉載自微信公眾號「編程雜技」,作者theanarkh。轉載本文請聯(lián)系編程雜技公眾號。   

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

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

  • 1 深入了解和理解他或一些底層的原理
  • 2 從中學到一些優(yōu)秀的設計思想和實踐。

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

首先我們要深刻理解到nodejs是什么?大家都知道nodejs是一個js的運行時。那么到底nodejs里面有什么呢?每一部分的意義是什么呢?首先nodejs的組成是libuv、v8、第三方庫。nodejs的定位首先是一個服務器,所以其實有l(wèi)ibuv就可以了。那么剩余的組成部分有什么用?第三方庫的作用很明顯,就是復用了業(yè)界已有的解決方案去拓展了nodejs的一些功能,并不是nodejs的核心。v8的意義是因為nodejs選用了js這個語言,所以就需要一個js的引擎。否則v8也是不需要的,直接把libuv和第三方庫編譯成二進制就行,類似nginx,redis一樣。這個是高層的視圖。從底層來看,libuv是對操作系統(tǒng)功能的封裝,v8是一個js解釋器。那么看nodejs源碼的意義就很明顯了。nodejs的源碼從垂直分為以下三個部分

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

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

那么接下來,你就要去讀c++層,讀c++層的代碼,更多的是在了解如何去使用v8。假設你以后想在你的其他項目中單獨使用v8,那么nodejs的代碼就是一個參考。那么我們了解v8的使用有什么意義呢?這個問題相當于我們使用一個語言,然后了解他的編譯器/解釋器有什么意義。很多時候,我們都不需要這樣做,這完全取決于你的興趣。如果你以后想使用v8,或者你想了解js實現(xiàn)的底層原理,又或者你想了解一個編譯器/解釋器是如何實現(xiàn)的。那么你就可以去學習v8。v8首先作為一個js引擎,他里面有一個編譯器/解釋器的通用邏輯,詞法解析,語法解析,代碼生成,代碼優(yōu)化等等。然后還包含了js語言本身的實現(xiàn)細節(jié),比如一個js數(shù)組,一個js對象,在v8里是怎么實現(xiàn)的。最后,了解v8為我們暴露了什么接口,我們可以使用v8做什么。

最后就是讀libuv,nodejs的重點是作為服務器,所以相對來說,讀libuv的才是重點,我們都知道v8只是一個js引擎,他沒有網(wǎng)絡,dns、文件等能力。在前端,js的文件,網(wǎng)絡等能力來源于宿主瀏覽器。在nodejs,這些能力就來源于libuv。這是nodejs為什么叫nodejs,而不叫v8。因為他不只是v8。他還實現(xiàn)了自己的一些功能。所以你也可以實現(xiàn)自己的功能,加上v8的能力,創(chuàng)造出一個新的服務器。言歸正傳,那么讀libuv可以學到什么東西呢?libuv是實現(xiàn)服務器的核心。所以我們可以從libuv中學習到實現(xiàn)一個服務器用到的技術。從libuv官網(wǎng)中我們也可以知道,libuv包括了進程、線程、定時器、文件、tcp、udp、unix域、線程池、dns等等能力,使用到操作系統(tǒng)能力包括進程間通信(管道、unix域、eventfd)、線程池、事件驅動(epoll、select、poll、kqueue等)、inotify機制、文件操作等等,使用數(shù)據(jù)結構和算法有二叉堆、紅黑樹、隊列等。

總的來說,閱讀nodejs源碼最直接的是理解nodejs的工作原理和nodejs的本質(zhì)。如果你是一個nodejs的開發(fā)者,這無疑是一個很好的收獲。其次,如果你有興趣,你還可以了解到編譯器,操作系統(tǒng)的知識。額外地,你也可以學習到nodejs中的一些設計思想,比如定時器的設計,從早期版本到后來的重構背景。又或者如果你來設計一個服務器,你怎么設計。

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

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

這里順便提一下nodejs源碼分享的事情,有些同學希望我講得通俗一點,或者結合應用來講。這里說一下我做分享的一些想法。首先,我是一個在nodejs源碼中學習的人,而不是站在nodejs之上的人,這意味著我也在慢慢學習,并且因為時間關系,我沒有辦法像圖解系列,碼農(nóng)翻身一樣講得那么好那么易懂。因為我的初衷其實是做個筆記,然后分享給有興趣的人,然后大家一起來做這個事情。我不是大家的老師,這也不是我的初衷和目的。我?guī)缀醵际敲赓M分享內(nèi)容、免費答疑。但是卻很少碰到真正的志同道合者,大家還希望我講得通俗易懂這對我來說就未免太難了。我承認如何講好技術,做一個好的分享是一個值得學習的事情,但是我覺得這不是我現(xiàn)階段的目的。而且我覺得一個有上進心的程序員,自己多動一下手和大腦,這個要求并不過分。一人之力有限,希望大家明白。

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

責任編輯:武曉燕 來源: 編程雜技
相關推薦

2017-04-05 16:40:45

2015-08-06 10:14:15

造輪子facebook

2022-08-15 08:27:02

基站網(wǎng)絡

2013-03-12 14:30:09

Ubuntu操作系統(tǒng)

2017-09-08 08:35:16

Android代碼API設計

2024-10-17 16:41:57

KafkaZooKeeper

2019-01-14 07:28:56

大數(shù)據(jù)云計算互聯(lián)網(wǎng)

2014-08-25 10:00:18

開源

2015-05-12 11:04:42

Java EE學習Java EE

2019-03-19 08:59:13

物聯(lián)網(wǎng)IOT技術

2019-11-27 10:25:15

SaaS云端IT架構

2019-09-30 07:50:51

ITOps云端ITOM

2018-05-23 00:20:29

2021-03-16 08:35:14

Kubernetes Docker容器

2016-08-19 16:27:52

數(shù)據(jù)庫Mongo DB開發(fā)

2012-06-18 14:51:09

Python

2009-12-17 15:18:47

2022-03-30 08:21:57

合并HTTP

2019-12-26 14:52:31

微軟CortanaAndroid

2017-04-05 18:10:05

R語言開發(fā)Ross
點贊
收藏

51CTO技術棧公眾號