
지난번 빌드 도구(CRA와 Vite)에 대한 질문을 GPT에게 물어보고 막연한 궁금증을 풀어보았다.
이번에는 모듈부터 빌드 도구 내에서 번들할 때 사용되는 다양한 번들러에 대해 알아보고자 한다.
웹팩은 흔히 알고 있는 모듈 번들러이다. 모듈 번들러란 무엇이고 어떤 문제를 해결하기위해 탄생하게 되었을까?
우선 모듈 번들러가 등장하기 전에는 다음과 같은 문제가 있었다.

// World 출력
스크립트가 순차적으로 실행될 때, 별개의 자바스크립트 파일에서 불러왔지만 변수이름이 충돌해 아래 파일(word.js)의 값으로 덮어 씌어진다. 스크립트를 분리해도, 파일을 분리해도 var로 선언된 word 변수는 전역 변수가 되기 때문이다.
각각의 변수를 독립적으로 사용할 수 없을까? 그래서 탄생한 것이 '모듈'이다.
모듈은 관련된 기능이나 변수, 클래스, 함수 등을 포함하고 있는 코드의 집합을 독립적인 단위로 사용하는 것을 말한다.
JavaScript ES6부터는 import와 export 키워드를 사용하여 모듈을 정의하고 가져올 수 있게 되었다. (ESM, ES6 Module)

// Hello World 출력
이처럼 각 파일 단위로 스코프를 제한하여 모듈 간의 이름 충돌을 방지할 수 있다.
이런 모듈의 기능은 최신 브라우저에만 탑재되어 있으며, 각각의 파일(모듈)별로 모두 불러와야 한다는 문제가 있다. (아래 이미지처럼 모듈 파일이 100개라면 100+번의 네트워크 통신을 해야한다.) 초기 로딩 속도가 저하되고 네트워크의 부하로 서비스 제공이 느려진다.

개발자들은 이러한 모듈을 하나로 합쳐서 제공하는 방법을 고민했고, 그렇게 탄생한 것이 바로 모듈 번들러이다.
뿐만 아니라
더 작은 용량의, 더 최적화된 리소스를 제공해주기,
흩어져 있는 여러 파일을 하나로 통합하고 문자를 압축시키기,
다양한 사용자 환경에서도 돌아가도록 코드를 변환하기,
안 쓰이는 소스코드 부분을 분석해서 제거하기,
...
웹사이트 전처리 요구사항이 점점 많아지면서 이를 자동화시켜줄 도구가 필요했다.
여기서 grunt glub 같은 도구가 하나 둘 등장하기 시작했고 마침내 webpack의 시대가 도래하게 되었다.

// 웹팩을 이용해 번들링한 파일을 네트워크 탭에서 확인하는 화면
이렇게 변환하는 과정은 생활코딩 - 4. 웹팩의 도입을 참고하면 된다.
브라우저 외의 환경(Node.js)에서 작동하도록 만들어진 모듈 시스템
비동기 모듈 로드에 대한 부분은 고려되지 않음
비동기 모듈 로드 지원
-> 시간이 지나면서 CommonJS와 AMD 사이에서 호환성 문제가 발생
<script type=’module” src=”app**.mjs**”></script>
기본적으로 strict mode 적용
모듈 스코프, export, import
그래서 모듈 번들러란,
- 의존성이 있는 여러개의 JS파일을 하나의 JS파일로 합쳐주는 도구
- 번들러 설정에 따라서 CSS나 이미지 파일 같은 것도 같이 취급할 수 있음
- Webpack, Parcel, Rollup, Browserify 등
2022 stateofjs 자료를 참고해보면 번들러의 생태계는 다음과 같다.

