CJS와 ESM

2025. 1. 12. 11:44·프론트엔드/JavaScript, TypeScript

LLM과 토스 기술블로그 https://toss.tech/article/commonjs-esm-exports-field 포스팅을 활용하여 작성했다.

CommonJS(CJS)와 ECMAScript Modules(ESM) 요약 및 비교
CJS와 ESM은 자바스크립트에서 모듈을 관리하고 사용하는 두 가지 시스템입니다. 각각의 시스템은 서로 다른 장점과 단점을 지니고 있으며, 이로 인해 서로 호환되지 않는 경우가 많습니다.

CJS와 ESM의 비교

특성 CommonJS (CJS) ECMAScript Modules (ESM)
문법 require / module.exports import / export
로딩 방식 동기적 비동기적
Top-level await 지원 여부 지원하지 않음 지원함
Tree shaking 가능 여부 어렵다 가능
파일 확장자 .js, .cjs .js, .mjs
TypeScript 검사 규칙 type: "commonjs"기본 type: "module"

CJS와 ESM의 상세 비교

  1. 문법
    CJS는 모듈을 정의하고 가져오기 위해 require와 module.exports를 사용합니다.
    ESM은 import와 export 문법을 사용합니다.
  2. 로딩 방식
    CJS는 모듈을 동기적으로 로드합니다. 이는 종종 서버 환경에서 유용합니다.
    ESM은 비동기적으로 모듈을 로드하여 더 효율적인 코드 실행을 가능하게 합니다.
  3. Top-level await
    Top-level await은 ESM에서 지원되며, 비동기 코드 작성을 더 간결하게 만들어 줍니다.
    CJS는 이를 지원하지 않아서 비동기 작업을 포함하면 특정 함수 내에서만 사용할 수 있습니다.
  4. Tree shaking
    CJS는 동적으로 모듈을 로딩하기 때문에 Tree-shaking(필요 없는 코드를 제거하는 과정)이 어렵습니다.
    ESM은 정적 구조를 갖고 있어 빌드 타임에 모듈 간의 의존성을 쉽게 분석하고, 불필요한 코드를 제거할 수 있습니다.
  5. 파일 확장자
    CJS는 기본적으로 .js와 .cjs 파일을 사용합니다.
    ESM은 일반적으로 .js와 .mjs 확장자를 사용하여 구분합니다.
  6. TypeScript 지원
    CJS 패키지는 type: "commonjs"가 설정되어야 하며 .ts 파일을 CJS로 해석합니다.
    ESM 패키지는 type: "module"이 설정되어야 하며 .ts 파일을 ESM으로 해석합니다.

Top-level Await

Top-level await은 ESM에서 새롭게 도입된 기능으로, 비동기 작업을 모듈의 최상위 수준에서 직접 다룰 수 있게 해줍니다. 주요 특징은 다음과 같습니다:

  • 비동기 코드의 간결함: CJS에서는 비동기 코드를 작성하기 위해 함수를 정의해야 했던 반면, ESM에서는 필요할 때마다 최상위에서 비동기 작업을 쉽게 작성할 수 있습니다.
  • Promise 사용: Top-level await는 Promise를 기본으로 하며, 이로 인해 더 직관적인 비동기 코드 작성을 가능하게 합니다. 이는 특히 코드가 복잡해지는 경우 유용합니다.
  • 호환성: Top-level await은 ESM 환경에서만 사용 가능하므로 CJS와의 호환성 문제를 일으킵니다.

예시:

// ESM에서의 Top-level await 사용 예시
const data = await fetchData(); // fetchData()는 Promise를 반환하는 함수
console.log(data);

결론

CJS와 ESM은 자바스크립트 모듈 관리의 중요한 부분이며, 각 모듈 시스템이 제공하는 기능을 활용하여 다양한 상황에 맞는 코드를 작성할 수 있습니다. Top-level await은 ESM에서 제공되는 유용한 기능으로, 비동기 작업을 더 간결하고 직관적으로 처리할 수 있게 해줍니다.

Node.js 와 브라우저 환경

각각의 환경인 Node.js와 브라우저에서 CommonJS(CJS)와 ECMAScript Modules(ESM)의 동작 방식과 특징을 설명하겠습니다.

