Grunt or Gulp vs Webpack 의 차이 - ipadorusa/sri-vuejs GitHub Wiki
궁금한점 어떻게 보면 grunt나, gulp에서 하는것들이 webpack에서도 이루어질수 있는데 왜??? 그렇다면 module bundler 라고 안했을텐데..모듈이라는말에 집중해야하나?
일단 [엑소버드][https://perfectacle.github.io/] 님이 주신 답변 정리로 이해 해 보자.
소스 코드에 있는 공백들을 소스가 돌아갈 수 있는 수준에 한해서 모두 없애기. (minify)
- js 파일에 있는 변수명을 최대한 짧게 하기. (난독화, uglify)
- 이미지 파일을 압축시키기. 등등등
- 이를 통해 로딩 속도 단축, 모바일 사용자의 데이터를 절약시켜줄 수 있어서 최적의 UX를 제공해줄 수 있습니다.
그런데 이러한 작업들을 하는 방법은 굉장히 많습니다.
직접 손으로 공백을 제거할 수도 있고, 웹사이트를 이용해서 줄일 수도 있고, CLI를 이용해서 줄일 수도 있습니다.
하지만 이러한 작업들을 일일이 사람 손으로 하기에는 비효율적이므로 자동으로 해주는 task runner를 이용하는 것입니다.
- 그리고 웹팩은 단순 번들러가 아니라 '모듈' 번들러입니다.
http 1.1 표준 스펙에는 하나의 요청에 하나의 응답이 가능합니다.
따라서 여러 개의 js 파일을 서비스하려면 여러 개의 요청이 필요합니다.
그에 따라서 요청과 응답에 따른 오버헤드가 발생하고 이는 곧 기업 입장에서는 하나의 비용에 포함됩니다.
사용자에게 최적의 UX를 제공하지 못하고, 로딩 시간이 지연되므로 유저가 이탈할 가능성이 조금이라도 높아지죠.
따라서 이러한 파일을 하나로 합치는 것(번들링)입니다.
그럼 task runner의 concat(js나 css 파일을 하나로 합치는 플러그인)과 다른 게 무엇이냐... 라고 한다면
바로 '모듈'을 지원한다는 것입니다.
이 '모듈'의 의미는 A 파일의 모듈(하나의 함수, 변수, 클래스 등등)을 B 파일에 삽입이 가능하다 정도로 보시면 될 것 같습니다. 자바스크립트는 스코프를 전부 공유하는데 반해 이렇게 모듈 단위의 스코프를 지니게 되는 거죠.
- 물론 웹팩에서도 위의 Task runner에서 지원하는 minify, uglify 등등의 기능을 지원하므로 저는 거의 웹팩만 씁니다. 물론 Task runner가 필요한 특수한 상황(API 서버와 static 서버를 분리해야할 때 등등)에는 gulp나 grunt를 쓰곤 합니다.
- 1. Code Splitting(코드 분할)
- 1-1. 변경률이 적은 서드파티(제이쿼리, 리액트 등등의 라이브러리나 프레임워크)들을 따로 빼서 사용자의 임시 파일에 저장시켜놓고 방문할 때마다 해당 내용을 캐싱하게 끔 해서 좀 더 로딩 속도를 높이기.
- 1-2. SPA라고 해도 사용자가 모든 URI를 방문하는 게 아니니 URI 별로 소스 코드를 빼기.
- 1-3. 그런데 URI 별로 소스 코드를 빼도 파일의 크기가 너무 작은 경우에는 오히려 요청/응답에 대한 오버헤드가 클 수 있으므로 소스 코드의 최소한의 크기 정하기.
- 2. Tree Shaking(나무의 가지를 흔들어 썩은 열매를 떨어뜨리 듯, 필요없는 코드들을 삭제하기)
쓰지 않는 코드(변수 함수 등등)들이 있는 경우에 자동으로 번들링 할 때는 없애기.
- 3. 파일의 크기가 작은 경우에는 Data URL로 리소스를 표현하기(폰트, 이미지, svg 등등)
- 웹팩에서는 js 소스만 모듈로 보는 게 아니라 정적인 리소스들(이미지, 폰트, svg 등등)을 모두 모듈로 보고 있습니다.
그래서 이 모듈(정적인 리소스)들을 컨트롤 할 수 있게 되는 거죠.
그런데 이미지 크기가 너무 작은 경우에는 요청/응답에 대한 오버헤드를 줄이기 위해 sprite image를 이용할 수도 있고, Data URL을 이용할 수도 있습니다.
하지만 sprite image를 만드는 것은 귀찮고 사용하기도 불편할 때가 있죠. (이를 위한 플러그인들도 많지만)
그래서인지 모던 브라우저에서는 이런 Data URL을 통해서도 그런 오버헤드를 줄일 수 있겠죠.
- 등등이 많은데 이는 Task runner에서는 지원하지 않죠, 오로지 모듈들을 번들링하는 데 최적화 된 모듈 번들러에서만 지원하는 기능이죠. Task runner는 모듈들 사이의 관계를 모르니 이러한 행위를 할 수가 없죠.