node原始碼詳解(三)

2021-07-31 16:51:39 字數 1819 閱讀 5712

本部落格同步在

本部落格同步在

我們用慣了process.nexttick()、require('***')、module.exports,但是它們**來呢?下文給出答案... 

上篇部落格2.1中提到src目錄存放的是node的c++原始碼部分,包括main函式。

src/node_main.cc 和 src/node.cc(注:.cc是linux下的c++檔案,類似windows下的.cpp)這兩個檔案就是node的入口檔案。

其中node_main.cc裡面僅僅作為乙個入口,呼叫node.cc 檔案中的node::start()。

圖3-1-1

有興趣可以看一下node::start()函式做些什麼(**截圖放上來了),我們關注的只是裡面的startnodeinstance()這一行。

圖3-1-2

start() -> startnodeinstance() -> loadenviroment() -> executestring()

這四個函式都在node.cc檔案裡面,看到loadenviroment() 幾行關鍵**:

圖3-1-3

最終在loadenvrioment()裡面載入node.js檔案,呼叫executestring()。

並且在executestring()呼叫v8的 script::compile() 和 script::run()兩個介面去解析執行js**。

上篇部落格2.1 講到node的lib資料夾存放原生js模組,而src資料夾裡面全部是.cc檔案(node c++原始碼) ,但src下面有乙個node.js檔案。這個檔案的作用是什麼呢?

先來看node.js檔案的結構:

圖 3-2-1

看到3.1.2 中,在loadenvironment()裡面呼叫executestring() 解析執行node.js檔案,返回值是乙個f_value。

而這個f_value通過v8的介面 local::cast轉換成乙個local型別的變數f ,而local型別是v8中表示乙個js 函式的c++型別。

在loadenvironment()的最後一行通過 f->call(),去執行node.js返回來的乙個函式。

而從node.js檔案中也可以看出確實返回的是乙個匿名函式。

上面說到f->call()的時候,是在v8裡面解析執行了node.js返回來的匿名函式,來看一下該函式(圖3-2-1)。

步驟1.  匿名函式的第乙個步驟是給startup()函式掛載一堆初始化函式,比如processnext()。

步驟2.  startup的相關初始化函式都掛載完之後,匿名函式執行最後一步,呼叫startup()。

步驟3.  看到startup()函式的定義,裡面開始去執行這一堆掛載函式。processnext()裡面所做的就是給process.nexttick賦值。就是我們平時用的process.nexttick了。

注:匿名函式的引數process是c++模組傳進來的物件(也就是f->call()傳進來的引數)。

步驟4.  startup()函式在執行完匿名函式掛載的一堆初始化函式之後,繼而執行module.runmain()。

Node框架Express原始碼

主檔案 function url.parse req.url,true let requestmethod req.method.tolowercase let i 0 function next err let layer 取出來的路徑 可能是正則型別 if err else else else ...

mac下編譯node原始碼

下面學習一下在mac下面如何編譯node原始碼。過程也挺簡單。mkdir nodesrc cd nodesrc 建立nodesrc目錄,並定位到該目錄下 2 了解一下node原始碼目錄。說說幾個目錄的作用 想要研究分析原始碼的話,主要關心lib和src這兩個目錄的 就行 這篇文章不講原始碼分析。3 ...

udhcp原始碼詳解(三) 下

udhcp原始碼詳解 三 下 之配置資訊的讀取 author hui 632254504 qq.com from created 2010 10 3 上節講解了read config函式,讀取配置資訊到server config的相應成員變數裡,但read config函式只負責把配置資訊重檔案裡讀...