노트

ES 모듈과 CommonJS

ES Modules and CommonJS

프런트엔드#js · 연결된 개념 8개

쉽게 말하면

ES 모듈은 쓸 재료를 레시피 맨 위에 미리 다 적어 두는 방식이고, CommonJS는 요리하다 필요할 때 냉장고에서 꺼내 오는 방식이에요. 재료 목록이 미리 있으니 번들러가 안 쓰는 재료를 뺄 수 있죠.

비유가 깨지는 곳 ESM도 나중에 꺼내 오는 길이 있어요. 동적 import()가 그거고 코드 스플리팅의 기반이에요. 다만 번들러 없이 브라우저에서 쓰면 파일마다 요청이 생기고 import 경로에 확장자까지 적어야 해요.

ES 모듈(ECMAScript Modules, ESM)은 import/export로 파일 간 의존을 정적으로 선언하는 JavaScript 표준 모듈 시스템이다. Node.js가 먼저 쓰던 CommonJS는 require()/module.exports로 의존을 런타임에 불러온다.

ESMCommonJS
문법import/exportrequire/module.exports
결정 시점실행 전(정적)실행 중(동적, 조건문 안 가능)
브라우저<script type="module"> 지원번들러 필요
  • ESM은 의존 그래프를 미리 알 수 있어서 트리 셰이킹과 동적 import()(코드 스플리팅과 동적 임포트)의 기반이 된다
  • 번들러 없이 브라우저에서 ESM을 쓰면 파일마다 요청이 생기고, import 경로에 확장자(.js)까지 적어야 한다. 이런 이유로 번들러가 남아 있다
  • TypeScript의 namespace와 /// <reference>는 ESM이 자리 잡기 전에 파일을 나누던 방식이다. 참조가 빠져도 컴파일 에러가 안 나는 단점이 있어서 지금은 ESM이 권장된다
  • 타입만 가져오는 import를 어떻게 처리할지는 verbatimModuleSyntax와 import type에서 다룬다
  • 재수출로 진입점을 모으는 방법은 배럴 파일과 re-export에 정리했다

파이썬 쪽의 같은 개념은 파이썬 모듈과 패키지에 있다.

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • NestJS

    NestJS는 TypeScript를 전제로 모듈·의존성 주입(Dependency Injection, DI)·데코레이터(decorator) 구조를 제공하는 Node.js 서버 프레임워크다. 2017년 Kamil Myśliwiec가 만들었고, 구조를 강제하는 방식 때문에 흔히 "Node.js의 Spring"이라 불린다.

  • 번들 크기 줄이기

    번들 다이어트는 사용자가 내려받는 JavaScript 양을 측정하고 줄이는 작업이다. 같은 용량이라도 JS는 이미지보다 비싸다. 이미지는 다운로드와 디코딩만 하면 되지만, JS는 다운로드·파싱·컴파일·실행을 모두 거친다.

  • enum과 as const 객체

    TypeScript의 enum은 관련된 상수 집합에 이름과 타입을 함께 주는 문법이다. 다른 TS 타입과 달리 런타임 객체로 컴파일되어 남는다. 요즘 프런트엔드에서는 같은 일을 as const 객체와 유니언 타입으로 하는 경우가 많다.

  • 정규 표현식 기초

    정규 표현식(Regular Expression)은 문자열에서 찾을 패턴을 메타문자(metacharacter)로 기술하는 작은 언어다. JavaScript에서는 리터럴 /pattern/flags나 new RegExp(pattern, flags)로 만든다.

  • CPU 아키텍처와 네이티브 모듈

    CPU 아키텍처는 CPU가 실행하는 명령어 집합(Instruction Set Architecture, ISA)의 종류다. 서버와 PC에서는 x86-64와 ARM64 두 계열이 주로 쓰이고, 한 계열용으로 컴파일된 기계어는 다른 계열 CPU에서 실행되지 않는다. Node.js 프로젝트에서는 이 차이가 네이티브 모듈에서 드러난다.

보기 옵션