김사람 블로그
thumbnail
ChatGPT와 함께: webpack, Babel, Flow
ChatGPT / React
2023.02.25.

ChatGPT를 이용하면 흩어진 지식들을 모으고 서로 연결하기 좋습니다.

이해에 필요한 맥락, 전체적인 흐름을 파악하는 데 정말 유용한 것 같습니다.

간혹 옳지 않은 답을 당당하게 말하는 경우가 있으니 그 점 유념하며 검증이 필요하기도 합니다.

아래는 ChatGPT를 이용해 얻은 webpack, Babel, Flow에 관한 정보들을 정리한 것입니다.


webpack에 대해 알려줘.

webpack은 웹 어플리케이션을 위한 모듈 번들러(module bundler)입니다.


webpack의 기능

  • 모듈 번들링: 의존성이 있는 모듈들을 모두 찾아서 하나의 파일로 묶어줍니다.

  • 로더(Loader): 다양한 유형의 리소스를 모듈로 로딩할 수 있도록 로더를 제공합니다. 예를 들어, CSS 파일을 로딩하기 위해서는 style-loader와 css-loader를 사용할 수 있습니다.

  • 번들 최적화: 번들 최적화를 통해 자바스크립트 파일의 크기를 최소화하고, 불필요한 코드를 제거하여 로딩 속도를 향상시킵니다.

  • 개발 서버: webpack-dev-server를 이용하여 변경사항을 실시간으로 반영하며, 개발 서버에서 바로 결과를 확인할 수 있습니다.


모듈 번들링의 이점이 뭐야?

모듈 번들링의 이점

  • 파일 크기 감소: 각 파일에서 중복되는 코드가 제거되어 전체 번들의 크기가 줄어들어 웹 페이지의 로딩 속도를 향상시키는 효과를 가져올 수 있습니다.

  • 모듈 관리 용이성: 모듈 번들러는 파일 간 종속성을 자동으로 추적하고 관리합니다. 이를 통해 개발자는 모듈 간 의존성을 명시적으로 설정하지 않아도 됩니다.


모듈 번들링 과정을 알려줘.

모듈 번들링 과정

  1. Entry Point 설정: webpack.config.js 파일에서 entry 프로퍼티를 설정하여 어플리케이션의 진입점을 설정합니다. 보통은 JavaScript 파일이지만, CSS, HTML 등도 가능합니다.

  2. 모듈 로딩: 설정한 entry 파일에서 시작하여, 필요한 모듈을 로딩합니다.

  3. 로더 적용: 모듈 로딩 후에는, 설정한 로더들을 사용하여 모듈의 내용을 변환합니다. 예를 들어, babel-loader를 사용하여 ES6 코드를 ES5로 변환하거나, css-loader를 사용하여 CSS 파일을 모듈로 변환합니다.

  4. 플러그인 적용: 플러그인을 사용하면 로더로는 처리하기 어려운 작업을 수행할 수 있습니다. 예를 들어, HtmlWebpackPlugin은 HTML 파일을 생성하고, CleanWebpackPlugin은 빌드 이전 결과물을 삭제합니다.

  5. 번들링 결과물 생성: 이 결과물은 하나 이상의 JavaScript 파일로 구성됩니다. 보통은 하나의 파일로 생성하지만, 코드 스플리팅을 사용하여 여러 개의 파일로 생성할 수도 있습니다.

  6. 렌더링: 생성된 번들링 결과물을 사용하여 웹 페이지를 렌더링합니다. 이때, script 태그로 번들링된 JavaScript 파일을 로드합니다.


webpack의 번들 최적화 과정을 알려줘.

