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
, target
mode: 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 ๋งํฌ๋ฅผ ์ ๋๋ก ์
๋ ฅํ์ง ์์๋ค..ใ
์์ ์ค์ ์กฐ์ฌํ์!!!
์ถ์ฒ : ๋ฐ๊ธฐ์ ์งฑ๐