地址
說明
這里的全部對象,是指在任意地方都可以直接使用,無需require(module)。這里的對象,主要是定時方法,以及nodejs進(jìn)行模塊化時封裝的一些參數(shù),可直接使用。雖然稱之為全局對象,但很多都是本地對象來的。比如,__dirname, __filename, module, exports等等,都是本地的對象,只是看起來像是一個全局的。我們可以暫且稱之為本地全局對象。
module isn't actually a global but rather local to each module.
定時方法
- setImmediate(callback[, ...args])
- setInterval(callback, delay[, ...args])
- setTimeout(callback, delay[, ...args])
暫時還不是很懂。感覺這三個方法有毒,不能捉摸它們的執(zhí)行順序??赡苁俏疫€太年輕,沒有完全理清楚事件循環(huán)。反正目前來說,它們就是一個定時器的存在。這些方法會返回一個句柄,供調(diào)用方使用(清理)
清理定時器的方法
- clearImmediate(immediateObject)
- clearInterval(intervalObject)
- clearTimeout(timeoutObject)
依次對應(yīng)上面這些定時器
每個js文件里面必有的對象
(function (exports, require, module, __filename, __dirname) {
// 模塊源碼
})();
大概是這樣的一種形式,nodejs會封裝起來形成模塊,所以上面說的,這些其實算是本地變量了,畢竟,每個這樣的對象,在不同的文件中,都是不一樣的。
- __dirname: 當(dāng)前文件所在的目錄
- __filename: 當(dāng)前完整文件名,包括具體的目錄,如 /var/www/app.js
- module: 當(dāng)前模塊的引用。module.exports聲明對外可見的對象或方法,表示被require的值。詳細(xì)見于
module模塊(此模塊大有來頭,這里沒有辦法一下子說明白。下次補(bǔ)充)
exports:module.exports的引用
require
- require.cache 加載的模塊會在這里緩存著。
console.log(require.cache);
// output:
{ '/koala/hello-world/test.js':
Module {
id: '.',
exports: {},
parent: null,
filename: '/koala/hello-world/test.js',
loaded: false,
children: [],
paths:
[ '/koala/hello-world/node_modules',
'/koala/node_modules',
'/node_modules' ] } }
由此可見,require.cache是一個object,key 是模塊所在的文件地址,value是該模塊的詳細(xì)信息,也就是module.exports的哪一塊信息,除此之外,還有children,parent等信息。
require.extensions 貌似已經(jīng)被棄用了,不想寫太多。
require.resolve 返回該模塊的地址(文件名)。
console.log(require.resolve('./test'));
// output: /koala/hello-world/test.js
需要注意的地方
- require.cache 這雖然是一個存儲模塊緩存的地方,當(dāng)時,只是一個引用而已。所以,假如清理所有的緩存,不能簡單粗暴地設(shè)置
require.cache = {}, 因為這樣只是改了引用,而實際的緩存并沒有清走。這類似于C語言的指針。所以,想要清除緩存,必須一個一個地清理。
Object.keys(require.cache, (item) => {
delete require.cache[item];
})
這樣才能清除。
類似這樣的,還有module.exports和exports的關(guān)系。真正對外開發(fā)的是前者,后者只是對前者的一個引用而已。
child.js
module.exports = {
func: () => {
console.log('func')
}
};
exports = {};
parent.js
var child = require('./child');
child.func();
// output : func
跟上面是同一個意思的。需要留意的是,你所使用的變量,究竟是一個別名(引用),還是一個真實存儲數(shù)據(jù)的地方(這里說得有點亂,有點不對,但是能理解就好)
小結(jié)
內(nèi)容有點空洞,沒啥好說的哇