談到node.js 就得說到模組,今天就得來說說node.js的模組緩衝載入機制。
廢話不多說我們直接上代碼。
我首先自訂了一個模組
nodeJSTest/test13_module.js
var Student = function(){ this.index; this.say = function(){ console.log("my index is "+this.index); }; this.change = function(index){ this.index = index; }};var student = new Student();module.exports = student;
下面看一下我的主模組(require.main)
nodeJSTest/test13.js
var m1 = require("./test13_module");var m2 = require("./test13_module");//改變index的valuem1.change(2);m1.say();m2.say();
output:
my index is 2my index is 2
從這裡可以看出兩個變數都載入了同一個模組,m1改變了index的值,同時m2也跟著改變了。
這是因為模組的緩衝機制存在,m1載入模組的同時,解譯器將這個載入的模組放入緩衝區,如果下次還要載入的話,就不用根據目錄來載入,而是直接從緩衝區裡面拿,這樣可以提高效率。
所以這裡,m1,m2實際上指向的是同一個模組對象。
那下面我們再來看一段代碼。
var m1 = require("./test13_module");delete require.cache[require.resolve("./test13_module")];var m2 = require("./test13_module");//改變index的valuem1.change(2);m1.say();m2.say();
output:
my index is 2my index is undefined
這下的m2列印的index卻是undefined,這是因為我們添加了一行
delete require.cache[require.resolve("./test13_module")];
下面我給大家解讀一下這段代碼,大家應該就會明白了
delete關鍵字用來刪除緩衝區裡的對象,require.resolve可以用遞迴擷取到傳入模組的絕對路徑,而require.cache則可以根據路徑來尋找該路徑的模組的對象。
如果直接調用require.cache的話,則是遍曆整個緩衝區。
例如
console.log(require.cache);
output:
{ 'E:\nodeJSTest\test13.js': Module { id: '.', exports: {}, parent: null, filename: 'E:\\nodeJSTest\\test13.js', loaded: false, children: [], paths: [ 'E:\\nodeJSTest\\node_modules' ] } }