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