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