模塊

 

common.js模塊

     module:表明模塊自身node

     exports:是module的屬性,用於導出當前模塊的方法和屬性c++

     require:用於接收一個模塊標識引入一個模塊npm

nodejs中模塊實現

 node引入模塊步驟

1)路徑分析json

2)文件定位api

3)編譯執行數組

node模塊分類

1)核心模塊:Node提供的模塊,在node源代碼編譯過程當中,編譯成了二進制文件,在Node進程啓動時,部分模塊被存在了內存中,因此在引入的時候文件定位和編譯執行兩個步驟會被省略,並且路徑分析也是優先分析,因此這類模塊是加載最快的瀏覽器

2)文件模塊:用戶編寫的模塊,它是動態加載,路徑分析,文件定位,編譯執行缺一不可,因此沒有核心模塊加載的快緩存

緩存

和瀏覽器緩存類似,node也會對引入過的文件進行緩存,可是緩存的是require模塊編譯和執行過的文件,不管是核心模塊仍是文件模塊都會優先從緩存中讀取文件,核心模塊的緩存檢查優先於文件模塊函數

路徑分析

1)核心模塊:如fs,http這類模塊加載的速度僅次於緩存加載性能

2)路徑形式文件模塊,好比以 ./   /  ../開頭的模塊標識符,在分析路徑形式的文件模塊時,先將其轉換爲真實路徑,並以此路徑做爲索引將編譯執行後的結果存放在內存中,以使第二次的加載時間更快。因爲指定了模塊的具體文件路徑,節省了大量時間,其加載速度慢於核心模塊

3)自定義模塊:既非核心模塊又非路徑形式的文件模塊。這類模塊查找起來最費時間,(1)當前文件的node_modules (2)父文件夾的node_modules (3)。。。 (4)根目錄的node_modules   文件夾路徑越深,查找的時間越長,直到找到文件爲止

文件定位

1)文件擴展名分析:標識符中不包含文件擴展名,則經過.js .json .node來依次進行匹配。在嘗試的過程當中,會經過同步阻塞的方式來判斷文件是否存在,會形成性能問題。若是擴展名爲.json或.node加上後綴名會提升效率

2)目錄分析和包:若文件擴展名分析過程當中未分析到文件而分析到了文件夾,則會將這個文件夾當作包來處理

    (1)查找目錄packge.json,經過JSON.parse從中取出main屬性指定的文件名進行定位,若文件名沒有文件擴展名則進入文件名分析階段

    (2)若是main屬性指定的文件名錯誤或package.json文件不存在,Node會將index做爲文件名,分別尋找.js .json .node文件

    (3)若沒有定位到文件,則進入下一個模塊路徑進行尋找,若全部的模塊路徑數組遍歷完都未尋找到,則拋出異常

模塊編譯

在Node中,每一個文件模塊都是一個變量,變量定義以下

function Module(id, parent) {
	this.id = id;
	this.exports = {};
	this.parent = parent
	if(parent && parent.children) {
		parent.children.push(this)
	}
	this.filename = null
	this.loaded = false
	this.children = []
}

在前兩步定位到文件以後,會爲該文件建立一個模塊對象,根據定位到的路徑載入文件,載入方式

       .js 經過fs模塊同步讀取文件後編譯文件

       .node這是用c/c++編寫的擴展文件,能夠經過dlopen方法載入編譯後的文件

       .json 經過fs模塊同步解析文件後,經過JSON.parse解析返回結果

       其他擴展名,都會被看成.js引入

      對js的編譯,一個正常的js文件,會被以下函數包括,而後runInThisContext(相似於eval),返回一個函數,而後經過將當前模塊的exports,require,當前模塊自身,當前文件名稱,當前文件目錄傳入函數進行執行,而後將exports對象返回給調用者

(function(exports, require, module, __filename, __dirname) {})

 

包與npm

common包規範:包結構,包描述

包結構: 

package.json

lib

bin

test

doc

包描述:package.json

相關文章
相關標籤/搜索