溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

nodejs中的__dirname和__filename變量怎么使用

發(fā)布時間:2021-12-03 09:37:01 來源:億速云 閱讀:271 作者:iii 欄目:web開發(fā)

本篇內容介紹了“nodejs中的__dirname和__filename變量怎么使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

nodejs中的__dirname和__filename變量怎么使用

1.問題背景

寫這篇文章的背景在于今天遇到一個神奇的報錯,一起來看下

// index.js
console.log(__filename);
// 執(zhí)行 node index.js
// ReferenceError: __filename is not defined in ES module scope

在node環(huán)境訪問全局變量__filename居然報錯,什么原因呢??于是開始了一路的探索,最終找到問題的根源。

2. node模塊機制

我們知道早期node.js的模塊標準采用commonjs模塊規(guī)范,然而在nodejs版本v13.2.0中,開始支持ES Modules模塊規(guī)范,我們可以有以下幾種方式在node中使用ES Modules模塊

  • 將文件后綴命名為.mjs

  • package.json 新增 "type": "module"字段

當我們在node中使用ES Modules貴方,以下全局對象和變量將不可用

  • require

  • module.exports

  • exports

  • __filename

  • __dirname

  • NODE_PATH

3. 為什么采用commonjs模塊化可以使用__filename和__dirname?

這個問題,主要歸結于commonjs模塊下nodejs的運行機制,很多人可能認為__filename就是node環(huán)境中的全局變量,當出現(xiàn)這個問題的時候,我們才意識到,這兩個不是Node中真正的全局變量。

看一段簡單的js代碼

(function(){
    console.log(arguments) // [1,2,3]
})(1,2,3)

arguments在函數(shù)內部可以拿到調用函數(shù)時傳入的參數(shù)。

我們在node commonjs模塊中執(zhí)行以下代碼

// 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個參數(shù),這5個參數(shù)就是exports, require, module, __filename, __dirname

到這里我們就清楚的知道,__filename不是全局變量,而是外層傳入的參數(shù)而已

既然這樣,我們在ES Modules模塊下,訪問arguments看下結果是什么?

// index.js ES modules
console.log(arguments);
// ReferenceError: arguments is not defined

4. ES Modules下如何使用__filename和__dirname?

node官方文檔建議使用import.meta.url變相的提供

// import.meta.url 返回模塊的絕對的 `file:` URL。
// url模塊中fileURLToPath()函數(shù),返回完全解析的特定于平臺的 Node.js 文件路徑
// path模塊中dirname()函數(shù),返回路徑的目錄路徑
import { fileURLToPath } from 'url';
import { dirname } from 'path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

“nodejs中的__dirname和__filename變量怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI