100log

About

CommonJS vs ES Module

Front-end

CommonJS vs ES Module

CommonJS

ES Module(ESM)

차이점 요약

사용 상황

main-img

CommonJS vs ES Module

CommonJSES Module(ESM) 은 자바스크립트에서 모듈을 관리하고 불러오는 두 가지 주요 방식이다.
둘의 차이점에 대해 살펴보자.


CommonJS

CommonJS는 주로 Node.js 환경에서 사용되며, 모듈을 동기적으로 불러온다.
즉 모듈이 로드될 때까지 다음 코드가 실행되지 않는 방식이며 require 키워드를 사용해 가져오고 module.export를 통해 내보낸다.
이 방식은 주로 서버측에서 사용됐지만 클라이언트 환경에서도 번들러를 통해 사용할 수 있다.

// 내보내기
const foo = () => { console.log("foo"); };
module.exports = foo;

// 가져오기
const foo = require('./foo');
foo(); // "foo"
  • 주로 Node.js 환경에서 사용됨
  • 파일 단위로 모듈 정의
  • 런타임에 모듈을 로드(동기적 방식, 서버 환경에 적합)
  • .cjs 확장자를 쓰기도 함(ESM과 혼용 시)

ES Module(ESM)

ES Module은 자바스크립트의 공식 표준 모듈 시스템으로 ECMAScript 2015(ES6)부터 도입되었다.
ESM은 브라우저와 Node.js 환경에서 모두 사용할 수 있으며, 모듈을 비동기적으로 로드한다.
모듈을 가져올 때는 import 키워드를 사용하고 내보낼 때는 export를 사용한다. 또한 ESM은 정적 분석이 가능해 트리 쉐이킹과 같은 최적화 작업에도 유리하다.

// 내보내기
export const foo = () => { console.log("foo"); };

// 가져오기
import { foo } from './foo.js';
foo(); // "foo"
  • 브라우저와 Node.js 모두에서 사용 가능 (ES6+ 이후 지원)
  • 비동기적 방식
  • .mjs 확장자를 쓰거나 package.json에 "type": "module" 설정 필요

차이점 요약

항목CommonJSES Module
문법require, module.exportimport, export
로딩 방식동기비동기
실행 시점런타임컴파일 / 정적 분석
브라우저 지원❌ (바벨 등 트렌스파일 필요)⭕ (단, .mjs 또는 type: "module" 필요)
파일 확장자.js, .cjs.js, .mjs
TypeScript 등 호환성지원됨, 이미 방대한 코드베이읏 존재점차적으로 지원 확장됨, 점점 더 많은 도구, 라이브러리, 프레임워크가 ESM 중심으로 전환 중

사용 상황

상황추천
기존 Node.js 프로젝트 유지CommonJS
브라우저용 모듈 개발ES Module
신규 Node.js 프로젝트 시작ES Module(추천)
트리 쉐이킹 / 최적화 필요ES Module
빠른 테스트 / 실행CommonJS(속도가 빠르고 설정이 간단)
profile_img백종민
1993
Seoul
커리어 발전을 위한 새로운 기회를 찾고있습니다.