柚子快報(bào)激活碼778899分享:【nodejs】“
? 目錄 ?
? 問(wèn)題描述環(huán)境
1?? 原理CommonJS vs ESM錯(cuò)誤原因
2?? 禁用 ESM 模式并改用 CommonJS方案一:項(xiàng)目方案二:?jiǎn)挝募?/p>
3?? 在 ESM 模式下自實(shí)現(xiàn)__dirname? 參考資料
? 問(wèn)題
描述
從網(wǎng)上找了一份代碼,其中包含了__dirname變量的使用,結(jié)果運(yùn)行的時(shí)候報(bào)錯(cuò):__dirname is not defined
環(huán)境
版本號(hào)描述文章日期2023-06-操作系統(tǒng)Ubuntu 20.04.4 LTSCSDN開發(fā)云node -vv16.17.0npm -v (8.15.0)Cloud IDE1.71.0操作系統(tǒng)Win11 - 21H2 - 22000.1335Python3.7.1frida.exe15.0.18
1?? 原理
CommonJS vs ESM
討論__dirname報(bào)錯(cuò),首先要分清楚CommonJS 和 ESM的區(qū)別。 CommonJS 和 ESM(ECMAScript Modules) 都是 JavaScript 模塊系統(tǒng)的規(guī)范,用于組織和管理代碼。它們之間有一些區(qū)別,下面簡(jiǎn)要介紹一下:
特點(diǎn)CommonJSESM加載方式同步加載異步加載導(dǎo)出/引入關(guān)鍵字module.exports 和 require()export 和 import支持環(huán)境Node.js 默認(rèn)支持現(xiàn)代瀏覽器和最新版本的 Node.js 支持應(yīng)用范圍主要用于服務(wù)器端開發(fā),如 Node.js在瀏覽器端和 Node.js 中有廣泛應(yīng)用,是未來(lái)趨勢(shì)
錯(cuò)誤原因
在 CommonJS 模式下,__dirname 是包含當(dāng)前文件目錄的變量。 許多Node.js項(xiàng)目都依賴于此變量。 但不能在 ESM 模式下使用(ESM模式不提供 __dirname 變量)。 您有兩種選擇:
禁用 ESM 模式并改用 CommonJS聚填充__dirname
2?? 禁用 ESM 模式并改用 CommonJS
在 JavaScript 中,通常文件擴(kuò)展名 “.js” 用于表示普通的 JavaScript 文件, 而 “.mjs” 用于表示 ECMAScript 模塊(ESM)文件。這兩種文件擴(kuò)展名的區(qū)別在于它們所代表的 JavaScript 模塊類型。
.js 文件:通常用來(lái)表示普通的 JavaScript 文件,其中可能包含常規(guī)的 JavaScript 代碼,采用 CommonJS 或其他模塊加載方案。.mjs 文件:表示 ECMAScript 模塊,這種文件中的代碼采用了 ECMAScript Modules(ESM)規(guī)范,即使用 “import” 和 “export” 關(guān)鍵字來(lái)定義模塊。
要使用 “.mjs” 文件,您需要確保在 Node.js 中啟用了對(duì) ECMAScript 模塊的支持。您可以通過(guò)以下幾種方式之一實(shí)現(xiàn):
方案一:項(xiàng)目
Node.js 項(xiàng)目中的 package.json 文件是一個(gè)用于描述項(xiàng)目信息、依賴關(guān)系和腳本命令的 JSON 文件。它位于項(xiàng)目根目錄下,是 Node.js 項(xiàng)目的重要配置文件之一。 在 Node.js 項(xiàng)目中的 package.json 文件中,“type” 字段不要設(shè)置為 “module”,以明確告知 Node.js 不使用 ESM 規(guī)范(或者直接刪除)
方案二:?jiǎn)挝募?/p>
對(duì)于單文件運(yùn)行node,即不包含 package.json 文件的情況。node是根據(jù)文件后綴判斷運(yùn)行模式的。 我們確保文件后綴是.js,而不是.mjs即可使用__dirname。
3?? 在 ESM 模式下自實(shí)現(xiàn)__dirname
在 ECMAScript 模塊(ESM)中,與 CommonJS 不同,沒(méi)有像 __dirname 這樣的內(nèi)置變量來(lái)表示當(dāng)前模塊的目錄路徑。不過(guò),您可以通過(guò)一些方法來(lái)模擬實(shí)現(xiàn)類似的功能。
一種常見(jiàn)的方法是使用 import.meta.url 屬性來(lái)獲取當(dāng)前模塊的 URL,然后從中提取出目錄路徑。下面是一個(gè)示例代碼,演示如何在 ESM 模式下自實(shí)現(xiàn)類似 __dirname 的功能:
import path from 'path';
import { fileURLToPath } from 'url';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
在這個(gè)示例中,我們首先導(dǎo)入了 Node.js 中的 fileURLToPath 和 dirname 函數(shù),然后使用 import.meta.url 獲取當(dāng)前模塊的 URL。接著,通過(guò) fileURLToPath 將 URL 轉(zhuǎn)換為文件路徑,并最終通過(guò) dirname 獲取該文件路徑的目錄部分,從而模擬實(shí)現(xiàn)了類似 __dirname 的功能。 請(qǐng)注意,這種方法依賴于 Node.js 提供的 url 和 path 模塊,確保您的項(xiàng)目中已安裝這些模塊。這樣,您就可以在 ESM 模式下獲取當(dāng)前模塊的目錄路徑,類似于 CommonJS 中的 __dirname 變量。
? 參考資料
How To Fix “__dirname is not defined” Error in Node.js https://masteringjs.io/tutorials/node/__dirname-is-not-defined
柚子快報(bào)激活碼778899分享:【nodejs】“
好文鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。