Nodejs模組載入運行原理,nodejs模組載入

來源:互聯網
上載者:User

Nodejs模組載入運行原理,nodejs模組載入
前言

使用Nodejs,就不可避免地引用第三方模組,它們有些是Nodejs內建的(例:http,net...),有些是發布在npm上的(例:mssql,elasticsearch...)

本篇章聚焦3個問題:

  1. Nodejs模組的載入過程。
  2. 應用啟動的過程。
  3. 應用如何載入相依模組。

1.模組的載入過程

Nodejs 模組大概可分為4種:

a) builtin module Nodejs中以C++形式提供的模組。

b) constant module Nodejs中定義常量的模組。

c) native module Nodejs中以javascript形式提供的模組。

d) 第三方module 由第三方提供的模組。

我們先看builtin module 和 native module的產生過程。

native JS module的產生相對複雜一些,編譯後,會在/out/release/obj/gen目錄下產生一個node_natives.h。

該檔案是由js2c.py產生,它會把Nodejs源碼中的lib目錄下,所有js檔案轉成ASCII碼,並存放在相應的數組裡。

builtin C++ module 產生過程相對簡單,每個builtin C++的模組入口,都會通過宏NODE_MODULE_CONTEXT_AWARE_BUILTIN擴充成一個func,例如對tcp_wrap模組而言,會擴充成static void register_tcp_wrap() attribute(constructor) 函數。

熟悉GCC的朋友都知道,attribute(constructor)修飾的函數會在Nodejs的main()函數之前被執行,也就是說,builtin C++ module 會在main()函數之前被載入到modlist_builtin列表,而modlist_builtin是一個struct node_module類型的指標,get_builtin_module()會遍曆尋找我們所需的模組。

其實無論是naive JS module 還是 builtin C++ module,最終都是要被編譯成可執行檔。對於兩者的提取方式,卻大不相同,js module 使用process.binding('natives'),而C++ module 則直接使用get_builtin_module()。

在node.cc裡面提供了一個binding()函數,當我們應用require()來引用另外一個模組時,binding()函數便會被引入。下面我們分析一下這個函數:

可以目測到,函數主要為三個模組服務:builtin,constants和native。

builtin優先順序最高,會到modlist_builtin中尋找,過程非常簡單,遍曆整個列表,尋找相同名字的模組即可。找到後,模組的註冊函數會被先執行,然後將資料exports返回。

constants模組優先順序次之,Nodejs中的常量定義通過constants匯出。

native 優先順序最低。

2.應用啟動的過程

為一個流程圖,它描述了test.js做為參數啟動開始,最終被執行。整個過程可以分為4步:

1.可執行檔 node : node入口,在啟動過程中主要扮演環境準備工作

2.src/node.js:啟動指令碼

3.Native Module:為module.js 的執行做準備工作

4.module.js:native module,用來載入,編譯,執行應用程式

應用如何載入相依模組

前面提到NativeModule.require()只負責協助引用natives module,這對於lib/module.js而言已經足夠了。

但是很明顯,一般應用不但需要引用matives module,還要引用第三方模組,讓我們看一下module.js中的Module.prototype._require()函數中。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.