๐ ๋ฆฌ์กํธ ์ฑ ์นํฉ ๋ฒ๋ค๋ง ์ฐ์ต ๋ฐ๋ก๊ฐ๊ธฐ
-
package.json ๋ง๋ค๊ธฐ
- ์ฐ์ ๋ค์ ๋ช ๋ น์ด๋ก ๊ธฐ๋ณธ ์ค์ ๋ package.json ํ์ผ์ ๋ง๋ค์ด์ค๋ค.
$ npm init -y
-
webpack ์ค์นํ๊ธฐ
- ์นํฉ์ ์ฌ์ฉํ๋ ค๋ฉด webpack ๊ณผ webpack-cli ๋ฅผ ์ค์นํด์ผ ํ๋ค.
โป ๊ฐ๋ฐ ํ๊ฒฝ์์๋ง ํ์ํ ๋ชจ๋์ด๋ฏ๋ก -D (๋๋ โsave-dev) ๋ก ์ค์น
$ npm install -D webpack webpack-cli
- ์นํฉ์ ์ฌ์ฉํ๋ ค๋ฉด webpack ๊ณผ webpack-cli ๋ฅผ ์ค์นํด์ผ ํ๋ค.
-
webpack.config.js ํ์ผ ๋ง๋ค๊ธฐ
-
์นํฉ ์ค์ ํ์ผ์ ๋ง๋ค์ด์ค๋ค. ๋ฒ๋ค ํ์ผ์ ๋ง๋ค๊ธฐ ์ํด์๋ ๊ธฐ๋ณธ์ ์ผ๋ก entry, output ๋ ์์ฑ์ด ํ์ํ๋ค.
- entry : ๋ฒ๋ค๋ง ์์ ํ์ผ ์์น
- output : ๋ฒ๋ค๋ง ๊ฒฐ๊ณผ๋ฌผ
-
์ด๋ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ฝ๊ฒ ์์ฑํ๊ธฐ ์ํด path ๋ชจ๋์ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
โป path.resolve(โ๊ฒฝ๋ก1โ, โ๊ฒฝ๋ก2โโฆ) ๋ ์ธ์๋ก ๋ฐ์ ๊ฒฝ๋ก๋ฅผ ํฉ์ณ์ค๋ค. โ ๊ฒฝ๋ก1/๊ฒฝ๋ก2
//webpack.config.js const path = require('path'); module.exports = { entry: './src/index.js', output: { path: path.resolve(__dirname, 'dist'), // './dist'์ ์ ๋ ๊ฒฝ๋ก๋ฅผ ๋ฆฌํด filename: 'app.bundle.js', }, };
-
-
webpack ์คํฌ๋ฆฝํธ ์ธํ
npx webpack
๋ช ๋ น์ด๋ก ์นํฉ์ ์คํ์ํฌ ์ ์๋ค. ์ด๋ฌ๋ฉด entry ํ์ผ์์๋ถํฐ ์์ํด ๋ฒ๋ค๋งํ ๊ฒฐ๊ณผ๋ฅผ output ์ ์ง์ ํ ํ์ผ๋ก ๋ง๋ค์ด ์ค๋ค.- ๋ค๋ฅธ ๊ฐ๋ฐ์์ ํ์ ํ ๋ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํด ์คํธ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด ์ฃผ๋ ๊ฒ ์ข๋ค.
//package.json "scripts": { "build": "webpack", // here "test": "echo \"Error: no test specified\" && exit 1" },
- ์์กด์ฑ ๋ชจ๋ js ํ์ผ์ ๋ฃ์ด์ฃผ๊ธฐ
-
js ํ์ผ์ require ๋ก ํ์ํ ํ์ผ์ ๋ฃ์ด์ค๋ค. (์ธ๋ถํ์ผ, ์ด๋ฏธ์ง, css ๋ฑ๋ฑโฆ)
-
ํ์ํ ๋ชจ๋์ js ํ์ผ ์์์ require ๋ก ๊ฐ์ ธ์์ผ ์นํฉ์ด ํ์ํ ํ์ผ๋ก ์ธ์ํด ๋ฒ๋ค๋งํ ๋ ๊ฐ์ด ๋ฌถ์ด์ค๋ค. (js ํ์ผ์ด๋ผ๋ฉด module.exports ๋ก ๋ด๋ณด๋ด์ฃผ๋ ๊ฒ ์์ง ๋ง์.)
//./src/script.js require('./style.css'); const { agoraStatesDiscussions } = require('./data.js'); ... //./src/data.js module.exports.agoraStatesDiscussions = {...};
-
- ๋ก๋(loader) ๋ก ๋ค๋ฅธ ์ ํ ํ์ผ ์ ์ฒ๋ฆฌ ํด์ฃผ๊ธฐ
-
์นํฉ์ ๊ธฐ๋ณธ์ ์ผ๋ก js ์ JSON ๋ง ์ดํดํ๊ธฐ ๋๋ฌธ์, ๋ค๋ฅธ ํ์ผ์ ๋ฃ์ด์ค ๊ฒฝ์ฐ ๋ก๋(loader) ๋ก ์ ์ฒ๋ฆฌ ํด์ค์ผํ๋ค.
โป css ํ์ผ์ js ํ์ผ์ ๋ฃ์ด์ค ๊ฒฝ์ฐ, ์นํฉ์ด ํ์ผ์ ์ดํดํ์ง ๋ชปํด ์๋ฌ ๋ฐ์
-
์ฌ์ฉํ๋ ํ์ผ(๋ชจ๋) ์ข ๋ฅ์ ๋ฐ๋ผ ์ ํฉํ ๋ก๋๋ฅผ ์ค์นํ ๋ค, webpack.config.js ํ์ผ์ module ์์ฑ ์์ ์์ฑํด์ค๋ค.
-
๐ป ์๋ฅผ ๋ค์ด, css ํ์ผ์ ๋ฒ๋คํ์ผ(js)์ ์ ์ฉํ๊ณ ์ถ๋ค๋ฉด
-
css-loader ์ style-loader ๋ฅผ ์ค์นํ๋ค.
โป css-loader ๋ css ํ์ผ์ json ์ผ๋ก ๋ณํ์์ผ์ฃผ๊ณ , style-loader ๋ ์ด json ์ style ํ๊ทธ ์์ ๋ฃ๊ณ html ๋ฌธ์์ ์ฝ์ ํด์ค๋ค. ์ฆ, style-loader ๊ฐ ์์ผ๋ฉด css ๊ฐ ๋ฐ์๋์ง ์๋๋ค.
$ npm i -D css-loader style-loader
-
webpack ์ค์ ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ์ถ๊ฐํ๋ค.
module.exports = { ... module: { rules: [ { test: /\.css$/, use: ["style-loader", "css-loader"], //์ด๋, ์ค๋ฅธ์ชฝ๋ถํฐ ๋ก๋๊ฐ ์ ์ฉ๋๋ฏ๋ก css-loader๊ฐ ๋งจ ์ค๋ฅธ์ชฝ์ด์ด์ผํ๋ค. exclude: /node_modules/, } ], }, };
-
์นํฉ์ ์คํ์ํค๋ฉด ์ด๋ ๊ฒ ๋ฒ๋ค ํ์ผ(js)์ css ๊ฐ ๋ฌธ์์ด๋ก ๋ค์ด๊ฐ ์๊ณ , ์คํํ html ๋ฌธ์์
<style>
ํ๊ทธ๊ฐ ์ฝ์ ๋์ด ์๋ค.(์ค์ ํ์ผ์ ์๊ณ , ์คํ์ DOM ์ ์ฝ์ ๋์ด ์๋ค.)
-
-
- ํ๋ฌ๊ทธ์ธ(plugin) ์ฌ์ฉํ๊ธฐ
- ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํด์ ๋ค์ํ ์์ ์ ํธ๋ฆฌํ๊ฒ ํ ์ ์๋ค.
- ๐ป ์นํฉ์ ๊ธฐ๋ณธ์ ์ผ๋ก js ํ์ผํ๋๋ง ๋ฒ๋ค ํ์ผ๋ก ๋ง๋ค๊ธฐ์ html ๋ฌธ์๋ ๋ฒ๋ค ํด๋์ ๋ฐ๋ก ์์ฑํด์ค์ผํ๋ค. ํ์ง๋ง
html-webpack-plugin
์ ์ฌ์ฉํ๋ฉด html ๋ ๋ฒ๋ค ํด๋์ ์๋ ์์ฑํด์ค๋ค.-
ํ๋ฌ๊ทธ์ธ ์ค์น
$ npm i -D html-webpack-plugin
-
webpack ์ค์ ํ์ผ์ ํ๋ฌ๊ทธ์ธ์ ๋ถ๋ฌ์ค๊ณ , plugins ์์ฑ์ ๋ค์๊ณผ ๊ฐ์ด ์ถ๊ฐํ๋ค.
const path = require('path'); //์ค์นํ ํ๋ฌ๊ทธ์ธ์ ๋ฐ๋์ ๋ถ๋ฌ์์ผํ๋ค. const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { ... plugins: [new HtmlWebpackPlugin({ template: path.resolve(__dirname, "src", "index.html") //๋ฒ๋ค ํด๋์ ์์ฑํด์ค ๊ธฐ์กด html ๋ฌธ์ ์์น })] };
-
์นํฉ์ ์คํํ๋ฉด ๋ฒ๋ค ํด๋์ html ๋ฌธ์๊ฐ ์๊ธฐ๊ณ ์๋์ผ๋ก ๋ฒ๋ค๋ง๋ js ๋ฌธ์๊ฐ script ํ๊ทธ๋ก ๋ค์ด๊ฐ ์๋ค.
-
-
์ถ๊ฐ ์ค์ ํ๊ธฐ - target, mode, output.clean ๋ฑ
- target: ["web", "es5"] :
web ์ฉ es5 ๋ฌธ๋ฒ์ผ๋ก ์ปดํ์ผ(๋ฒ๋ค๋ง) ํ๊ฒ ๋ค. โ ES6๋ฅผ ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ์์ ์คํ ๊ฐ๋ฅ โ ๋ธ๋ผ์ฐ์ ํธํ์ฑ โฌ๏ธ - mode: "production" :
๋ฐฐํฌ ๋ชจ๋๋ก ์ค์ โ ์ฝ๋๊ฐ ์ถ์ฝํ ๋์ด ์๋ค. ๊ฐ๋ฐ๋ชจ๋๋ โdevelopmentโ โ ์ฝ๋ ์ฝ๊ธฐ & ์๋ฌ ์ฐพ๊ธฐ ์์ - output.clean: true :
์ ๋ฒ๋ค๋ง ์, ๊ธฐ์กด์ ์๋ ๋ฒ๋ค ํ์ผ์ ์ง์ด๋ค.
//webpack.config.js const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin') module.exports = { target: ["web", "es5"], mode: "production", entry: './src/script.js', output: { path: path.resolve(__dirname, 'dist'), // './dist'์ ์ ๋ ๊ฒฝ๋ก๋ฅผ ๋ฆฌํด filename: 'app.bundle.js', clean: true, }, module: { rules: [ { test: /\.css$/, use: ["style-loader", "css-loader"], exclude: /node_modules/, } ], }, plugins: [new HtmlWebpackPlugin({ template: path.resolve(__dirname, "src", "index.html") })] };
- target: ["web", "es5"] :