如果在Node.js的ES模块中使用__filename或__dirname会导致错误,[ESLint]会报错

在ES Modules中,无法使用__filename和__dirname。

在Node.js的ES模块中,由于下列全局变量不存在,因此无法使用。

    • require

 

    • exports

 

    • module

 

    • __filename

 

    • __dirname

 

    global

然而,目前在TypeScript类型检查中还没有办法排除使用这些变量的代码。

请参考以下的问题和讨论以获取更详细的信息。

 

目前似乎只能等待DefinitelyTyped提供支持。

在ESLint中禁止使用__filename和__dirname

正如前面所述,TypeScript无法通过类型检查来排除错误。然而,我们希望避免出现运行时错误。

因此,我们考虑使用 ESLitnt 对这些变量进行静态分析来排除它们。

如果正在使用ESLint的Flat配置

在languageOptions属性中选择globals.nodeBuiltin而不是globals.node。

 import globals from "globals";

 // ...(中略)

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

我使用了globals模块中的nodeBuiltin定义。

对于Node.js,这个包提供了两组全局变量:

globals.nodeBuiltin:对于在Node.js中运行的所有代码都可用的全局变量。通常作为全局对象的属性可用,包括process、Buffer,但不包括像require这样的CommonJS参数。参见:https://nodejs.org/api/globals.html

globals.node:一个由nodeBuiltin中的全局变量和所有的CommonJS参数组成的组合(“CommonJS模块范围”)。参见:https://nodejs.org/api/modules.html#modules_the_module_scope

在分析已知在CommonJS包装器之外运行的代码(例如JavaScript模块)时,可以使用nodeBuiltin来查找意外的CommonJS引用。

这个包为Node.js提供了两个全局变量的定义:

globals.nodeBuiltin:在所有运行于Node.js上的代码中可用的全局变量。这些通常作为global对象的属性可用,包括了像process和Buffer这样的变量,但不包括CommonJS用变量如require。参考:https://nodejs.org/api/globals.html

globals.node:组合了nodeBuiltin的全局变量和CommonJS用变量的所有变量(“CommonJS模块作用域”)。参考:https://nodejs.org/api/modules.html#modules_the_module_scope

当分析不是在CommonJS下执行的代码,例如JavaScript模块时,可以偶然地通过nodeBuiltin找到引用的CommonJS变量。引用:https://www.npmjs.com/package/globals

如果您想要禁用其他全局变量,请按照以下方式编写。

import globals from "globals";

// ...(中略)

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

如果设置文件是.eslintrc格式的话

如果你正在使用旧格式的配置文件而不是Flat Config,可以通过进行以下设置来禁用各个全局变量。

  "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プロパティを設定することでグローバル変数の定義を制御できる。

广告
将在 10 秒后关闭
bannerAds