번들 최적화 과정

  1. 코드 스플리팅: 웹 어플리케이션의 초기 로딩 시간을 줄이기 위해 사용되는 기술입니다. webpack에서는 import()나 require.ensure()와 같은 함수를 사용하여 코드를 분리할 수 있습니다. 코드 스플리팅을 적용하면, 사용자가 어플리케이션을 처음 로딩할 때 필요한 코드만 먼저 로드하고, 이후에 필요한 코드는 필요할 때 로딩합니다.

  2. 트리 쉐이킹: 사용하지 않는 코드를 제거하는 기술입니다.

  3. 압축: JavaScript 코드를 압축합니다. 이는 코드의 크기를 줄여 로딩 속도를 향상시키는 데 도움이 됩니다.

  4. 캐싱: 내용이 변경되지 않은 파일은 변경하지 않고, 이전에 생성한 파일을 그대로 사용하여 로딩 속도를 향상시킵니다. 이를 위해 파일마다 고유한 해시 값을 생성하여 파일 이름을 바꾸는 등의 작업을 수행합니다.


Babel에 대해 알려줘.

Babel의 기능

  • 자바스크립트 코드 변환: ES6 이상의 자바스크립트 코드를 ES5 이하의 버전으로 변환하여 최신 자바스크립트 문법을 지원하지 않는 구형 브라우저에서도 코드를 실행할 수 있습니다.

  • JSX 변환: JSX는 JavaScript 코드 내부에 HTML 코드를 포함할 수 있는 문법으로, 이를 JavaScript 코드로 변환하여 브라우저에서 렌더링할 수 있습니다.

  • Flow 지원: Facebook에서 개발한 Flow라는 타입 검사 도구를 지원하기 위한 플러그인을 제공합니다. Flow로 작성된 코드를 Babel이 ES5 이하 버전의 코드로 변환하기 전에 타입 검사를 수행하여 오류를 발견할 수 있습니다.


Flow에 대해 알려줘.

Flow는 Facebook에서 개발한 정적 타입 검사 도구입니다. JavaScript 코드에 타입을 명시하여 코드의 안정성을 높이는 것을 목적으로 합니다. Flow는 타입 추론 알고리즘을 사용하여 코드에서 예상되는 타입을 추론하고, 코드 내부에서 발생하는 타입 오류를 검출할 수 있습니다.

Create React App(CRA)는 기본적으로 Flow를 지원합니다. 따라서, CRA를 사용하여 React 애플리케이션을 생성하면, Flow를 자동으로 설치하고 설정해줍니다.


TypeScript type 문법과 비슷한데, TypeScript와 Flow의 차이점이 뭐야?

TypeScript와 JavaScript + Flow의 차이점

  1. 타입 시스템: TypeScript는 정적 타입 검사를 위한 내장 타입 시스템을 가지고 있습니다. 반면에, JavaScript + Flow는 Flow라는 별도의 정적 타입 검사 도구를 사용합니다.

  2. 문법: TypeScript는 JavaScript의 슈퍼셋(Superset)이기 때문에, JavaScript 코드를 거의 그대로 TypeScript 코드로 변환할 수 있습니다. 반면에, JavaScript + Flow는 JavaScript와 유사한 문법을 가지지만, Flow의 타입 주석(annotation) 문법을 추가해야 합니다.

  3. 생태계: TypeScript는 Microsoft에서 주도하는 프로젝트이며, 매우 큰 생태계를 가지고 있습니다. 반면에, JavaScript + Flow는 Facebook에서 주도하는 프로젝트이며, TypeScript보다는 작은 생태계를 가지고 있습니다.

  4. 컴파일러: TypeScript는 tsc라는 컴파일러를 사용하여 TypeScript 코드를 JavaScript 코드로 변환합니다. 반면에, JavaScript + Flow는 Babel과 함께 사용하여 JavaScript 코드를 Flow가 붙은 JavaScript 코드로 변환하고, 이후 Flow를 사용하여 타입 검사를 수행합니다.

  5. 타입 검사: TypeScript는 내장 타입 시스템을 사용하기 때문에, 타입 검사 성능이 빠릅니다. 반면에, JavaScript + Flow는 Flow가 제공하는 타입 검사 도구를 사용하기 때문에, 타입 검사 성능이 느릴 수 있습니다.


참고 링크

JavaScript Thread & Event Loop
← 다음 글
NAEFLIX
이전 글 →
We can love completely without complete understanding.
- Norman Maclean, A River Runs Through it.