Skip to content
← Back to rules

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

参照