✨ 웹팩은 모듈 번들러다!
➡ 모듈에 대해 알아보자!
자바스크립트에서의 모듈이란 기능 단위의 "자바스크립트 개별 파일"다.
// 이렇게 감싸서 하나의 모듈을 만들 수 있었다.
(function () {
// scope가 막혀있기 때문에 전역변수가 생성되지 않는다.
// 즉시 실행함수는 보통 일회용 코드
})();
// 모듈 또 하나
(function () {
window.myLibrary = /* */;
}());
// 모듈 또 하나
(function () {
var math = {
add: function () {}
}
window.math = math;
}());
자바스크립트를 이용하는 웹페이지의 코드가 복잡해지기 시작하면서,
효율적인 소스 관리가 필요해져서 이제는 모듈을 정의하는 것 또한 표준으로 정의되었다.
❗ 아직 IE지원이 안되므로, 모듈을 사용하려면 babel, webpack이 필요하다.
babel
은 ES6 → 브라우저에서 사용할 수 있도록 모듈을 commonjs로 바꿔주고,
webpack
은 모듈간의 의존성을 파악하여 자바스크립트 코드를 bundle(합쳐) 해준다.
✨ 웹팩은 모듈 번들러다!
➡ 모듈을 알아봤으니 번들러에 대해 알아보자!
npm run build
후에 하나의 자바스크립트 파일로 나온 결과물이 번들러의 결과물!➡ 왼쪽의 서로 종속 관계인 파일들을 웹팩을 통해 하나로 깔끔하게 모아준다!!
dev server
,dynamic import
,code spliting
등을 지원한다.yarn add webpack webpack-cli babel-loader @babel/core @babel/preset-env @babel/preset-react -D
yarn add react react-dom
// webpack.config.js
const path = require('path');
const config = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'build'),
filename: 'bundle.js'
}
};
module.exports = config;
entry
: 이 프로젝트가 어느 파일에서 시작할지 entry 프로퍼티에 경로를 지정
output
: webpack이 적용된 결과파일을 어느 위치에, 어떤 파일이름으로 생성할지 지정
loader
: 파일을 전처리(preprocess) 해주는 것인데, 이 때 파일은 모듈을 뜻하며 js 파일 뿐만 아니라 img, css, csv 등 모든 정적 리소스를 포함한다. loader는 모듈을 입력 받아서, 새로운 모듈로 출력하고 번들링 할 수 있다.// webpack.config.js
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: ['babel-loader']
}
]
}
//babel.config.js
//babel 세팅도 해야한다. @babel/preset-react 프리셋을 사용하도록 설정
const presets = {
presets: ["@babel/preset-react"]
};
module.exports = presets;
yarn add sass-loader css-loader mini-css-extract-plugin sass -D
{
test: /\.(sa|sc)ss$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'sass-loader'
]
}
{
test: /\.(png|jpe?g|gif|svg)$/i,
use: [
{
loader: 'file-loader',
options: {
name: '[path][name].[ext]'
}
}
]
}
plugins: [
new MiniCssExtractPlugin({
filename: '[name].css',
chunkFilename: '[id].css'
}),
new HtmlWebpackPlugin({
template: './public/index.html',
output: 'index.html'
}),
]
HtmlWebpackPlugin
는 html 파일에 script 태그를 추가하여 번들된 js 파일을 주입한다.//package.json
"scripts": {
"start": "react-scripts start",
"start:dev": "REACT_APP_ENV=dev react-scripts start",
"start:staging": "REACT_APP_ENV=staging react-scripts start",
"test-start": "yarn test --watchAll=false && react-scripts start",
"build": "react-scripts build",
"build:dev": "REACT_APP_ENV=dev react-scripts build",
"build:staging": "REACT_APP_ENV=staging react-scripts build",
"build:production": "REACT_APP_ENV=production react-scripts build",
"test": "react-scripts test",
"test-all": "react-scripts test --watchAll=false",
"eject": "react-scripts eject",
"storybook": "start-storybook -p 6006 -s public",
"build-storybook": "build-storybook -s public"
},
// 사용 예제
const PRODUCTION_URL = 'https://api.co.kr';
const STAGING_URL = 'https://staging.api.co.kr';
const DEV_URL = 'https://dev.api.co.kr';
const LOCAL_URL = 'http://100.28.2.17:3000';
let uri;
switch (process.env.REACT_APP_ENV) { // REACT_APP_ENV
case 'production':
uri = PRODUCTION_URL;
break;
case 'staging':
uri = STAGING_URL;
break;
case 'dev':
uri = DEV_URL;
break;
default:
uri = LOCAL_URL;
}
const httpLink = createHttpLink({
uri,
});
export default httpLink;
Babel은 JavaScript 컴파일러입니다.
➡ 사람이 읽기 편한 프로그래밍 언어에서 컴퓨터가 읽기 편한 코드로 바꿔주는 것
babel-loader
: 바벨과 웹펙이 어떻게 동작하는지@babel/core
: babel로 컴파일해서 결과물 파일이 나오도록 babel 관련한 핵심 모듈@babel/preset-env
: ES2015?6?7 등 어떤 버전을 쓸지에 관한 모듈@babel/preset-react
: jsx를 js로!