개발하는 애플리케이션의 크기가 커지고 프로그램의 내부를 기능별로 분할한 부분을 “모듈”이라 부른다
JavaScript 프로그램을 모듈로 개발하고 배포할 수 있게 하기 위해 만들어짐
모듈 시스템이 없던 초기의 자바스크립트는 브라우저에서는 큰 문제가 없었지만 서버 사이드에서 사용하기에는 여러 기능들을 모듈화 없이 유지보수하는 것은 거의 불가능에 가까웠다. 파일을 나누는 것은 가능하지만 스코프가 전역(Global)이라서 충돌 위험이 너무 컸다.
하지만 클라이언트와 서버 측에서 같은 언어를 쓸 때의 많은 이점으로 인해 수요는 늘어갔고, 이로 인해 탄생한 것이 ServerJS(CommonJS) 이다.
// 내보내기
module.exports = function add(a, b) { return a + b }
// 가져오기
const add = require("./add");
브라우저의 경우, 네트워크를 통해 모듈이나 라이브러리를 로드하기 떄문에 동기적 로딩은 웹페이지의 로딩 시간을 크게 증가시킬 수 있다.
규모가 클수록 더 많은 영향을 받았고, 브라우저 환경을 고려한 비동기로 동작하는 모듈 시스템 AMD가 탄생하게 되었다.
AMD 그룹은 브라우저 환경을 위한 브라우저 모듈의 표준을 만들고자 했으며, 자바스크립트 모듈과 의존성을 비동기적으로 로드하는 방법을 정의하는 개방형 표준을 공개했다. 이 표준을 기반으로 모듈 시스템을 위한 다양한 라이브러리가 탄생했다.
define을 통해 모듈을 정의하고, require을 통해 모듈을 비동기적으로 불러와 사용한다.자바스크립트 생태계가 점점 넓어지며, CommonJS와 AMD 모듈 시스템을 모두 지원해야 하는 상황이 생기게 되었고 두 모듈 방식을 좀 더 효율적으로 구성하기 위해 모듈 관리 패턴 UMD가 탄생하게 되었다.
(function (root, factory) {
if (typeof module === 'object' && module.exports) {
// CommonJS
module.exports = factory();
} else if (typeof define === 'function' && define.amd) {
// AMD
define([], factory);
} else {
// 브라우저 글로벌
root.myLibrary = factory();
}
}(this, function () {
return {
hello: function() { console.log("Hello!"); }
};
}));
모듈화를 위한 다양한 움직임 끝에 ECMAScripts2015 표준 명세에 ECMA Modules가 등장하며, 자바스크립트 자체 모듈 시스템을 사용할 수 있게 되었다.
// 내보내기
export function add (a, b) { return a + b }
// 가져오기
import { add } from "/add.js"
<script type=”module”>을 통해 직접 사용할 수 있다.“type”: “module”을 추가하면 된다.브라우저는 기본적으로 ESM만 인식한다.
따라서 다른 모듈 시스템을 제공하는 라이브러리를 사용하기 위해서는 ESM 형식으로 변환(트랜스파일) 해주는 과정이 필요하다.
이러한 작업은 보통 Webpack, Rollup 같은 번들러 도구들이 처리해준다.
웹 애플리케이션 개발에 필요한 HTML, CSS, JS 등의 모듈화된 자원들을 모아서, 하나 혹은 최적의 소수 파일로 결합(번들링)하는 도구이다.
개발자의 작업 효율성을 높이고, 브라우저 호환성이나 성능을 개선하는데 크게 도움을 준다.
요즘의 번들러는 단순히 파일을 묶는 기능 뿐만 아니라, 트랜스파일링 작업도 포함한 종합적인 빌드 도구로 발전했다. 이에 해당하는 예시로는 Webpack, Rollup 등이 있다.

대표적인 자바스크립트 번들러로, 많은 기능과 확장성으로 좀 더 복잡한 프로젝트에서도 효율적으로 모듈을 관리할 수 있도록 도와준다.
경량화와 번들 최적화를 중점에 둔 ES Module 번들러이다.
노드기반 번들러보다 10~100배 빠른 빌드를 제공하는 번들러이다.
소스 코드를 한 프로그래밍 언어에서 다른 프로그래밍 언어로 변환해주는 도구이다. 주로 최신 버전의 언어를 구형 버전의 언어로 변경하거나, 다른 언어로 변경하는데 사용된다.
자바스크립트를 대상으로 하는 트랜스파일러는 Babel, TSC, ESBuild 등이 있다.
대표적인 자바스크립트 트랜스파일러로, 최신 버전의 자바스크립트 코드를 오래된 버전의 자바스크립트 코드로 변환해주는 역할을 한다.
Speedy Web Compiler의 약자로, JS와 TS를 빠르게 트랜스파일링하는 도구이다.
지금은 대부분의 빌드 도구가 두 역할을 동시에 처리하기 때문에 옛날에 비해 트랜스파일러와 모듈러의 경계가 흐려졌다. 이제는 도구의 “정체성”보다는 “무엇을 해결해주는가(문법 변환? 모듈 결합? 최적화?)”를 중심으로 이해하는게 더 실용적이다.