vite > esbuild > rollup > parcel > webpack
webpack부터 차례대로 살펴보자.
대표적인 자바스크립트 번들러로,
많은 기능과 확장성으로 좀 더 복잡한 프로젝트에서도 효율적으로 모듈을 관리할 수 있도록 도와줌
"어플리케이션 만들 땐 webpack으로, 라이브러리 만들 땐 rollup으로!"
ESBuild의 단점을 보완시킨 라이브러리,
Vue.js의 창시자인 Evan You가 만든 frontend build tool
전반적으로 esbuild로 성능을 극적을 끌어오고 rollup을 통해서 번들링의 유연성을 챙겼다고 볼 수 있음
- 개발 서버 구동 시간이 거의 0에 가까움
- 모든 CommonJS 및 UMD 파일을 ESM으로 불러올 수 있도록 변환함
- 별도의 설정이 없이 다양한 리소스 import 가능
- CSS 빌드 최적화
- Direct Import 구문에 대해 Preload 하도록 함으로써, 네트워크 비용 줄임
Webpack과 달리 별도의 구성 파일 없이 간단하게 사용할 수 있는 번들러로,
최소한의 구성(Zero config)을 지향
Parcel 공식문서
빌드 도구와 번들러
대표적인 빌드 도구 중 하나인 웹팩(Webpack)은 동시에 강력한 번들러로도 알려져 있다.
이렇게 빌드 도구와 번들러는 혼합하여 사용되어 혼란스러울 수 있다.
요약하자면, 빌드 도구는 웹 애플리케이션의 개발 및 빌드 과정에서 다양한 작업을 처리하는 도구들을 가리키는 상위 개념이고, 번들러는 빌드 도구의 일부로, 모듈 시스템을 관리하고 번들 형태로 애플리케이션을 묶어주는 일을 한다.
빌드 도구에 대해 자세히 알아보자.
: 웹 애플리케이션을 개발하기 위해 필요한 소스 코드와 자원들을 처리하고 변환
주요 구성요소에는 작업 실행기(태스크 러너), 번들러, 패키지 관리자, 개발 서버, 코드 린터 및 포맷터, 트랜스파일러 및 폴리핑이 있다.
: 여러 작업을 동시에 또는 순차적으로 조정하고 실행하여 반복적인 작업을 자동화 한다. 인기 있는 작업 실행기에는 Gulp와 Grunt가 있다. 이를 통해 개발자는 JavaScript로 사용자 정의 작업을 작성할 수 있으므로 더 나은 제어와 유연성이 가능하다. 작업에는 일반적으로 연결, 축소, 변환 및 린트가 포함된다.
grunt
minifying, 파일 통합, lint 적용 등 등록된 task를 순서대로 실행시켜 줌
설정이 파편화되고 개발자가 직접 컨트롤해야하는 영역이 많음
Gulp
grunt와 흡사한 task runner
다만 stream-based로 파일을 접근하기에 grunt에 비해 성능이 더 우수하다고 평가를 받고 있음
: 번들러는 종속성과 함께 애플리케이션 코드를 번들이라고 하는 단일 또는 여러 개의 최적화된 출력 파일로 패키징함. Webpack 및 Rollup과 같은 번들러는 종속성 그래프를 지능적으로 분석하여 최적화된 번들을 생성하여 HTTP 요청 수를 줄이고 성능을 향상시킴. 또한 코드 분할(지연 로딩), 트리 쉐이킹, 개발 중 애플리케이션 자동 다시 로드와 같은 기능도 제공
: npm 및 Yarn과 같은 패키지 관리자는 소프트웨어 패키지를 관리하고 배포하는 일을 담당. 패키지 종속성을 유지하고 버전 호환성을 보장하면서 패키지 설치, 업데이트 및 구성 프로세스를 단순화.
: 개발 중에 애플리케이션을 제공하기 위해 개발자의 컴퓨터에서 로컬로 실행되는 웹 서버. Browsersync, webpack-dev-server 및 Live Server는 자동 재로딩, 핫 모듈 교체(HMR), 심지어 여러 브라우저와 장치에 걸친 동기화 테스트와 같은 기능을 제공하여 전체 개발 프로세스를 더욱 효율적으로 만드는 인기 있는 개발 서버.
: ESLint 및 Stylelint와 같은 코드 린터는 일관된 코딩 스타일을 적용하고 잠재적인 오류가 프로덕션 환경에 적용되기 전에 이를 포착하는 데 도움이 됨. Prettier와 같은 포맷터는 소스 코드의 형식을 자동으로 지정하여 일관성을 더욱 보장하고 가독성을 향상시킴.
: Babel, swc과 같은 트랜스파일러는 최신 JavaScript 구문을 대부분의 브라우저에서 널리 지원되는 동등한 이전 구문으로 변환함. 이를 통해 개발자는 브라우저 호환성을 손상시키지 않고 최신 기능과 개선 사항을 사용하여 코드를 작성할 수 있음. Polyfill은 이전 브라우저에서 기본적으로 지원되지 않는 기능의 대체 구현을 제공하여 다양한 브라우저와 장치에서 일관된 사용자 경험을 보장.
CRA와 Vite 차이에 대해 공부하면서 Webpack, Rollup에 대해 알아야 했고, 핫 모듈 교체(Hot Module Replacement, HMR)라는 용어를 접하게 되었다. 번들과 빌드 도구는 다른 개념으로 알고 있었는데 자꾸 혼용되는 부분에서 헷갈려서 처음부터 끝까지 파헤쳐 정리하게 되었다. 이참에 모듈에 대한 내용도 복습하면서 ESM을 이용한 번들링으로 빠른 성능을 지원하는 Vite를 사용해야 하는 이유를 짚어볼 수 있었다. 전반전인 생태계를 훑어봤으니 이제 Vite에 대해 톺아볼까?