프론트엔드 개발은 모듈 단위
로 파일을 엮어서 개발하는 방식으로 진행된다.
모듈은 서로 의존성을 띄고 있기 때문에 다음과 같은 문제점이 발생할 수 있다.
위의 문제점을 해결하기 위해 모듈 번들러가 등장하게 되었다.
Module(분리된 코드 조각) + Bundler(묶는다)
코드조각
들을 하나로 병합
하는 개발 도구이다.여러 리소스를 하나로 결합
하여 단일 파일
로 만드는 것이다.하나의 단일 파일
을 로드함으로써 애플리케이션이 작동하게 된다.WebPack은 Entry 포인트를 시작으로, 의존적인 모듈을 전부 찾아내 하나의 파일로 번들링을 한다.
- 여러개로 나눠진 자바스크립트 파일을 html이 실행할 수 있는 하나의 자바스크립트 파일로 합쳐준다!
Babel은 최신 ES6+ 버전을 구버전인 ES5로 변환해주는 JS 트랜스파일러이다.
ES5에서는 JS 모듈을 지원하지 않아, ES6에서는 JS 내에서도 모듈을 지원하도록 하였다.
하지만 ES6 버전을 지원하지 않는 브라우저들이 존재한다.
따라서 모듈을 사용하기 위해, ES6 문법을 사용하기 위해 Babel을 사용하여 구버전으로 변환을 해주는것이 필요하다.
Webpack과 같은 번들러의 등장은 JS에 존재하지 않는 모듈 시스템의 문제점을 해결했지만 속도의 문제점을 가지게 되었다. 그 이유는 여러 JS파일을 하나로 항상 만들어줘야 하기 때문에 코드 수정이 있을 때마다 새롭게 빌드가 필요했고 프로젝트가 커지면 커질수록 자바스크립트 파일이 많아져 빌드에 필요한 시간이 오래 걸리게 되었다.
이러한 문제점을 해결하기 위해 새로운 도구로 ESBuild가 등장하게 된다. ESBuild는 기존 번들러들의 속도보다 100배 이상 빠른 빌드 속도를 가졌다. 이렇게 빠른 속도를 가지고 있는 이유는 JS를 기반으로 만들어진 기존 번들러들과 달리 Go 언어로 작성되어 빠른 빌드가 가능했기 때문이었다. 하지만 번들러로써만 사용되는 것이 아니라 HMR, code splitting 과 같은 기능들이 종합적으로 제공되던 Webpack이었기 때문에 복잡한 어플리케이션에서 ES Build가 대체할 수는 없었다.
Vite는 프랑스어로 빠르다 라는 뜻을 가진 단어로, 빌드와 개발 서버 구동시간이 매우 빠르다.
웹이 발전하게 되며 브라우저 자체에서 ESM (ES Modules)가 추가되었으며, Go 언어의 병렬 처리로 높은 성능을 가진 ESBuild와 브라우저에서 지원해주는 ESM을 이용해 Vite가 탄생하게 되었다.
기존 Webpack과 같은 모듈 번들러를 이용할 때는, 모듈 번들링을 끝낸 후 개발 서버를 구동하므로 시간이 오래 걸렸다. 하지만 Vite는 Native ESM
이라는 브라우저의 자체적인 모듈 기능을 사용하여 이와같은 문제점을 해결했다.
Webpack
: 소스 코드와 모든 종속 관계의 모듈을 번들링 한 후 서버가 준비.
Vite
: esbuild로 미리 번들링한 모듈을 필요할 때 동적으로 가져오기 때문에 즉각적으로 서버가 구동.
Vite는 개발 서버 구동을 빠르게 반영하기 위해
dependencies
와source code
로 구분해 개발 서버를 시작한다.
개발 시 내용이 바뀌지 않을 소스 코드를 의미한다.
dependency의 코드는 ESBuild로 사전 번들링을 진행한다.
기존의 번들로러는 컴포넌트 라이브러리와 같이 몇 백개의 모듈을 갖고 있는 경우, 번들링 과정이 매우 비효율적이고 많은 시간을 필요로 했지만, Vite는 사전 번들링 기능을 통해 해결했다.
즉 ESM은 요청받은 모듈만 전달하기 때문에 훨씬 빠르게 개발 서버에 반영이 가능하다.
Vite는 ES Build와 브라우저의 ESM을 이용한 번들링으로 기존 CRA의 WebPack보다 빠른 성능을 가진다.