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 모듈은 importexport 문이 모듈 본문의 상위 레벨에서만 가능하다고 명시하고 있습니다.

예제

이 규칙에 대해 잘못된 코드 예시:

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

참고 자료