Skip to content
← Back to rules

typescript/no-require-imports 제한

An auto-fix is available for this rule.

작동 방식

CommonJS require 호출 사용을 금지합니다.

왜 좋지 않은가?

require는 노드에서 동작하며, 오래된 자바스크립트 환경에서도 사용 가능하지만, 현대적인 자바스크립트 개발에서는 여러 중요한 이유로 모듈(import)보다 덜 바람직하다고 간주됩니다:

  1. 정적 대 동적: require런타임 함수입니다. 코드가 실행될 때 실행되므로, 모듈이 누락되었거나 경로가 잘못된 경우와 같은 오류는 런타임에만 발견됩니다. 반면 모듈(예: import)은 정적 가져오기입니다. 그 해석과 잠재적인 오류는 컴파일 또는 번들링 과정에서 확인되기 때문에 개발 중에 더 쉽게 잡을 수 있습니다.

  2. 코드 구조 및 가독성: require 문장은 코드 전반에 흩어져 있어 특정 모듈의 의존성을 빠르게 파악하기 어렵습니다. 반면 import 문장은 일반적으로 파일 상단에 묶여 있어 코드 구조를 개선하고 가독성을 높입니다.

  3. 트리 쇼킹 및 최적화: 웹팩이나 롤업과 같은 현대 번들러는 트리 쇼킹을 통해 최종 번들에서 사용되지 않는 코드를 제거합니다. 트리 쇼킹은 정적이고 명시적으로 선언된 의존성의 경우에 훨씬 잘 작동합니다. require는 번들러가 사용되지 않는 코드를 정확히 식별하고 제거하는 것을 어렵게 만들며, 결과적으로 번들 크기가 커지고 로딩 속도가 느려집니다.

  4. 순환 종속성 처리: 순환 종속성(모듈 A가 모듈 B를 가져오고, 모듈 B가 모듈 A를 가져오는 경우)은 require를 사용할 경우 훨씬 더 어려워집니다. import()를 활용한 선언적 성격과 동적 가져오기 기능을 통해 ES 모듈은 순환 가져오기를 더 잘 다룰 수 있는 메커니즘을 제공합니다.

  5. 유지 보수성 및 리팩터링 용이성: 모듈 이름이나 경로를 변경하는 것은 ES 모듈을 사용할 때 더 간단합니다. 변경 내용이 직접 선언되기 때문에 컴파일러나 번들러가 오류를 감지할 수 있습니다. 반면 require의 경우 특정 모듈의 모든 require 문장을 찾아야 하므로 리팩터링이 오류 발생 가능성이 큽니다.

  6. 현대 자바스크립트 표준: import는 현대 자바스크립트에서 모듈을 가져오는 표준 방식이며, 현재의 최선의 실천 방법과 언어 사양과 일치합니다. require를 사용하려면 브라우저나 현대 자바스크립트 환경이 이해할 수 있는 형식으로 변환하기 위한 추가 빌드 단계나 도구가 필요합니다.

  7. 오류 처리: import()를 사용한 동적 가져오기와 함께 try...catch 블록을 사용하면 모듈 로딩 중 오류를 더 체계적으로 처리할 수 있습니다. 반면 require의 오류는 예측하기 어려울 수 있습니다.

요약하면, require는 작동하지만 정적 분석, 더 나은 번들링, 개선된 코드 구조, 유지 보수 용이성 면에서 ES 모듈의 이점이 크기 때문에 현대 자바스크립트 프로젝트에서 모듈을 가져오는 데 가장 선호되는 방법입니다.

예시

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

ts
const lib1 = require("lib1");
const { lib2 } = require("lib2");
import lib3 = require("lib3");

이 규칙에 대한 올바른 코드 예시:

ts
import * as lib1 from "lib1";
import { lib2 } from "lib2";
import * as lib3 from "lib3";

구성

이 규칙은 다음 속성을 가진 구성 객체를 수용합니다:

allow

type: string[]

기본값: []

이 문자열들은 u 플래그로 컴파일된 정규 표현식이 되며, 가져온 경로에 대해 테스트에 사용됩니다. 일반적인 사용 사례로는 package.json을 가져오는 것을 허용하는 것입니다. 이는 package.json이 일반적으로 TS 루트 디렉터리 밖에 위치하기 때문입니다. 따라서 정적 가져오기는 특히 resolveJsonModule이 활성화된 경우 루트 디렉터리 충돌을 유발할 수 있습니다. 또한 환경이 JSON 모듈을 지원하지 않을 경우 다른 어떤 경우든 import 문이 작동하지 않을 수 있으므로 이를 위해 사용할 수도 있습니다.

{ allow: ['/package\\.json$'] } 설정 시:

이 규칙에 대한 올바른 코드 예시:

ts
console.log(require("../package.json").version);

allowAsImport

type: boolean

기본값: false

true로 설정하면 import ... = require(...) 선언은 보고되지 않습니다. 이는 일부 모듈 옵션을 사용해 엄격한 CommonJS 호환성 의미를 요구하는 경우 유용합니다.

true로 설정 시:

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

ts
var foo = require("foo");
const foo = require("foo");
let foo = require("foo");

이 규칙에 대한 올바른 코드 예시:

ts
import foo = require("foo");
import foo from "foo";

사용 방법

설정 파일 또는 CLI를 사용하여 이 규칙을 활성화하려면 다음을 사용할 수 있습니다:

json
{
  "rules": {
    "typescript/no-require-imports": "error"
  }
}
bash
oxlint --deny typescript/no-require-imports

참고 자료