이번 프로젝트에서 늘 사용하던 CRA가 아닌 Vite를 사용해보았다. Vite가 개발 서버 구동이 빠르다는 것과 리액트마저 CRA 대신 Vite를 추천할 정도라 사용하긴 했지만 구체적으로 어떤 원리에서 빠르다고 하는건지 알지는 못했다.
CRA(Create-React-App) 보다는 Vite 를 사용하는건 어떨까? 글을 읽었지만 'Esbuild(Go lang 으로 만들어짐)기반', 'production 빌드시에는 Rollup 을 사용하여 빌드' 등 처음 보는 용어가 많아 와닿지 않았다.
그래서 일단 ChatGPT v3.5 심층 면접으로 CRA와 Vite에 대한 막연한 궁금증을 해결해 보았다.
cra와 비교해서 vite를 사용하는 이유에 대해 설명해 주세요
Vite와 Create React App(CRA)은 모두 프론트엔드 개발 환경을 구성하기 위한 도구이지만, 몇 가지 주요 차이점이 있습니다.
이러한 이유로 인해, 특히 개발 서버 시작 시간, HMR 속도, Vue.js 지원 등을 중요하게 생각하는 개발자들이 Vite를 선택할 수 있습니다. 하지만 CRA도 그 자체로 매우 강력한 도구이며, 많은 커뮤니티와 예제 코드를 제공하므로, 어떤 도구를 선택할지는 프로젝트의 요구사항과 개인의 선호에 따라 달라질 수 있습니다.
'Vite는 Rollup을 사용하여 빌드해서 빠르다' 라는 말이 어떤건지 잘 모르겠어요
먼저, Rollup이라는 것은 JavaScript 모듈 번들러입니다. Webpack과 비슷한 역할을 하지만, 라이브러리와 애플리케이션의 번들링에 특화되어 있습니다.
Vite가 Rollup을 사용하면서 빌드 속도가 빠르다는 것은, Rollup의 특징과 Vite의 동작 방식 때문입니다.
Rollup의 특징: Rollup은 코드를 가능한 한 작은 번들로 만들기 위해 'tree-shaking'이라는 기법을 활용합니다. 이는 사용되지 않는 코드를 제거함으로써 최종 번들의 크기를 줄이고, 따라서 로딩 시간을 단축시키는 효과가 있습니다.
Vite의 동작 방식: Vite는 개발 모드에서는 모듈을 동적으로 변환하고, 빌드 시에만 Rollup을 사용합니다. 이렇게 함으로써 Vite는 개발 과정에서 빠른 HMR을 제공하면서, 빌드 시에는 Rollup을 통해 효율적인 번들을 생성합니다.
이 두 가지 조합이 Vite의 빌드 속도를 빠르게 만드는 주요 요인입니다. 이 외에도 Vite와 Rollup은 모두 ES 모듈 기반으로 작동하므로, 브라우저의 네이티브 모듈 시스템을 최대한 활용하여 성능을 향상시킵니다.
'Vite는 개발 과정에서 빠른 HMR을 제공한다'는 말이 어떤건지 잘 모르겠어요.
HMR은 Hot Module Replacement의 약자로, 웹 애플리케이션을 실행하는 동안 실시간으로 모듈을 업데이트하고 적용하는 기능을 말합니다. 이 기능은 웹 페이지를 새로고침하지 않고도 코드 변경 사항을 즉시 확인할 수 있게 해주어 개발 효율성을 크게 향상시킵니다.
Vite가 빠른 HMR을 제공한다는 것은, Vite가 코드 변경 사항을 감지하면 해당 모듈만을 즉시 재컴파일하고 브라우저에 전달하여 적용한다는 것을 의미합니다. 이는 전체 애플리케이션을 재컴파일하거나 페이지를 새로고침하는 것보다 훨씬 빠르기 때문에, 개발 과정에서 시간을 절약할 수 있습니다.
또한, Vite는 개발 모드에서 모듈을 동적으로 변환하기 때문에, 변경된 모듈만을 재컴파일하고 브라우저에 즉시 전달할 수 있습니다. 이는 Vite가 HMR을 빠르게 처리하는 또 다른 이유입니다.
첫 번째 질문에 대한 답변에서 '환경 설정: CRA는 설정이 모두 미리 구성되어 있어 편리하지만, 사용자 정의 설정을 추가하려면 eject 과정을 거쳐야 합니다. 반면 Vite는 사용자 정의 설정을 쉽게 추가할 수 있습니다.' 라고 했는데 사용자 정의 설정이 필요한 예시를 알려주세요
사용자 정의 설정이 필요한 경우는 여러 가지가 있습니다. 아래에 몇 가지 예시를 제시해 보겠습니다.
웹팩 설정 변경: Create React App (CRA)은 웹팩을 기반으로 동작합니다. 하지만 CRA는 내부적으로 웹팩 설정을 감추고 있어, 이를 변경하려면 eject 과정이 필요합니다. 웹팩 설정 변경이 필요한 경우는 다음과 같습니다.
◦ 특정 파일 형식에 대한 로더(loader) 설정 변경
◦ 플러그인 추가
◦ 번들링 최적화 설정 변경
환경 변수 설정: 프로젝트가 실행될 환경에 따라 다른 설정값을 사용해야 할 때, 이를 환경 변수로 관리하곤 합니다. 이 경우에도 CRA는 기본적으로 제공하는 환경 변수 외에 추가적인 환경 변수를 설정하려면 eject가 필요합니다.
Babel, ESLint 설정 변경: CRA는 Babel과 ESLint 설정도 기본적으로 제공합니다. 그러나 특정 Babel 플러그인을 사용하거나, ESLint 규칙을 사용자가 원하는 대로 변경하려면 이 또한 eject 과정이 필요합니다.
위 예시와 같이 사용자 정의 설정이 필요한 경우는 프로젝트의 요구사항이나 개발환경에 따라 다양합니다. Vite 같은 도구를 사용하면 이러한 설정을 보다 쉽게 추가할 수 있습니다.
'CRA는 기본적으로 제공하는 환경 변수'에는 어떤게 있나요?
Create React App(CRA)은 기본적으로 다음과 같은 환경 변수를 제공합니다.
환경 변수를 사용하면 서버 주소, API 키 등의 설정을 소스 코드 외부에서 관리할 수 있어, 보안성을 높이고, 다른 환경에서 애플리케이션을 실행할 때에도 손쉽게 설정을 변경할 수 있습니다.
cra를 사용하면 eject를 이용해 eslint, prettier를 커스텀해야한다고 했는데, eject를 사용하지 않고도 설정을 할 수 있지 않나요?
네, 맞습니다. CRA에서는 eject를 하지 않고도 ESLint나 Prettier와 같은 도구의 설정을 커스텀하는 것이 가능합니다.
ESLint의 경우, 프로젝트의 루트 디렉토리에 .eslintrc 파일을 생성하고 여기에 필요한 설정을 작성하면 됩니다. CRA는 이 파일을 자동으로 인식하여 해당 설정을 적용합니다.
Prettier 역시 마찬가지로, 프로젝트의 루트 디렉토리에 .prettierrc 파일을 생성하고 설정을 작성하면 됩니다. Prettier는 이 설정 파일을 인식하여 코드 포맷팅을 수행합니다.
하지만 주의할 점은, CRA가 기본적으로 제공하는 ESLint 설정이나 웹팩 설정 등을 직접 변경하려는 경우에는 eject가 필요하다는 것입니다. 이 경우에는 CRA의 내부 설정을 직접 수정해야 하기 때문에, 이를 위해 CRA는 eject라는 과정을 제공합니다.
'CRA가 기본적으로 제공하는 ESLint 설정이나 웹팩 설정 등을 직접 변경하려는 경우에는 eject가 필요하다'고 했는데 직접 변경해야하는 경우의 예시를 알려주세요
CRA의 기본 설정을 직접 변경해야 하는 몇 가지 예시는 다음과 같습니다:
이렇게 CRA와 Vite의 전반적인 비교와 CRA에 대한 추가적인 궁금증까지 해소해 보았다. 여기서 모듈 번들링을 ES 모듈을 사용하는 것과 그렇지 않은 점, HMR 용어, Rollup을 사용하여 빠르게 빌드 된다는 의미 등을 추가적으로 공부하고 정리해보고자 한다. 전반적인 빌드 도구 생태계와 용어부터 공부한 뒤 다시 돌아와 읽어보면 고개를 끄덕이며 읽어나갈 수 있지 않을까?