Node.js 환경

  1. CommonJS (CJS)
  • 모듈 시스템: Node.js의 기본 모듈 시스템으로, 서버 측에서 동작합니다.
  • 동기적 로딩: 모듈을 동기적으로 로드하며, 모든 모듈이 로드될 때까지 실행이 중단됩니다.
  • 파일 확장자: .js와 .cjs 확장자를 사용합니다.

예시:

// math.js
function add(a, b) {
return a + b;
}
module.exports = add;
// app.js
const add = require('./math.js');
console.log(add(2, 3)); // 5
  1. ECMAScript Modules (ESM)
  • 모듈 시스템: Node.js 12 버전부터 지원되며, ES6 문법을 사용합니다.
  • 비동기적 로딩: ESM은 비동기적으로 모듈을 로드하여 더 효율적인 코드 실행이 가능합니다.
  • 파일 확장자: .js와 .mjs 확장자를 사용하며, package.json에서 "type": "module"을 설정하여 ESM을 사용할 수 있습니다.

예시:

// math.mjs
export function add(a, b) {
return a + b;
}
// app.mjs
import { add } from './math.mjs';
console.log(add(2, 3)); // 5

브라우저 환경

  1. CommonJS (CJS)
  • 지원 부족: 브라우저는 기본적으로 CJS를 지원하지 않습니다. 브라우저에서 CJS 모듈을 사용하려면 Webpack, Browserify 등의 번들러를 사용해야 합니다.
  • 동기적 로딩: CJS는 동기적으로 모듈을 로드하기 때문에 브라우저 환경에서는 성능 저하를 일으킬 수 있습니다.

예시: (번들러를 사용해야 함)

  1. ECMAScript Modules (ESM)
  • 모듈 시스템: 브라우저에서 기본적으로 지원되는 모듈 시스템입니다.
저작자표시 (새창열림)

'프론트엔드 > JavaScript, TypeScript' 카테고리의 다른 글

브라우저 탭간 통신하는 3가지 방법  (0) 2024.08.02
동시 여러 개의 토큰 리프레시 요청 관리하기  (0) 2024.07.28
Typescript와 Duck typing  (0) 2023.12.11
조건부 타입과 맵드 타입, 유틸리티 타입  (1) 2023.03.15
타입 가드  (1) 2023.01.25
'프론트엔드/JavaScript, TypeScript' 카테고리의 다른 글
  • 브라우저 탭간 통신하는 3가지 방법
  • 동시 여러 개의 토큰 리프레시 요청 관리하기
  • Typescript와 Duck typing
  • 조건부 타입과 맵드 타입, 유틸리티 타입
정현우12
정현우12
  • 정현우12
    정현우의 개발 블로그
    정현우12
  • 전체
    오늘
    어제
    • 분류 전체보기 (79)
      • 프론트엔드 (56)
        • JavaScript, TypeScript (12)
        • 스타일링 (1)
        • React (13)
        • Next.js (4)
        • 개발 환경 (9)
        • 테스트 (3)
        • 성능 최적화 (11)
        • 함수형 프로그래밍 (2)
        • 구조 (1)
      • 프로젝트 회고 (23)
        • 이미지편집기 개발 (7)
        • 엑셀 다운로드, 업로드 공통 모듈 개발 (4)
        • 사용자 매뉴얼 사이트 개발 (3)
        • 통계자동화 솔루션 개발 (1)
        • 엑셀 편집기 개발 (5)
        • API 플랫폼 (1)
        • 콜센터 솔루션 OB 캠페인 (1)
        • AI 스튜디오 (1)
      • 백엔드 (0)
  • 블로그 메뉴

    • 홈
    • 포트폴리오
    • 태그
  • 인기 글

  • 태그

    React-boilerplate
    커스텀 훅
    useReducer
    Next.js
    memoization
    엑셀
    frontend
    이미지 편집기
    사용자 매뉴얼 사이트
    웹 성능 최적화
    회고
    TypeScript
    JavaScript
    React
    로딩 성능 최적화
    엑셀 에디터
    라이브러리 선정
    webpack
    렌더링 성능 최적화
    Github Actions
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
정현우12
CJS와 ESM
상단으로

티스토리툴바