단북
프론트엔드 기술 면접·실무 프로젝트 지식

ES 모듈과 CommonJS 모듈의 차이점은 무엇인가요?

import/export 기반 ESM과 require/module.exports 기반 CommonJS의 문법·로딩 방식·동작 차이를 정리합니다.

자바스크립트에는 코드를 모듈로 나누는 두 가지 주요 시스템이 있습니다. ESM(ECMAScript Modules) 은 언어 표준 모듈 시스템이고, CommonJS(CJS) 는 Node.js가 초기부터 사용해 온 모듈 시스템입니다.

문법

// ESM
import { sum } from './math.js';
export const PI = 3.14;
export default function () {}
 
// CommonJS
const { sum } = require('./math');
module.exports.PI = 3.14;
module.exports = function () {};

핵심 차이

  • 로딩 시점 — ESM은 정적(static) 구조로, 실행 전에 import/export가 분석됩니다. CommonJS는 require런타임에 동기적으로 실행됩니다.
  • 정적 분석·트리 셰이킹 — ESM은 정적 구조 덕에 번들러가 사용하지 않는 export를 제거(트리 셰이킹)하기 좋습니다. CJS는 동적이라 어렵습니다.
  • 비동기 vs 동기 — ESM은 비동기 로딩에 적합(브라우저에서 동작). CJS의 require는 동기.
  • 바인딩 방식 — ESM import는 살아있는 참조(live binding) 로 원본 값 변경이 반영됩니다. CJS는 내보내는 시점의 값 복사에 가깝습니다.
  • this / 최상위 — CJS 모듈 최상위 thismodule.exports, ESM 최상위 thisundefined. ESM은 기본적으로 strict mode.
  • 최상위 await — ESM은 top-level await 지원, CJS는 미지원.

환경

  • 브라우저는 <script type="module"> 로 ESM을 직접 지원합니다.
  • Node.js는 둘 다 지원하며, package.json"type": "module" 또는 확장자(.mjs/.cjs)로 구분합니다.
  • 오늘날 프런트엔드/번들러 생태계는 ESM을 표준으로 권장합니다.
항목ESMCommonJS
문법import / exportrequire / exports
로딩정적 분석, 비동기런타임, 동기
트리 셰이킹용이어려움
바인딩라이브 바인딩(참조)값 복사
top-level await지원미지원

ESM과 CommonJS의 차이로 옳은 것은?

이 레슨을 다 읽으셨나요?

완료 표시는 이 브라우저에 저장됩니다.