1
1

More than 1 year has passed since last update.

[ESLint] Node.jsのES Modulesで__filenameや__dirnameを使ったらエラーにする

Last updated at Posted at 2023-09-25

ES Modulesでは__filename__dirnameは使えない

Node.jsのES Modulesでは、以下のグローバル変数は存在しないため使用できません。

  • require
  • exports
  • module
  • __filename
  • __dirname
  • global

しかし、現状ではこれらの変数を使ったコードをTypeScriptの型チェックで弾く方法はありません

詳細は以下のissueやdiscussionを参照してください。

現在はDefinitelyTypedが対応するのを待つしかないようです。

__filenameや__dirnameの使用をESLintで弾く

前述したように、TypeScriptの型チェックで弾くことはできません。しかし、実行時エラーになるのは避けたいです。

そこで、ESLitntを使ってこれらの変数を静的解析で弾くことを考えます。

ESLintのFlat Configを使っている場合

languageOptionsプロパティにglobals.nodeではなくglobals.nodeBuiltinを指定します。

eslint.config.js
 import globals from "globals";

 // ...(中略)

     languageOptions: {
-      globals: globals.node,
+      globals: globals.nodeBuiltin,
     },

globalsパッケージのnodeBuiltinという定義を利用しています。

For Node.js this package provides two sets of globals:

When analyzing code that is known to run outside of a CommonJS wrapper, for example, JavaScript modules, nodeBuiltin can find accidental CommonJS references.
出典:https://www.npmjs.com/package/globals

(翻訳)
Node.jsに対して、このパッケージは2つのグローバル変数の定義を提供します:

  • globals.nodeBuiltin:Node.jsで実行されるすべてのコードで利用可能なグローバル変数。これらは通常、globalオブジェクトのプロパティとして利用可能で、processBufferが含まれますが、requireのようなCommonJS用変数は含まれません。参照: https://nodejs.org/api/globals.html
  • globals.nodenodeBuiltinのグローバル変数とCommonJS用の全ての変数の組み合わせ(「CommonJSモジュール・スコープ」)。参照: https://nodejs.org/api/modules.html#modules_the_module_scope

CommonJS以外で実行されることが知られているコード、例えば JavaScript モジュールを分析するとき、nodeBuiltin は偶発的に参照されているCommonJS変数を見つけることができます。
出典: https://www.npmjs.com/package/globals

他のグローバル変数も無効化したい場合は、以下のように書きます。

eslint.config.js
import globals from "globals";

// ...(中略)

    languageOptions: {
      globals: {
        ...globals.nodeBuiltin,
        process: "off", // 例: グローバル変数processを無効化できる
      },
    },

設定ファイルが.eslintrc形式の場合

Flat Configではなく古い形式の設定ファイルを使っている場合、以下の設定を行うことで個別にグローバル変数を無効化できます。

.eslintrc
  "env": {
    "node": true
  },
  "globals": {
    "require":"off",
    "exports":"off",
    "module":"off",
    "__filename":"off",
    "__dirname":"off",
    "global":"off"
  }

globalsプロパティに使用したくないグローバル変数をoffと設定することで、ソースコード中で使用した場合にESLintでエラーを出すことができます。

まとめ

  • __filename__dirnameが使えるのはCommon JSのみ。ES Moduleでは使えない。
  • しかし、2023年9月現在ではES Moduleのコードで__filename__dirnameを使っても型エラーにならない
  • ESLintで__filename__dirnameの使用をエラーにするには、以下の方法を使う
    • Flat Configを使用している場合:globals.nodeBuiltinを設定する
    • Flat Configを使用していない場合globalsプロパティを設定することでグローバル変数の定義を制御できる。
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1