node/global-require スタイル
何を実行するか
require() 呼び出しをモジュールのトップレベルスコープに限定する
なぜこれは悪いのか
Node.js では、モジュールの依存関係は require() 関数を使ってインクルードします。たとえば:
js
var fs = require("fs");require() はコード内のどこでも呼び出せるものの、一部のコーディングガイドラインでは、モジュールのトップレベルでのみ呼び出すように規定しています。これにより、依存関係を識別しやすくなります。たとえば、関数や他の文の中に深くネストされた依存関係は、識別が難しくなります:
js
function foo() {
if (condition) {
var fs = require("fs");
}
}require() は同期的にロードを行うため、他の場所で使用するとパフォーマンス上の問題を引き起こす可能性があります。さらに、ES6 モジュールでは、import および export 文はモジュール本体のトップレベルでのみ使用できると定められています。
例
このルールに対して不正なコードの例:
js
// 関数内での require() の呼び出しは許可されない
function readFile(filename, callback) {
var fs = require("fs");
fs.readFile(filename, callback);
}
// 条件付きの require も許可されない
if (DEBUG) {
require("debug");
}
// switch 文内での require() も警告される
switch (x) {
case "1":
require("1");
break;
}
// アロー関数の本体内での require() も許可されない
var getModule = (name) => require(name);
// 関数本体内での require() も許可されない
function getModule(name) {
return require(name);
}
// try/catch ブロック内での require() も許可されない
try {
require(unsafeModule);
} catch (e) {
console.log(e);
}このルールに対して正しいコードの例:
js
// 以下のすべての形式の require() は問題ない
require("x");
var y = require("y");
var z;
z = require("z").initialize();
// モジュールを読み込み、関数内で利用するのは問題ない
var fs = require("fs");
function readFile(filename, callback) {
fs.readFile(filename, callback);
}
// 三項演算子を使ってどのモジュールを読み込むか決定してもよい
var logger = DEBUG ? require("dev-logger") : require("logger");
// モジュールの最後に require() を呼び出してもよい
function doSomethingA() {}
function doSomethingB() {}
var x = require("x"),
z = require("z");使用方法
設定ファイルまたは CLI でこのルールを有効化するには、次のように使用できます:
json
{
"plugins": ["node"],
"rules": {
"node/global-require": "error"
}
}bash
oxlint --deny node/global-require --node-plugin