
文章目錄1. 核心概念global 與 globalThis2. 最重要的區(qū)別模塊作用域3. 真正的全局對(duì)象 / 變量4. 看起來(lái)像全局其實(shí)不是的變量5. 最常用的全局對(duì)象process6. 如何正確使用全局變量建議7. 總結(jié)在瀏覽器中全局對(duì)象是window在 Node.js 中對(duì)應(yīng)的是global。但 Node.js 的全局變量體系和瀏覽器有很大區(qū)別尤其是在模塊作用域方面。1. 核心概念global與globalThis名稱說(shuō)明推薦程度globalNode.js 特有的全局對(duì)象舊寫(xiě)法不推薦新代碼使用globalThisES2020 標(biāo)準(zhǔn)跨環(huán)境統(tǒng)一訪問(wèn)全局對(duì)象推薦使用// 兩者在 Node.js 中指向同一個(gè)對(duì)象console.log(globalglobalThis);// true2. 最重要的區(qū)別模塊作用域在瀏覽器中vara1;// 自動(dòng)變成 window.a在 Node.js 中vara1;// 只是當(dāng)前模塊的局部變量不會(huì)變成 global.aconsole.log(global.a);// undefined原因Node.js 每個(gè)文件都被包裝成一個(gè)模塊函數(shù)類(lèi)似這樣(function(exports,require,module,__filename,__dirname){// 你的代碼寫(xiě)在這里vara1;// 只在這個(gè)函數(shù)作用域內(nèi)});所以想讓變量真正變成全局必須顯式掛載global.myVar我是全局變量;// 或者globalThis.myVar我是全局變量;其他文件中就可以直接訪問(wèn)console.log(global.myVar);// 我是全局變量3. 真正的全局對(duì)象 / 變量以下這些是真正全局可用的不需要 require名稱說(shuō)明global/globalThis全局對(duì)象本身console控制臺(tái)輸出process當(dāng)前進(jìn)程信息非常常用Buffer處理二進(jìn)制數(shù)據(jù)setTimeout/setInterval定時(shí)器setImmediate/clearImmediateNode.js 特有的立即執(zhí)行定時(shí)器queueMicrotask微任務(wù)隊(duì)列URL/URLSearchParamsURL 處理TextEncoder/TextDecoder文本編碼performance性能相關(guān)fetch較新版本網(wǎng)絡(luò)請(qǐng)求4. 看起來(lái)像全局其實(shí)不是的變量這些變量只在當(dāng)前模塊內(nèi)可用并不是真正的全局變量說(shuō)明__dirname當(dāng)前文件所在目錄的絕對(duì)路徑__filename當(dāng)前文件的絕對(duì)路徑module當(dāng)前模塊對(duì)象exportsmodule.exports的快捷方式require引入其他模塊的函數(shù)console.log(__dirname);// 當(dāng)前目錄路徑console.log(__filename);// 當(dāng)前文件完整路徑5. 最常用的全局對(duì)象processprocess是 Node.js 中最重要的全局對(duì)象之一// 環(huán)境變量console.log(process.env.NODE_ENV);console.log(process.env.PATH);// 命令行參數(shù)console.log(process.argv);// 當(dāng)前工作目錄console.log(process.cwd());// 退出程序process.exit(0);// 監(jiān)聽(tīng)退出事件process.on(exit,(code){console.log(進(jìn)程即將退出退出碼,code);});6. 如何正確使用全局變量建議不推薦隨便掛全局變量// 不推薦global.config{port:3000};推薦做法使用模塊導(dǎo)出最推薦// config.jsmodule.exports{port:3000,dbUrl:mongodb://localhost/test};// 其他文件constconfigrequire(./config);使用環(huán)境變量適合配置、密鑰// 通過(guò) .env 或系統(tǒng)環(huán)境變量設(shè)置console.log(process.env.DB_PASSWORD);必須用全局時(shí)統(tǒng)一掛到一個(gè)命名空間下globalThis.App{config:{...},utils:{...}};7. 總結(jié)對(duì)比項(xiàng)瀏覽器Node.js全局對(duì)象windowglobal/globalThisvar聲明自動(dòng)變成全局不會(huì)變成全局模塊作用域無(wú)原生模塊每個(gè)文件都是獨(dú)立模塊推薦訪問(wèn)方式window/globalThisglobalThis核心記憶點(diǎn)Node.js 中默認(rèn)沒(méi)有“隨便寫(xiě)就變成全局”的行為真正全局的東西要用global/globalThis顯式掛載絕大多數(shù)情況下優(yōu)先用模塊導(dǎo)出 require/import而不是依賴全局變量 感謝閱讀想了解更多 我的博客網(wǎng)站 | 記錄思考分享干貨 我的個(gè)人主頁(yè) | 關(guān)于我、開(kāi)源項(xiàng)目