data.js : const agoraStatesDiscussions = [...] ์์ export ์ถ๊ฐํด์ฃผ๊ธฐscript.js ์ ๋ถ๋ฌ์ ์ฌ์ฉํ ์์ script.js : ์๋จ์ import {agoraStatesDiscussions} from "./data" ์ถ๊ฐํด์ฃผ๊ณ , let data = agoraStatesDiscussions ์ถ๊ฐํด์ฃผ๊ธฐnpm i -D webpack webpack-cli css-loader style-loader html-webpack-plugin
"script" ๊ฐ์ฒด ์์ "build": "webpack", ์ถ๊ฐํ๊ธฐ
src ํด๋ ๋ฐ์ ๋ง๋ค๊ธฐ!!!!!
const path = require("path")
const HtmlWebpackPlugin = require("html-webpack-plugin")
module.exports = {
mode: "development",
entry: "./src/script.js",
output: {
filename: "app.bundle.js", // ์ง์
์
path: path.resolve(__dirname, "dist"), // ๊ฒฝ๋ก
},
module: {
rules: [
{
test: /\.css$/i, // .css ํ์ผ ์ ๋ถ?
use: ["style-loader", "css-loader"], // css-loader๋ style-loader ์ฌ์ฉํ๊ธฐ
exclude: /node_modules/, // node_modules ๋ผ๋ ํ
์คํธ ๋ค์ด๊ฐ ํ์ผ์ด๋ ํด๋ ์ ๋ถ ์ ์ธ
},
],
},
plugins: [
new HtmlWebpackPlugin({
// template ์ต์
์ถ๊ฐํด์ html ํ์ผ ์ฝ์ ์ ์๊ฒ
// ํ์ฌ ๋ด index.html ํ์ผ์ src ํด๋ ๋ด์ ์์ผ๋๊น ์๋์ฒ๋ผ ์
// ๋ง์ฝ index.html ์ด webpack์ด๋ ๊ฐ์ ๋ ๋ฒจ์ ์์ ์๋ค๋ฉด
//()์์ index.html ๋ง ์จ์ฃผ๋ฉด ๋๋ค.
template: path.resolve(__dirname, "src", "index.html")
})
],
}
index.html ํ์ผ ์์ css ์ฐ๊ฒฐ๋ <link> ํ๊ทธ๋
data.js ์ฐ๊ฒฐ๋ <script> ํ๊ทธ๋ script.js ์ฐ๊ฒฐ๋ <script> ํ๊ทธ ์ง์ฐ๊ธฐ
CLI์ npm run build ์
๋ ฅํด์ ๋ฒ๋ค๋งํด์ฃผ๋ฉด
dist ํด๋์ app.bundle.js ์์ฑ๋๊ณ , index.html ์์ฑ๋๋ค.
โ dist/index.html ์ <script defer="defer" src="app.bundle.js"></script> ์ถ๊ฐ ๋์ด์์ผ๋ฉด ๋จ!
src/index.html ์ ์๋ css ๋ script ๋ค์ ์ง์ฐ์ง ์๊ณ ์๊พธ ๋ฒ๋ค๋งํจ..ใ
์๊พธ src/index.html ์ ์ด์๋ค..
๋ฒ๋ค๋ง ๋ ํ์ผ์ ํ์ธํ๋ ค๋ฉด dist/index.html ์ ๋ผ์ด๋ธ ์๋ฒ๋ก ์ด์ด์ ํ์ธํ์
Bare Minimum ์์ ๋ง๋ค์๋ webpack.config.js ์์
๋์ ์ผ๋ก ํ์ผ์ด๋ฆ์ด ์์ฑ๋ ์ ์๊ฒ entry ๋ถ๋ถ์ ์์ ํ๊ณ
output ์์ filename ์ "[name].bundle.js", ๋ก ๋ฐ๊พธ๊ณ
clean: true, ์ถ๊ฐํ๊ธฐ
entry: {
main: "./src/script.js",
},
output: {
filename: "[name].bundle.js",
path: path.resolve(__dirname, "dist"),
clean: true,
},
โ clean: true ๋ฅผ ์คฌ๋๋ ์ด์ ์ ์์๋ app.bundle.js ๊ฐ ์ฌ๋ผ์ก๋ค.
webpack.config.js ์ target ์ถ๊ฐํ๊ธฐ
module.exports = {
mode: development,
target: ["web", "es5"] // es5 ๋ฒ์ ์ผ๋ก ์ปดํ์ผํ๊ฒ
}
CLI ์ npm i -D webpack-dev-server ๋ก ์ค์นํ๊ณ ,
package.json "script" ๊ฐ์ฒด ์์ "dev": "webpack serve", ์ถ๊ฐํ๊ธฐ
webpack.config.js ํ์ผ์
module.exports ์์ plugins ๋ฐ์ devServer ์ถ๊ฐํ๊ธฐ
module.exports = {
...
devServer: {
port: 8000,
}
};
๊ฐ๋ฐ์ฉ ์๋ฒ๊ฐ ์ ๋๋ก ๋๋์ง ํ์ธํ๋ ค๋ฉด
port๋ฅผ 8000์ผ๋ก ์ค์ ํ์ผ๋๊น 8000 ํฌํธ๋ก ์ง์
ํ๊ธฐ
CLI ์ npm run dev (ํด์ webpack server ์ด๊ณ ?) ํ์ ๋
successfully ๊ฐ ๋์ค๋ฉด์
[webpack-dev-server] Loopback: http://localhost:8000/ ์ ํด๋น ๋งํฌ๋ฅผ ๋๋ฌ์ ํ์ธ์ด ๋๋ฉด ์ ๋๋ก ๋๊ฑฐ๋ค!
mode: development ์ mode: production ์ ๋ฐ๋ผ ๋ค๋ฅธ config ํ์ผ์ ๋ง๋ค๊ณ
์ด๊ฑธ ํฉ์ณ์ฃผ๋ ๋
์์ด ํ์ํ๋ฐ ์ด๋ merge๋ package๊ฐ ์ํํ๋ค๊ณ ํ๋ค.
๊ฐ๊ธฐ ๋ค๋ฅธ ์ฑ๊ฒฉ์ ๊ฐ์ง ํ์ผ๋ค
webpack.common.js, webpack.dev.js, webpack.prod.js
์๋ webpack.config.js ํ์ผ์ด ์๋ root ์ ๋ง๋ค๊ณ webpack.config.js ์ง์ฐ๊ธฐ
(CLI ๋ก ๋ง๋ค๊ฑฐ๋ ์ง์ ๋ง๋ค๊ธฐ)
mode: production ์์ ํ์ํ ๊ฒ : mini-css-extract-plugin (style-loader ๋์ ), css-minimizer-webpack-plugin, devtool, targetmode: development ์์ ํ์ํ ๊ฒ : webpack-dev-server, target์ด config ํ์ผ๋ค์ ํฉ์ณ์ค ์ ์๋ webpack-merge ๋ฅผ CLI ์์ ์ค์นํ๋ค.
webpack.common.js
๊ณตํต ํ์ผ์ ๋ง๋๋ ๋๋์ผ๋ก, ๊ธฐ์กด์webpack.config.jsํ์ผ์์
mode,devServer,devtool,style-loader์ ์ญ์ ํ๋ค.
์ถ๊ฐ๋ก ์ฐ๋ฆฌ๋ github ๋ฐฐํฌ๋ฅผ docs ํ์ผ๋ก ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
output ์ path ๋ฅผpath: path.resolve(__dirname, "docs"),๋ก ๋ณ๊ฒฝํ๊ธฐ
webpack.dev.js
mode,devServer.devtool์ถ๊ฐconst { merge } = require("webpack-merge"); const common = require("./webpack.common.js"); // ์ฒซ๋ฒ์งธ ์ธ์๋ style-loader๋ฅผ ๋ฃ์ด์ฃผ๊ธฐ ์ํจ???? const customizedDevCommon = { ...common, module: { rules: [ { test: /\.css$/i, use: ["style-loader", "css-loader"], exclude: /node-modules/, } ], }, }; // module.exports = merge(customizedDevCommon, { mode: "development", devServer: { port: 8000, } devtool: "eval-source-map", // ๊ฐ๋ฐ์ ๋ชจ๋์์ ์ถ์ฒํ๋ sourceMap })
webpack.prod.js
MiniCssExtractPlugin์ loader ๋ plugin ์ ๋ฑ๋กํ๊ณ
CssMinimizerPlugin์ ์ต์ ํ์ ๋ฑ๋กconst { merge } = require("webpack-merge"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const CssMinimizerPlugin = require("css-minimizer-plugin"); const common = require("./webpack.common.js"); // ์ฒซ๋ฒ์งธ ์ธ์๋ MiniCssExtractPlugin ๋ฃ์ด์ฃผ๊ธฐ ์ํจ const customizedDevCommon = { ...common, module: { rules: [ { test: /\.css$/i, use: [MiniCssExtractPlugin.loader, "css-loader"], // MiniCssExtractPlugin loader ๋ฑ๋ก exclude: /node-modules/, } ], }, }; // module.exports = merge(customizedDevCommon, { mode: "production", optimization: { minimizer: [new CssMinimizerPlugin()], }, plugins: [new MiniCssExtractPlugin()], })
webpack ์ด mode์ ๋ง๊ฒ ์คํ๋ ์ ์๊ฒ
package.json ์ script๋ฅผ ์๋ง๊ฒ ๋ฐ๊ฟ์ฃผ์
"script" ๊ฐ์ฒด ์์ "dev": "webpack serve --open --config webpack.dev.js", ๋ก ๋ฐ๊ฟ์ฃผ๊ณ
"build": "webpack --config webpack.prod.js", ์ถ๊ฐํ๊ธฐ
agora-state-reference ๋ฅผ clone ํด์๊ธฐ ๋๋ฌธ์
CLI ์์ rm -rf .git .github ๋ก ์๋ git์ ์ง์์ฃผ๊ณ
git init ์ผ๋ก ๋ค์ ์ค์ ํ๋ค.
git remote add origin ์ฌ๊ธฐ์์์ฑํ๋ ํฌ์งํ ๋ฆฌ์SSH๋ฃ๊ธฐ ํ๊ณ ์ํฐ
CLI ์์ npm i -D gh-pages ํ๊ณ ,
package.json ์ ๋ช
๋ น์ด๋ฅผ ์ถ๊ฐํ๋ค.
์ฐ์ "script" ๊ฐ์ฒด ์์ "deploy": "gh-pages -d dist", ์ถ๊ฐํ๊ณ ,
"homepage" ๋ค์ ์๋ ๊ฐ์ ์๋ ์ฒ๋ผ ๋ด github์ด๋ฆ๊ณผ ๋ ํฌ์งํ ๋ฆฌ ์ด๋ฆ์ผ๋ก ๋ณ๊ฒฝํ๋ค.
"https://๊นํ์์ด๋.github.io/์์ฑํ๋๋ ํฌ์งํ ๋ฆฌ์ด๋ฆ",
์์: "https://moonozz.github.io/webpack-ad-practice",
์ ๋ถ ๋ค ํ๊ณ npm run build ๋ฅผ ํ ํ์
CLI ์ npm run deploy ํ๋ฉด
์๋ branch ์์ gh-pages ๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด ์ค ํ์ ์์ด
gh-pages package ๋ฅผ ์ฌ์ฉํด์ ์๋์ผ๋ก github page ์ ๋ฐฐํฌํ๋ค.
webpack.common.js ์ plugins ์ template ์ ์๋ชป ์ ์๋ค.
๋๋ index.html์ด src์ ์์ผ๋๊น
template: path.resolve(__dirname, "./src/index.html"), ์ด๋ ๊ฒ ์ ์ด์ผ ํจ!
๋ง์ฝ ๊ฐ์ root ์ ์๋ค๋ฉด template: "./index.html", ์ด๋ ๊ฒ ์ ์ผ๋ฉด ๋๋ค.
๋ฐฐํฌ์์ 404์๋ฌ๊ฐ ๋ ์ ๋ฌผ์ด๋ดค๋๋ฐ..
package.json ์ homepage ์์ url ๋งํฌ๋ฅผ ์ ๋๋ก ์
๋ ฅํ์ง ์์๋ค..ใ
์์ ์ค์ ์กฐ์ฌํ์!!!
์ถ์ฒ : ๋ฐ๊ธฐ์ ์งฑ๐