webpack
webpack is a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser, yet it is also capable of transforming, bundling, or packaging just about any resource or asset.
webpack.js.org
๐ฉ๐ป ์ด๋ฒ์๋ ์นํฉ์ผ๋ก ๋ฒ๋ค๋ง ์์ ํด๋ณด๋ ค๊ณ ํด์. ๋ฒ๋ค๋ง ์์ ํ ๋๋ ์นํฉ ํจํค์ง์ ์นํฉ ํฐ๋ฏธ๋ ๋๊ตฌ๋ฅผ ์ค์นํด์ค์ผ ํฉ๋๋ค. ์ฃผ์ํด์ผ ๋ ์ ์ด ์๋๋ฐ, ์นํฉ์ ํ์ฌ ๋ฒ์ 5 ๊น์ง ๋์๊ฑฐ๋ ์. ํ์ง๋ง ์ ๋ ๋ฒ์ 4๋ฅผ ์ค์นํ๋ ๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค. ์๋ํ๋ฉด ์ข ๋ ๋ค๋ก ๋๊ฐ์๋ก ํ๋ฌ๊ทธ์ธ๋ ์์๋ณผํ ๋ฐ ๋ฒ์ 5 ๋ ํ๋ฌ๊ทธ์ธ ์ค์น์ ์์ง๊น์ง ์ง์ ์๋๋ ๊ฒ๋ค์ด ๋ง๋๋ผ๊ตฌ์. ใ ใ
์ค์น๋ช ๋ น์ด
$npm install -D webpack-cli
$npm install --save-dev webpack@(๋ฒ์ ์)
์ฌ๊ธฐ์ -D ๋ ๊ฐ๋ฐ์ฉ dependencies๋ฅผ ๋ปํฉ๋๋ค. ์นํฉ ๋ฒ๋ค๋ง ํ ๋ ํ์ํ ๊ธฐ๋ณธ ํจํค์ง๋ค์ ์ค์น ํ์ จ๋ค๋ฉด ์นํฉ ํ๊ฒฝ์ค์ ํด์ฃผ๋ ํ์ผ๋ค์ ๋ง๋ค์ด ๋ณผ๊ฑฐ์์. [webpack.config.js] ๋ผ๋ ํ์ผ๋ช ๋๋ [webpackfile.js] ํ์ผ๋ช ์ค ๋ ๋ง์ ๋๋ ์ด๋ฆ์ ๊ณจ๋ผ ์นํฉ ํ๊ฒฝ์ค์ ํ์ผ์ ๋ง๋ค์ด์ฃผ์ธ์. ๐์ ๋ [webpack.config.js]๋ก ๋ง๋ค์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์นํฉ์ ์คํํ ๋๋ ํ์์ ์ธ ์ต์ ์ด ์์ด์.
๐ [webpack.config.js]
const path = require('path');
module.exports = {
mode: 'development',
entry: {
main : './src/app.js',
main2 : './src/app2.js',
},
output: {
path: path.resolve('./dist'),
filename : '[name].js'
}
}
1. mode : development, production, none์ด ์๋๋ฐ ๊ฐ๋ฐํ๊ฒฝ์ด๋ ์ด์ํ๊ฒฝ์ด๋์ ๋ฐ๋ผ์ development, production์ ์ค์ ํฉ๋๋ค.
- development : ๊ฐ๋ฐ์ฉ ์ ๋ณด๋ฅผ ์ถ๊ฐํ ๋
- production : ์ด์์ ๋ฐฐํฌํ๊ธฐ ์ํ ๊ฒ
2. entry : ๋ชจ๋์ ์์์ ์ ๋๋ค.
3. output : ์ํธ๋ฆฌ๋ฅผ ํตํด ๋ชจ๋ ๊ฑธ ํ๋๋ก ํฉ์น๊ณ ๊ฒฝ๋ก๋ฅผ ์ ์ฅํ๋ ๊ฒ์ ์์ํ์ผ๋ก ์ค์ ํด์ค๋๋ค.
์ด ๋ชจ๋ ์ค์ ์ ๋๋ด์ จ์ผ๋ฉด, ํฐ๋ฏธ๋ ์ฐฝ์ ์๋ ๋ช ๋ น์ด๋ฅผ ์คํํด๋ณด์ธ์!
$node_modules/.bin/webpack --mode development --entry ./src/app.js --output dist/main.js
๊ทธ๋ผ ์ฌ๋ฌ๊ฐ์ ๋ชจ๋์ ํ๋์ ํ์ผ๋ก ๋ง๋ค์ด์ง๊ฒ ๋ฉ๋๋ค. ์์ํ ํด๋ ๋ช ์ dist๋ผ๊ณ ์ค์ ํ์ผ๋ dist๋ผ๋ ํด๋๊ฐ ์๊ฒผ์๊ฑฐ์์ ๐๊ทธ๋ฆฌ๊ณ packages.json ํ์ผ์์๋ ์ ํฌ๊ฐ ์ค์ ํด ์ค์ผ ํ ๊ฒ์ด ์์ด์.
๐ [package.json]
{
"name": "fn_dev_env",
"version": "1.0.0",
"description": "<br>",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
๐๐ป "build": "webpack"
},
"author": "",
"license": "ISC",
"dependencies": {
"react": "^17.0.1"
},
"devDependencies": {
"webpack": "^4.46.0",
"webpack-cli": "^4.5.0"
}
}
์ฌ๊ธฐ์ build๋ฅผ webpack์ผ๋ก ์ค์ ํ๋ฉด
$npm run build
ํฐ๋ฏธ๋์ฐฝ์ ์ด ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ ์, ํ์ฌ ํ๋ก์ ํธ์ ์๋ ๋ ธ๋ ๋ชจ๋์ ๋ค์ ธ์ ์นํฉ ๋ช ๋ น์ด๋ฅผ ์ฐพ์์ค์. ๊ทธ๋ผ ์นํฉ์ ๊ธฐ๋ณธ [webpack.config.js] ํ์ผ์ ์ฝ์ด์ ๋ฒ๋ค๋ง ํด์ค ๊ฒ ์ ๋๋ค.
๐ฉ๐ป ์ด์ ๋ ๋ก๋์ ์์ฃผ ์ฌ์ฉํ๋ ๋ก๋๋ฅผ ์์๋ณผ ๊ฒ ์ ๋๋ค.
๋ก๋
์นํฉ์ ๋ชจ๋ ํ์ผ์ ๋ชจ๋๋ก ๋ฐ๋ผ๋ด ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ง๋ ๋ชจ๋ ๋ฟ๋ง ์๋๋ผ, css, ์ด๋ฏธ์ง, ํฐํธ๋ ์ ๋ถ ๋ชจ๋๋ก ๋ณด๊ธฐ ๋๋ฌธ์ import ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์์ด์. ์ด๊ฒ์ด ๊ฐ๋ฅํ ์ด์ ๋ ์นํฉ์ ๋ก๋ ๋๋ถ์ด๋๋๋ค. ๋ก๋๋ ํ์ ์คํฌ๋ฆฝํธ ๊ฐ์ ๋ค๋ฅธ ์ธ์ด๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ผ๋ก ๋ณํํด ์ฃผ๊ฑฐ๋ ์ด๋ฏธ์ง๋ฅผ data URI ํ์์ ๋ฌธ์์ด๋ก ๋ณํํด์ฃผ๊ธฐ๋ ํด์. ๋ฟ๋ง ์๋๋ผ css ํ์ผ์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ง์ ๋ก๋ฉ ํ ์ ์๋๋ก ๋์์ค๋ต๋๋ค.
module: {
rules: [
{
test: /\.js$/,
use: [path.resolve("./my-webpack-loader.js")],
},
],
},
๋ก๋๋ฅผ ์ฌ์ฉํ ๋๋ ์ด๋ ๊ฒ ๋ชจ๋ ๊ฐ์ฒด ์์๋ค๊ฐ rules ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด rules ์์ ๋ฐฐ์ด๋ก ๊ฐ์ฒดํํด์ ์ฌ์ฉํ ๋ก๋๋ค์ ์ค์ ํด ์ฃผ๋ฉด๋ฉ๋๋ค. ์ฒ๋ฆฌํ ํ์ผ์ test์ ์ ์ฝ๋์ฒ๋ผ ์ ๊ทํํ์์ผ๋ก ๋ช ์ํด์ฃผ์ธ์.
- test : ๋ก๋๋ฅผ ์ ์ฉํ ํ์ผ ์ ํ์ ๋ปํฉ๋๋ค.
- use : ํด๋น ํ์ผ์ ์ ์ฉํ ๋ก๋ ์ด๋ฆ์ ๋๋ค.
์์ฃผ ์ฌ์ฉํ๋ ๋ก๋
๋ก๋๋ฅผ ์ฌ์ฉํ ๋๋ ๋ก๋ ํจํค์ง๋ฅผ ์ค์นํด์ฃผ์ ์ผ ๋ฉ๋๋ค.
1. CSS-loader
$npm install css-loader style-loader
css ๋ก๋๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ์ด ํ์ผ์ด JS๋ก ๋ณํ๋ ๋ style-loader๋ ๊ฐ์ด ์ค์นํด ์ฃผ์ ์ผํด์.
module: {
rules: [
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
],
},
๋จผ์ ์ค์นํ ํจํค์ง๊ฐ ๋ค๋ก ๊ฐ๋ ์์๋ก ์ ๋ ฅํด์ฃผ์ ์ผ ํฉ๋๋ค !
2. image-loader
$npm install file-loader
๋ค์์ผ๋ก ์์ฃผ ์ฐ์ผ ๋ก๋๋ ์ด๋ฏธ์ง๋ก๋์ ๋๋ค. ์ ๋ช ๋ น์ด๋ฅผ ํตํด ํจํค์ง๋ฅผ ์ค์นํด์ฃผ์ธ์.
{
test: /\.jpg$/,
loader: "file-loader",
options: {
pubilcPath: "./dist/",
name: "[name].[ext]?[hash]", //์ด๋ฆ.ํ์ฅ์?ํด์๊ฐ
},
},
์๋ css ๋ก๋์ ๋ง์ฐฌ๊ฐ์ง๋ก rules ์์ ์ ์ธํ์๋ฉด ๋ฉ๋๋ค. options์ ์๋ publicPath๋ ์ด ์ด๋ฏธ์ง๋ค์ด ๋ด๊ธธ ๊ณต๊ฐ์ ์๋ฏธํด์. publicPath๋ ํ์ผ๋ก๋๊ฐ ์ฒ๋ฆฌํ๋ ํ์ผ์ ๋ชจ๋๋ก ์ฌ์ฉํ์ ๋ ๊ฒฝ๋ก ์์ ์ถ๊ฐ๋๋ ๋ฌธ์์ด์ ๋๋ค. ์ฝ๊ฒ๋งํด ์์ํ์ dist๋ก ์ค์ ํ์ผ๋ pubilcPath๋ ๊ฐ์ ๊ฒฝ๋ก๋ก ๋์ผํ๊ฒ dist๋ก ์ค์ ํด์ค์ผ ํด์!
์ด๋ฒ์๋ ์ฌ๋ฌ ์ด๋ฏธ์ง ์ฌ์ฉ์ data URI๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ฌ์ฉํ๋ ์ด๋ฏธ์ง ๊ฐฏ์๊ฐ ๋ง๋ค๋ฉด ๋คํธ์ํฌ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ ๋ถ๋ด์ด ์๊ณ ์ฌ์ดํธ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์๋ ์์ด์. ํ ํ์ด์ง์์ ์์ ์ด๋ฏธ์ง๋ฅผ ์ฌ๋ฌ๊ฐ ์ฌ์ฉํ๋ค๋ฉด data URI scheme๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด ๋ ๋ซ์ต๋๋ค.
$npm install url-loader
ํจํค์ง๋ฅผ ์ค์นํ์ จ์ผ๋ฉด ์ด์ ์นํฉ ํ๊ฒฝ์ค์ ์ ํด๋ด ์๋ค.
{
test: /\.(jpg|png|gif|svg)$/,
loader: "url-loader",
options: {
publicPath: "./dist/",
name: "[name].[ext]?[hash]",
limit: 20000,
},
},
test์ jpg ๋ฟ๋ง ์๋๋ผ ์ฌ๋ฌ ํ์ฅ์๋ฅผ ๋ฒ๋ค๋ง ํด์ฃผ๊ณ ์ถ๋ค๋ฉด, (ํ์ฅ์๋ช |ํ์ฅ์๋ช |ํ์ฅ์๋ช ) ์ด๋ ๊ฒ ๋์ด์ฐ๊ธฐ ์์ด ์ค์ ํด์ฃผ์๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ก๋๋ url-loader๋ก ์ค์ ํฉ๋๋ค. ์ฌ๊ธฐ์ ์๋กญ๊ฒ ์ถ๊ฐ๋ limit์ ํ์ผ ์ฉ๋์ผ๋ก ์์ํ์ ํด์ฃผ๋, ์๋๋ฉด data uri๋ก ๋ฟ๋ ค์ฃผ๋ ์ค์ ํด์ฃผ๋๋ฐ์. ์ฌ๊ธฐ์ 20000์ 20kb๋ฅผ ์๋ฏธํด์. url-loader๊ฐ ์ด๋ฏธ์ง ํ์ผ๋ค์ ์ฒ๋ฆฌํ ๋ ์ฉ๋์ด 20kb ๋ฏธ๋ง์ url-loader๋ก ํด์ bath 64๋ก ๋ณํ์ฒ๋ฆฌ ํด์ค๋๋ค. ๊ทธ ์ด์์ด๋ฉด file-loader๋ก ์คํ๋์ด ํ์ผ์ด dist ํด๋์ ๋ณต์ ๋ ๊ฑธ ๋ณผ ์ ์์ด์.
์ด์ธ์๋ ts ๋ก๋, sass ๋ก๋, babel ๋ก๋๊ฐ ์์ต๋๋ค.
npm install --save-dev typescript ts-loader
webpack.js.org/guides/typescript/#loader
TypeScript | webpack
webpack is a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser, yet it is also capable of transforming, bundling, or packaging just about any resource or asset.
webpack.js.org
๋ก๋ ๋ง๋ฌด๋ฆฌ
module: {
rules: [
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
{
test: /\.(jpg|png|gif|svg)$/,
loader: "url-loader",
options: {
publicPath: "./dist/",
name: "[name].[ext]?[hash]",
limit: 20000, //ํ์ผ ์ฉ๋๋ ์ค์ ์ด ๊ฐ๋ฅํ๋ค 2kb
},
},
],
},
์ด์ฒ๋ผ ๋ก๋๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ๋ชจ๋์์ rules ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ด ์์์ ๋ฐฐ์ด๋ก ๋ก๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ค์ ํ์๋ฉด ๋ฉ๋๋ค! ์นํฉ ๋ค๋ฃจ๋ ๊ธฐ๋ณธ๊ธฐ๋ง ์์๋๋ฉด ๋ค๋ฅธ ๋ก๋๋ค๋ ์ฌ์ฉํ ๋ ์ฝ๊ฒ ์ค์ ํ ์ ์์ ๊ฒ๋๋ค. ์ง๊ธ์ ๊ฐ์ฅ ๋ํ์ ์ธ css๋ก๋์ ์ด๋ฏธ์ง ๋ก๋๋ฅผ ์์๋ดค๋๋ฐ, ๋ค์์๋ ts๋ก๋์ sass๋ก๋ ์คํ๋ผ์ดํธ ์ด๋ฏธ์ง ๋ง๋๋ ๋ฐฉ๋ฒ๋ ์์๋ณด๊ณ ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.