您好,登錄后才能下訂單哦!
本篇內容介紹了“nodejs中的__dirname和__filename變量怎么使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
寫這篇文章的背景在于今天遇到一個神奇的報錯,一起來看下
// index.js console.log(__filename); // 執行 node index.js // ReferenceError: __filename is not defined in ES module scope
在node環境訪問全局變量__filename居然報錯,什么原因呢??于是開始了一路的探索,最終找到問題的根源。
我們知道早期node.js的模塊標準采用commonjs模塊規范,然而在nodejs版本v13.2.0中,開始支持ES Modules模塊規范,我們可以有以下幾種方式在node中使用ES Modules模塊
將文件后綴命名為.mjs
package.json 新增 "type": "module"字段
當我們在node中使用ES Modules貴方,以下全局對象和變量將不可用
require
module.exports
exports
__filename
__dirname
NODE_PATH
這個問題,主要歸結于commonjs模塊下nodejs的運行機制,很多人可能認為__filename就是node環境中的全局變量,當出現這個問題的時候,我們才意識到,這兩個不是Node中真正的全局變量。
看一段簡單的js代碼
(function(){ console.log(arguments) // [1,2,3] })(1,2,3)
arguments在函數內部可以拿到調用函數時傳入的參數。
我們在node commonjs模塊中執行以下代碼
// index.js console.log(arguments); [Arguments] { '0': {}, '1': [Function: require] { resolve: [Function: resolve] { paths: [Function: paths] }, main: Module { id: '.', path: 'E:\\nodeProjectStorehouse\\nodeStudyFromBook', exports: {}, filename: 'E:\\nodeProjectStorehouse\\nodeStudyFromBook\\cc.cjs', loaded: false, children: [], paths: [Array] }, extensions: [Object: null prototype] { '.js': [Function (anonymous)], '.json': [Function (anonymous)], '.node': [Function (anonymous)] }, cache: [Object: null prototype] { 'E:\\nodeProjectStorehouse\\nodeStudyFromBook\\cc.cjs': [Module] } }, '2': Module { id: '.', path: 'E:\\nodeProjectStorehouse\\nodeStudyFromBook', exports: {}, filename: 'E:\\nodeProjectStorehouse\\nodeStudyFromBook\\cc.cjs', loaded: false, children: [], paths: [ 'E:\\nodeProjectStorehouse\\nodeStudyFromBook\\node_modules', 'E:\\nodeProjectStorehouse\\node_modules', 'E:\\node_modules' ] }, '3': 'E:\\nodeProjectStorehouse\\nodeStudyFromBook\\cc.cjs', '4': 'E:\\nodeProjectStorehouse\\nodeStudyFromBook'
我們可以看到,arguments有5個參數,這5個參數就是exports, require, module, __filename, __dirname
到這里我們就清楚的知道,__filename不是全局變量,而是外層傳入的參數而已
既然這樣,我們在ES Modules模塊下,訪問arguments看下結果是什么?
// index.js ES modules console.log(arguments); // ReferenceError: arguments is not defined
node官方文檔建議使用import.meta.url變相的提供
// import.meta.url 返回模塊的絕對的 `file:` URL。 // url模塊中fileURLToPath()函數,返回完全解析的特定于平臺的 Node.js 文件路徑 // path模塊中dirname()函數,返回路徑的目錄路徑 import { fileURLToPath } from 'url'; import { dirname } from 'path'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename);
“nodejs中的__dirname和__filename變量怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。