웹팩은 기본적으로 모듈을 지원하고 파일 분할 기능(원하는 코드만 따로 분리해서 하나의 파일로 압축이 가능하다), css loader기능, jsx변환 작업도 해준다.
여러개로 나눠진 자바스크립트 파일을 html이 실행할 수 있는 하나의 자바스크립트 파일로 합쳐준다.
웹팩은 여러개 파일을 하나로 합쳐주는 모듈 번들러이다.
그렇다면, 왜 웹팩을 사용할까??
많은 파일들을 다운받아와야 해 네트워크 부하가 커지고 느려지고,
같은 이름의 변수나 함수로 충돌 가능성이 있다.
->해결 위해 번들러 등장
번들러를 사용하면 여러개 파일을 하나로 묶어주기 때문에 네트워크 접속의 부담을 줄여 더 빠른 서비스를 제공할 수 있다.
대표적인 트랜스파일러로는 '바벨'이 있다.
트랜스파일링이란 특정 언어로 작성된 코드를 비슷한 다른 언어로 변환시키는 것이다. 이를 해주는 것이 트랜스파일러이다.
트랜스파일링이 왜 필요할까?
모든 브라우저가 ES6의 기능(최신기능)을 제공하지 않기 때문에 ES5코드(구기능)으로 변환시키는 과정이 필요하기 때문이다.
적용하고자 하는 폴더에 webpack과 webpack-cli를 설치해준다.
npm init
npm i react react-dom
npm i -D webpack webpack-cli //D는 develop환경에서만 쓰인다는 것
바벨설치
npm i -D @babel/core @babel/preset-env @babel/preset-react babel-loader
babel-loader는 바벨이랑 웹팩을 연결해준다.
preset-env는 자동으로 옛날 브라우저들을 지원해준다.
const React = require('react');//npm에서 react 불러와주기
const {Component} = React;
class WordRelay extends Component {
state = {
text:'Hello, webpack',
};
render(){
return <h1>{this.state.text}</h1>
}
}
module.exports = WordRelay;
//쪼갠 컴포넌트를 외부에서도 사용 가능하도록 만들어줌
const React = require('react');
const ReactDom = require('react-dom');
//필요한 것만 가져와
const WordRelay = require('./WordRelay');
ReactDom.render(<WordRelay/>,document.querySelector('#root'));
client.jsx파일에 WordRelay.jsx파일을 합쳐줌.
const path = require('path');
module.exports = {
name: 'wordrelay-setting',
mode: 'development', //실서비스에서는 production
devtool: 'eval', //production일때는 hidden-source-map사용
resolve:{
extensions:['.js','.jsx'] //js나 jsx파일 확장자 있는지 찾는다.
},
//파일 합치기
//두가지 파일을 합쳐서 app.js파일로 만들어 html이 실행할 수 있도록 만들어준다.
entry: {
app: ['./client'],
}, //입력
module: {
rules: [{
test: /\.jsx?/,
loader:'babel-loader',
//js나jsx파일에 바벨로더를 적용해 최신문법이 옛날 브라우저에서도 돌아갈 수 있도록 해준다.
options:{
presets:['@babel/preset-env','@babel/preset-react'],
},
}],
},
output : {
path: path.join(__dirname,'dist'),
filename: 'app.js',
}, //출력
}
결과 : 여러개의 파일을 합쳐 현재 폴더 내에 dist폴더가 생기고 그 안에 app.js라는 하나의 파일이 생성된다.
전체적인 과정으로 entry에 있는 파일에 module적용하고 추가적으로 plugins사용해 output으로 출력한다.
https://webpack.kr/concepts/ 더 자세한 내용은 webpack문서에서 확인해보자
npx webpack
//or
npm run dev
<!-- 웹팩사용 -->
<html>
<head>
<meta charset="UTF-8"/>
<title>제목</title>
</head>
<body>
<div id="root"></div>
<script src="./dist/app.js"></script>
</body>
</html>
여러개의 js파일이 아닌 app.js 하나의 파일에서 실행된다.
코드르 수정할때 마다 build를 수행해주지 않으면(수동으로 할 때) 에러가 날 수 있다.
이때 자동으로 build를 해주어 이를 해결할 수가 있다.
웹팩데브서버와 핫리로딩(webpack-dev-server, react-refresh, react-refresh-webpack-plugin)
//리액트 리프레쉬 사용방법
//설치
npm i react-refresh @pmmmwh/react-refresh-webpack-plugin -D
npm i -D webpack-dev-server //개발용 서버 하나 필요
//pakage.json에서 명령어 변경
"scripts": {
"dev" : "webpack serve --env development"
},
//webpack.config.js
const path = require('path');
const RefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');//추가
//...
//plugins추가
module: {
rules: [{
test: /\.jsx?/,
loader:'babel-loader',
options:{
presets:[
['@babel/preset-env',{
targets:{
browsers : ['> 1% in KR'],
},
}],
'@babel/preset-react'
],
plugins:[
'@babel/plugin-proposal-class-properties',
'react-refresh/babel',//추가됨!
],
},
}],
},
plugins:[
new RefreshWebpackPlugin()
],//추가됨!
output : {
path: path.join(__dirname,'dist'), //__dirname은 현재폴더(lecture)
filename: 'app.js',
publicPath:'/dist',//추가, publicPath는 가상경로같은것
},
devServer : {
publicPath:'/dist/',
hot:true,
},//추가
설정을 해주고 npm run dev
를 실행하면 매번 수동으로 빌드할 필요없이 웹팩 빌드가 자동으로 이뤄진다.