본문 바로가기

언어/Node.js

[ Node.js ] require() vs import 비교

반응형

importrequire는 모두 Node.js 환경에서 모듈을 가져오는 데 사용되는 방법이지만, 몇 가지 중요한 차이점이 있습니다. 이 둘의 차이는 주로 사용 시점지원하는 모듈 시스템에서 발생합니다.

1. 모듈 시스템 차이

  • require: CommonJS 모듈 시스템
    • require는 Node.js에서 기본적으로 사용되는 CommonJS 모듈 시스템의 일부입니다.
    • CommonJS는 Node.js의 초기 모듈 시스템이며, 대부분의 기존 Node.js 코드베이스에서 사용됩니다.
  • import: ES Module (ECMAScript Module) 시스템
    • importECMAScript Module(ESM) 표준에 기반한 모듈 시스템입니다.
    • 이 모듈 시스템은 JavaScript의 최신 표준에 맞춰 도입되었으며, 브라우저 환경에서도 사용됩니다.

2. 문법 차이

  • require 문법 (CommonJS)
const module = require('module-name');
  • require는 함수 형태로 모듈을 불러옵니다.
  • 모듈을 동적으로 호출할 수 있습니다.
  • import 문법 (ES Module)
import module from 'module-name';
  • import는 선언적이고 정적인 방법으로 모듈을 가져옵니다.
    • 반드시 파일의 최상단에서 사용해야 하며, 동적으로 모듈을 가져올 수 없습니다. (단, import() 함수를 사용하면 동적 import도 가능해짐.)

3. 동작 방식

  • require: 런타임 로딩
    • require런타임에 모듈을 불러옵니다. 즉, 코드가 실행되는 시점에 모듈이 로드됩니다.
    • 예를 들어, 함수 안에서 조건적으로 모듈을 불러오는 것이 가능합니다.
if (condition) {
  const module = require('module-name');
}
  • import: 정적 로딩
    • import컴파일 타임에 모듈을 가져옵니다. 코드가 실행되기 전에 모듈이 분석되어야 하며, 파일의 최상단에서만 사용할 수 있습니다.
    • 이러한 정적 특성 덕분에 import는 트리 셰이킹(tree-shaking) 등 최적화에 유리합니다.
import module from 'module-name'; // 파일의 최상단에서만 사용

4. 동적 import

  • 동적 require
    • require는 함수이므로, 동적으로 모듈을 불러오는 것이 가능합니다.
if (someCondition) {
  const myModule = require('./myModule');
}
  • 동적 import()
    • import도 최신 문법에서는 동적으로 사용할 수 있지만, 이는 일반적인 import 문법과는 다릅니다. 동적 import는 Promise를 반환합니다.
import('./myModule').then((module) => {
  console.log(module);
});

5. 호환성

  • require: Node.js 기본 지원
    • require는 Node.js의 모든 버전에서 기본적으로 지원되며, 모든 기존 Node.js 프로젝트에서 사용할 수 있습니다.
  • import: Node.js 12+에서 실험적 지원, 13+에서 안정화
    • import는 ES 모듈을 지원하는 Node.js 버전(12 이상)에서 사용할 수 있습니다.
    • import를 사용하려면 파일 확장자를 .mjs로 설정하거나, package.json에서 "type": "module"을 명시해야 합니다.

6. 모듈 내보내기 방식

  • module.exportsexports (CommonJS)
    • require와 함께 모듈을 내보내기 위해서는 module.exportsexports 객체를 사용합니다.
// 모듈 내보내기 (CommonJS)
module.exports = function() { ... };
  • exportexport default (ESM)
    • import와 함께 모듈을 내보내기 위해서는 export 키워드를 사용합니다.
// 모듈 내보내기 (ESM)
export default function() { ... };
export const myFunction = () => { ... };

7. 요약

특징 require (CommonJS) import (ES Module)
모듈 시스템 CommonJS ES Module
문법 const module = require('module-name'); import module from "module-name';
모듈 로딩 시점 런타임 (동적 가능) 컴파일 타임 (정적)
동적 모듈 로딩 가능 import() 함수로 가능
트리 셰이킹 지원되지 않음 지원 (정적 분석 가능)
Node.js 기본 지원 버전 모든 버전 Node.js 12+에서 실험적, 13+에서 안정적
파일 확장자 .js .mjs (또는 package.json 설정 필요)

 

8. 결론

  • CommonJS (require)는 여전히 많은 Node.js 프로젝트에서 사용되며, 기존 코드베이스에서 안정적으로 동작합니다.
  • ESM (import)은 표준화된 방식이며, 최신 Node.js와 브라우저 환경에서 모듈을 로드하는 최적화된 방법입니다.
반응형