이제 취업 준비를 하다보면 공고에서 이런 글을 확인할 수 있을 것입니다.
webpack, esbuild 등
모듈 번들러
활용 경험이 있는 분
Babel을 이용한 ES6+ 스펙의 사용 경험이 있는 분
또 쉽게 우리는 React 앱을 시작할 때, create-react-app 이라는 명령어를 통해 시작하죠? 이 때 webpack, babel이 자동으로 설치됩니다. Vue도 마찬가지에용. vue-cli를 통해 설치하면 webpack, babel이 자동으로 설치됩니다.
💡 학습 목표 : 바벨과 웹팩이 뭔지 알고 가시길!
💡 webpack: 모던 Javascript 애플리케이션을 위한 정적
모듈 번들러
(webpack 정의)
Webpack: 여러 개의 파일들을 하나로 묶어주는 번들러
모듈
로 보고 이를 병합해서 하나의 결과물을 만드는 도구<!-- index.html -->
<html>
<head>
<!-- ... -->
</head>
<body>
<!-- ... -->
<script src="./app.js"></script>
<script src="./main.js"></script>
<script>
getNum(); // main.js의 var num 값이 출력됨
</script>
</body>
</html>
but, 하나의 파일로 모듈화된 파일들을 요청하게 되면 첫 로딩시 속도가 너무 느려질 수 있음
→ Code Splitting, 캐시 등의 방법으로 문제를 해결한다고 함
Code Splitting
웹팩에서 번들링 한 코드를 분할하고, 요청에 따라 로드할 수 있도록 해주는 방법
💡 Babel: Javascript compiler
Babel: 입력된 코드를 Javascript로 변환해주는 트랜스파일러
모든 브라우저가 최신 문법, 기술(ES6)을 지원하는 것은 아니기 때문에 구 기능(ES5)으로 변환하는 작업이 필요
[1, 2, 3].map(n => n ** n);
// ES5
"use strict";
[1, 2, 3].map(function (n) {
return Math.pow(n, n);
});
Transform syntax 구문 변환
JSX and React
import React from 'react';
Webpack 설치 및 초기 설정
1-1. npm 초기화
npm init -y
//package.json
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
1-2. 로컬에서 webpack, webpack-cli (커맨드-라인에서 webpack을 실행할 때 사용되는 도구) 설치
npm install webpack webpack-cli --save-dev
devDependecies에 아래와 같이 추가됨
//package.json
{...,
"devDependencies": {
"webpack": "^5.87.0",
"webpack-cli": "^5.1.4"
}
}
번들 생성
npm i lodash
<html>
<head>
<title>Webpack Demo</title>
<script src="https://unpkg.com/lodash@4.16.6"></script>
</head>
<body>
<script src="src/index.js"></script>
</body>
</html>
function component() {
var element = document.createElement('div');
/* lodash is required for the next line to work */
element.innerHTML = _.join(['Hello','webpack'], ' ');
return element;
}
document.body.appendChild(component());
**웹팩 빌드를 위한 구성 및 빌드**
import _ from 'lodash';
<html>
<head>
<title>Webpack Demo</title>
<!-- <script src="https://unpkg.com/lodash@4.16.6"></script> -->
</head>
<body>
<!-- <script src="src/index.js"></script> -->
<script src="dist/main.js"></script>
</body>
</html>
package.json
파일에 아래 내용 추가"scripts": {
"build": "webpack --mode=none"
}
npm run build
명령어 실행npm run build
> test@1.0.0 build
> webpack --mode=none
asset main.js 536 KiB [emitted] (name: main)
runtime modules 1.25 KiB 6 modules
cacheable modules 532 KiB
./src/index.js 268 bytes [built] [code generated]
./node_modules/lodash/lodash.js 531 KiB [built] [code generate
정상 빌드 됨 → dist 폴더 가 생성되고 해당 폴더 안에 main.js라는 파일의 결과물이 생김
webpack.config.js
가 있으면 webpack은 이 파일을 기본으로 작동webpack.config.js
파일 생성 후 아래 내용 추가// webpack.config.js
// `webpack` command will pick up this config setup by default
var path = require('path');
module.exports = {
mode: 'none',
entry: './src/index.js',
output: {
filename: 'main.js',
path: path.resolve(__dirname, 'dist')
}
};
entry
: 웹팩이 빌드할 파일의 시작 위치
: default [./src/index.js]
output
: 웹팩에 의해 생성된 번들을 내보낼 위치와 이름 지정
: default [./dist/main.js]
module
loaders
: JS가 아닌 파일들도 유효한 모듈로 변환
plugins
: 번들화된 JS를 난독화하거나 특정 텍스트를 추출
: 번들된 css, js 파일들을 html 파일에 주입(html-webpack-plugin 사용)하는 역할
: 번들을 최적화하거나, asset을 관리하고, 또 환경 변수 주입등과 같은 광범위한 작업 수행
mode
: production(최적화 빌드), development(빠른 빌드), none(그냥 빌드)
: 웹팩 설정 모드로 3가지 중 선택 가능
NPM Scripts
"scripts": {
"build": "webpack"
}
npm run build 정상 작동
npm run build
> test@1.0.0 build
> webpack
asset main.js 536 KiB [compared for emit] (name: main)
runtime modules 1.25 KiB 6 modules
cacheable modules 532 KiB
./src/index.js 268 bytes [built] [code generated]
./node_modules/lodash/lodash.js 531 KiB [built] [code generated]
webpack 5.87.0 compiled successfully in 116 ms
npm install --save-dev @babel/core @babel/cli @babel/preset-env
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"edge": "17",
"firefox": "60",
"chrome": "67",
"safari": "11.1"
},
"useBuiltIns": "usage",
"corejs": "3.6.5"
}
]
]
}
아래 코드를 package.json에 적용한 후, npm run compile
을 터미널에 입력
npm run compile
> test@1.0.0 compile
> babel src -d dist
Successfully compiled 1 file with Babel (210ms).
import _ from "lodash";
function component() {
var element = document.createElement("div");
const a = () => {
console.log("a");
};
/* lodash is required for the next line to work */
element.innerHTML = _.join(["Hello", "webpack"], " ");
return element;
}
document.body.appendChild(component());
"use strict";
var _lodash = _interopRequireDefault(require("lodash"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function component() {
var element = document.createElement("div");
const a = () => {
console.log("a");
};
/* lodash is required for the next line to work */
element.innerHTML = _lodash.default.join(["Hello", "webpack"], " ");
return element;
}
document.body.appendChild(component());
plugin 사용하여 코드 변환 수행하기
npm install --save-dev @babel/plugin-transform-arrow-functions
babel.config.json
파일에 도 설정{
"presets": [
...
],
"plugins": ["@babel/plugin-transform-arrow-functions"] // 추가
}
이제는 화살표 함수도 선언형 함수 형태로 컴파일 해줄 수 있다.
"use strict";
var _lodash = _interopRequireDefault(require("lodash"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function component() {
var element = document.createElement("div");
const a = function a() {
console.log("a");
};
/* lodash is required for the next line to work */
element.innerHTML = _lodash.default.join(["Hello", "webpack"], " ");
return element;
}
document.body.appendChild(component());
한 줄 요약
💡 웹팩은 자바스크립트 어플리케이션을 위한 모듈 번들러!
바벨은 자바스크립트 컴파일러! (or 트랜스파일러)
참고
webpack
Babel · Babel
웹팩이 필요한 이유 | 웹팩 핸드북
Babel 직접 적용하며 이해하기