nodejs引入模塊用require:
var express = require('express')
exports對象用於導出當前模塊的方法和變量,一個文件就是一個模塊,將方法掛載在exports對象上做爲屬性定義導出的方式,例如: node
//test.js
exports.test1 = function(){
return 'ok';
}
在另外一個文件中,咱們經過require()方法引入模塊後,就能調用它的方法和屬性了: c++
//test2.js
var test = require('test');
exports.tt = function(){
return test.test1();
}
node中引入模塊須要經歷三個步驟: express
- 路徑分析。
- 文件定位
- 編譯執行
路徑分析:
require()方法接受一個標識符做爲參數,模塊標識符分爲: json
- 核心模塊,如http,fs,path等,加載優先級僅次於緩存
- . 或者..開始的相對路徑文件模塊
- /開始的絕對路徑文件模塊,上述兩種文件模塊require()方法會將路徑轉爲真實路徑,並以真實路徑做爲索引,將編譯執行後的結果緩存。因爲指定了明確的路徑,因此查找能夠節約大量時間,加載速度慢於核心模塊。
- 非路徑形式的文件模塊,特殊的文件模塊,能夠是一個文件或者包的形式,最慢最費時。根據node的模塊路徑生成規則,在加載過程當中會:
1(找當前文件目錄下的node_modules目錄),
2(父目錄下的node_modules目錄),
3(父目錄的父目錄的node_modules),
4(沿路徑逐級向上逐級遞歸直到跟目錄的node_modules)
文件定位: 緩存
- require()在分析標識符的過程當中,標識符不包含文件擴展名的狀況下,node會按.js,.node,.json的次序補足擴展名,依次嘗試(調用fs模塊同步阻塞式判斷文件是否存在),因此若是是.node .json文件最好加上擴展名。
- 若是沒有查找到文件卻獲得一個目錄會將目錄看成一個包來處理。
模塊編譯: ui
- js文件經過fs模塊同步讀取文件後編譯執行
- node文件,經過,c/c++編寫的擴展文件(編寫c/c++模塊以後編譯生成的,因此這裏只有加載和執行),經過dlopen()方法加載最後編譯生成的文件
- json文件,經過fs模塊同步讀取,用JSON.parse()解析返回結果
- 其他擴展名都被看成.js文件載入
node中模塊分爲核心模塊和本身編寫的模塊(文件模塊),核心模塊是在node源代碼編譯過程當中編譯進了二進制執行文件,進程啓動的時候部分核心模塊就直接加載到了內存,省略了2 (文件定位)和3(編譯執行),而且在1(路徑分析)的時候優先判斷,加載速度是最快的,文件模塊在運行的時候動態加載,須要123步驟,加載速度比核心模塊慢。node對引入過的模塊都會進行緩存,緩存的是編譯和執行後的對象。require()方法優先緩存加載,核心模塊的緩存檢查優先於文件模塊的檢查。 spa