์นํฉ(module bundler) ์ฐ๋ ์ด์
2000๋ ๋ ์ด๋ฐ์ ์นํ์ด์ง๋ ๊ฐ ํ์ด์ง๋ง๋ค ์๋ก์ด html์ ์์ฒญํด์ ํ๋ฉด์ ๋ํ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ DOM์ ์กฐ์ํ๋ ๊ฐ๋จํ ์ญํ ๋ง ํ์๊ธฐ ๋๋ฌธ์ html์ scriptํ๊ทธ์ ๋ฃ๋ ๊ฒ์ผ๋ก๋ ์ถฉ๋ถํ๋ค. ajax๊ฐ ์ ํํ์ ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋น์ค์ด ์กฐ๊ธ ๋ ์ปค์ก์ง๋ง ๊ทธ๋ ๋ด์ผ ํ์ด์ง๋น ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ ๋ช ๊ฐ๋ฉด ์ถฉ๋ถํ๋ค SPA(single page app)๋ ํ๋์ html์ ์์ญ, ์๋ฐฑ ๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ํฌํจํ๊ธฐ ๋๋ฌธ์ ๋ ์ด์ ๊ธฐ์กด ๋ฐฉ์์ด ํตํ ๋ฆฌ ์์๋ค.
<html>
<head>
<link rel="stylesheet" type="text/css" href="javascript_file_1js">
<link rel="stylesheet" type="text/css" href="javascript_file_2js">
๊ธฐํ ์๋ง์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ
<link rel="stylesheet" type="text/css" href="javascript_file_999js">
</head>
</html>
์์ ๋ฐฉ์์ผ๋ก๋ ๊ณ์ ๋์ด๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๊ด๋ฆฌํ๊ธฐ ํ๋ค๋ค. ๋ํ ์ ์ธ๋๋ ์์๋ ์ ๊ฒฝ ์จ์ผ ํ๊ณ , ๊ธฐ์กด์ ์์ฑ๋ ์ ์ญ ๋ณ์๋ฅผ ๋ฎ์ด์ฐ๋ ์ํ๋ ์กด์ฌํ๋ค.
๋ชจ๋ ์์คํ
์ด ํ์ํ๋ค
์๋ฐ์คํฌ๋ฆฝํธ๋ ํ์์ด ๋ธ๋ผ์ฐ์ ์ ์ข
์์ ์ด์๊ธฐ ๋๋ฌธ์ ์์ฒด์ ์ธ ๋ชจ๋ ์์คํ
์ด ์์๋ค. ๋ชจ๋ ์์คํ
์ C++์ด๋ ์๋ฐ์์ include๋ import ํค์๋๋ฅผ ๋ ์ฌ๋ฆฌ๋ฉด ์ดํดํ๊ธฐ ์ฝ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์ต์ ํ์ค์ธ ES6๋ถํฐ ๋ชจ๋ ์์คํ
์ด ํฌํจ๋์ง๋ง ์์ง ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ง์ํ์ง ์๊ณ ์๋ค. ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ง์ํ๋ค ํ๋๋ผ๋ ๋ค์์ ์ ๋ช
ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ES6 ํ์ค์ผ๋ก ์์ฑ๋์ง ์์๋ค๋ ๊ฒ ํฐ ๊ฑธ๋ฆผ๋์ด๋ค.
๋ธ๋ผ์ฐ์ ์ ์ฝ๋งค์ด์ง ๋ง์
์์ ๋ถํฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ธ๋ผ์ฐ์ ๋ฐ์์ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ค๋ ๋
ธ๋ ฅ์ด ์์๋ค. ๋ํ์ ์ธ ํ์ค ์์ํ๋ CommonJS, AMD๊ฐ ์๋ค. ์ด๋ค์ด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ฒ์ฉ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด์ ํ๋ ๋๋ถ๋ถ์ ์ผ์ ๋ชจ๋ ์์คํ
์ ์ ์ํ๋ ์ผ์ด์๋ค. ๊ทธ๋ฆฌํ์ฌ nodejs ๊ฐ์ ํ๋ ์์ํฌ๊ฐ ๋ฑ์ฅํ ์ ์์๊ณ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์๋ฒ์์ ๋์๊ฐ๋ ์ธ์์ด ๋์๋ค.
SPA๊ฐ๋ฐ์ webpack๊ณผ ํจ๊ป
webpack์ CommonJS์ AMD ์คํ ๋ชจ๋๋ฅผ ์ง์ํ๋ค. webpack์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ํ๋์ ํ์ผ(์ํ๋ค๋ฉด ์ฌ๋ฌ ๊ฐ)๋ก ์ปดํ์ผํ ์ ์๋ค. ๊ทธ๋ฆฌํ์ฌ SPA๊ฐ๋ฐ ์ html์๋ ์ปดํ์ผ๋ ํ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ง ํฌํจ์ํค๋ฉด ๋๋ค ๊ณ ๋ง์ด ์ ์ ES6 ํ์ค์ผ๋ก ์์ฑ๋์ง ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์์ ์ ์ฒ๋ฆฌํด์ค๋ค๋ ์ ์ด๋ค ๋ฐ๋ผ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ npm์ผ๋ก ์ค์น ํ ํ์ํ ๋ถ๋ถ์ import๋ง ํ๋ฉด ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
webpack์ ์ฅ์ 1: ํ์ผ ๋ถํ ๊ธฐ๋ฅ
์๋ฐฑ ๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ํ๋์ ํ์ผ๋ก ์ปดํ์ผํ๋ ๊ฑด ์ข์ ์๊ฐ์ด ์๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ฉ์๊ฐ ์ฒซ ํ์ด์ง๋ฅผ ๋ณด๊ธฐ ์ํด ๋ช ์ด๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ ์๋ ์๋ค webpack์๋ ๋ค์ํ ํ์ผ ๋ถํ ๊ธฐ๋ฅ์ด ์๋ค.
vendor์ฝ๋๋ง ๋ฐ๋ก ๋ถ๋ฆฌํด์ ํ๋์ ํ์ผ๋ก ๋ง๋ค ์ ์๋ค. vendor์ฝ๋๋ ์์ฃผ ๋ณ๊ฒฝ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์ ์บ์ฑ ํ ์ค๋ซ๋์ ์ฌ์ฌ์ฉ๋ ์ ์๋ค ์ด ๋ฐฉ๋ฒ๋ง ์ฌ์ฉํด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์๋น ๋ถ๋ถ ๋์ด์ฌ๋ฆด ์ ์๋ค ํ์ง๋ง ์ฒซ ๋ฐฉ๋ฌธ์์ ๊ฒฝ์ฐ์๋ ์๋ฏธ๊ฐ ์๋ค.
requireensure ๊ตฌ๋ฌธ์ ์ฌ์ฉํด์ ํ์ผ ๋ถํ ์ ์ง์ ํ ์ ์๋ค. ์ด ๋ฐฉ๋ฒ์ requireensure ๊ตฌ๋ฌธ์ ์คํํ ๋ ํ์ํ ํ์ผ์ on-demand๋ก ๋ค์ด๋ก๋ํ๋ค(webpack์ด ์์์ ํด์ค๋ค-_-b) ๋ฐ๋ผ์ ์ฒซ ๋ฐฉ๋ฌธ์์ ๊ฒฝ์ฐ์๋ ์ ์ฒด ์ฝ๋๋ฅผ ๋ค์ด๋ก๋ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ ์๋๊ฐ ๋น ๋ฅด๋ค ์ฒซ ํ์ด์ง ๋ก๋ฉ์ ๋น ๋ฅด์ง๋ง ์ดํ ํ์ํ ๋ถ๋ถ์ ํ์ผ์ ๋ค์ด๋ก๋ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ถํ ๋ ์ฝ๋์ ํฌ๊ธฐ๊ฐ ๋๋ฌด ํฌ์ง ์๋๋ก ์ฃผ์ํด์ผ ํ๋ค react์์๋ route๋ณ๋ก ํ์ผ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ด ๋ง์ด ์ฌ์ฉ๋๋ค. webpack์์๋ ์ปดํ์ผ๋ ํ์ผ์ ์ด๋ฆ์ hash๊ฐ์ ๋ถ์ด๋ ๊ธฐ๋ฅ์ด ๋ง์ด ์ฌ์ฉ๋๋ค. ํด๋น ํ์ผ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง hash๊ฐ์ด ๋ณ๊ฒฝ๋๋ค ๋ฐ๋ผ์ ๋ณ๊ฒฝ๋์ง ์์ ํ์ผ์ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์ ์บ์ฑ๋ ํ์ผ์ด ์ฌํ์ฉ๋๋ค.
webpack์ ์ฅ์ 2: ๋ค์ํ loader๋ฅผ ์ฌ์ฉํ ์ ์๋ค
๋๋ถ๋ถ์ loader๋ ํ์ผ์ ์
๋ ฅ์ผ๋ก ๋ฐ์์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ์ถ๋ ฅํด์ค๋ค. loader๋ฅผ ์ฌ์ฉํ๋ฉด webpack์ด ์ปดํ์ผ์ ํ๊ธฐ ์ ์ ์ํ๋ ํ์ผ์ ๋ํด์ ์ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค jsx๋ผ๋ react ๊ณ ์ ์ ๋ฌธ๋ฒ์ผ๋ก ์์ฑ๋ ํ์ผ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ก ๋ณํํ ๋ ๋ง์ด ์ฐ์ธ๋ค. ๊ทธ ์ธ์๋ babel-loader๋ฅผ ์ด์ฉํด์ ES6, ES7๊ณผ ๊ฐ์ ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ ์ฌ์ฉํ ์๋ ์๋ค. ์ฌ๋ฌ ๊ฐ์ loader๋ฅผ ์ฒด์ธ ํ์์ผ๋ก ๋ฌถ์ ์๋ ์๋ค ์๋ฅผ ๋ค์ด babel-loader์ eslint-loader๋ฅผ ๋ฌถ์ด์ ๋จผ์ eslint๋ก ์ ์ ๋ถ์์ ํ๊ณ ์ฑ๊ณตํ๋ฉด babel-loader๊ฐ jsxํ์ผ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ก ๋ณํํ๊ฒ ํ ์ ์๋ค.
๋ ๋ค๋ฅธ ๋ํ์ ์ธ ์๋ style-loader์ css-loader๋ฅผ ๊ฐ์ด ์ฐ๋ ๊ฒฝ์ฐ์ด๋ค css๋ฅผ ์ฌ์ฉํ ๋ ์ด๋ ค์ด ์ ์ค์ ํ๋๊ฐ ํด๋์ค ์ด๋ฆ์ ๊ฒน์น์ง ์๊ฒ ์ ์ํ๋ ๊ฒ์ด๋ค css-loader๋ import ํ๋ ๋ชจ๋์ id๊ฐ์ ํด๋์ค ์ด๋ฆ์ ์๋์ผ๋ก ๋ถ์ฌ์ฃผ๋ ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์๋ค ๋ฐ๋ผ์ ๋จ์ํ ํด๋์ค ์ด๋ฆ์ ‘button’์ผ๋ก ์ ์ํ๋๋ผ๋ ์ด๋ฆ์ด ๊ฒน์น ๊น ๋ด ๊ฑฑ์ ํ ํ์๊ฐ ์์ด์ง๋ค style-loader๋ css-loader๊ฐ ์ถ๋ ฅํ๋ css์ ๋ณด๋ฅผ ๋ฐ์์ styleํ๊ทธ๋ก ๋ง๋ค๊ณ ๊ทธ๊ฒ์ DOM์ ๋ถ์ฌ์ค๋ค.
์นํฉ ์ค์น
npm i webpack webpack-cli
// webpack: package we use in a file
// webpack-cli: package we use in the console
์นํฉ ํด๋ ์ค์ ๋ฒ
package.json ํ์ผ
"scripts": {
"dev:server": "nodemon --exec npx babel-node init.js",
"dev:assets": "cross-env WEBPACK_ENV=development webpack -w",
"build:assets": "cross-env WEBPACK_ENV=production webpack"
}
- dev:assets: ์นํฉ์ ๋ถ๋ฌ์ค๋ ์ญํ
- build:assets: ์นํฉ์ ์๋ฒ๋ก ์ฌ๋ ค์ฃผ๋ ์ญํ
- -w : --watch: webpack can watch files and recompile whenever they change build assets webpack
- npm run dev:server๋ก ์คํ
webpack.config.js ํ์ผ
: Default file that webpack looks for when we call it
1) ์๋ฒ์ ์ฐ๊ฒฐ์ํค๋ ์ฝ๋๋ ์๊ณ , 100% ํด๋ผ์ด์ธํธ ์ฝ๋์ ๊ด๋ จ๋์ด์๋ค.
2) ๋ฐ๋ฒจ๋ ธ๋๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ์ ๊ตฌ๋ฒ์ ์ฝ๋๋ฅผ ์จ์ ์์ฑํ๋ค.
3) config ๊ฐ์ฒด์ ์ค์ ์ ๋ฃ์ด์ผ ์นํฉ์ด ๋น๋ก์ ํ์ผ ๋ค๋ฃจ๋ ๋ฒ์์๊ฒ๋๋ค.
4) Write all the transform instructions for webpack in the 'rules' array inside of the 'modules' object
const path = require("path");
// path๋ node.js์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊น๋ ค์๋ ํจํค์ง๋ค.
// ํ์ผ์ ๊ฐ์ ธ์ค๊ธฐ ์ํด path์ฌ์ฉ
const Dotenv = require("dotenv-webpack");
const MODE = process.env.WEBPACK_ENV;
//env๋ฅผ webpack์ด ๋๊ฒจ๋ฐ์ง ๋ชปํด์ ์๋์ผ๋ก env๋ฅผ ๋๊ฒจ๋ฐ๋๋ก ํ๋ค.
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const ENTRY_FILE = path.resolve(__dirname, "assets", "js", "script.js");
// entry: ํ์ฌ ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ/assets/js/main.js
// path.resolve(): used to resolve a sequence of path-segments to an absolute path.
const OUTPUT_DIR = path.join(__dirname, "static");
// output: ํ์ฌ ํ๋ก์ ํธ /static
// path.join(): joins the specified path segments into one path.
const config = {
entry: ENTRY_FILE,
output: {
path: OUTPUT_DIR,
filename: "[name].js",
},
module.exports = {
entry: ENTRY_FILE,
output: {
filename: "[name].js",
path: OUTPUT_DIR,
},
mode: MODE,
module: {
rules: [
{
test: /\.js$/,
exclude: "/node_modules",
use: ["babel-loader"],
},
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, "css-loader"],
},
],
},
plugins: [
new MiniCssExtractPlugin({
filename: "styles.css",
}),
],
devtool: "source-map",
};
module.config = config
// export dafault config;
- ์ ๋๊ฒฝ๋ก(Absolute path): C:/users/documents/projects
- ์๋๊ฒฝ๋ก(Relative path): ./projects
- ์์, ์์ ๋๋ ํ ๋ฆฌ: ../../, ๋ฃจํธ ๋๋ ํ ๋ฆฌ:/
- __dirname: ํ์ฌ ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ ์ด๋ฆ, Node.js ์ ์ญ ๋ณ์
- entry: ํ์ผ์ด ์ด๋์ ์๋๊ฐ, is a path to the root file of our app
- output: ๊ทธ๊ฑธ ์ด๋์ ๋ฃ์ ๊ฒ์ธ๊ฐ, is a path to the directroy where all the transformed assets should go
- Loaders: teach webpack how to transform the files, loaders used From last to fisrst in webpack
- "modules" object
- allows us to specify different transformations for different file formats.
- How many loaders can we have inside if one rule? -> min1, max inf
- devtool: "source-map"
SCSS์ถ๊ฐํ๊ธฐ
Webpack ๊ธฐ์ด
์ด ๊ธ์ React ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ตฌ์ถํ๋ฉด์ ๋ฐฐ์ฐ๋ Webpack ๊ธฐ์ด(https://velog.io/@jeff0720/React-๊ฐ๋ฐ-ํ๊ฒฝ์-๊ตฌ์ถํ๋ฉด์-๋ฐฐ์ฐ๋-Webpack-๊ธฐ์ด) )๋ฅผ ๋ฐ๋ผํ๋ฉด์ ์ ์ ๊ธ์ ๋๋ค. Webpack์ ๊ฐ๋ 1CNeQyaChrTh0H3ovOd9Dgg.png
velog.io
test: /\.(scss)$/
1. SCSS์ธ ํ์ผ์ ์ ๋ถ ์ฐพ์๋ผ
use
2. ๊ฐ์ฅ๋จผ์ CSS๋ก ๋ฐ๊พธ๊ณ
3. CSS์ ํด๋นํ๋ ํ ์คํธ ๋ถ๋ถ๋ง ์ถ์ถํด์
4. ์ถ์ถ๋ CSS๋ฅผ ๋ถ๋ฆฌ๋ ํ๋์ ํ์ผ๋ก ๋ง๋ค๊ธฐ
postcss-loader
autoprefixer๋ผ๋ ์ต์ ์ ํตํด ๋ค์ํ ์น ๋ธ๋ผ์ฐ์ ์์ ํธํ๊ฐ๋ฅํ css์ฝ๋๋ก ๋ณํ์์ผ์ค๋ค.
'๐ Back > ๐งฉ Node.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Aws s3 (0) | 2021.03.09 |
---|---|
Multer: ํ์ผ ์ ์ฅ ๋ฏธ๋ค์จ์ด (0) | 2021.02.14 |
์ฌ์ฉ์ ์ธ์ฆ ๋ฏธ๋ค์จ์ด: PassportJS (0) | 2021.02.12 |
mixin: ๊ฐ์ ํ์์ ๋ชจ๋ํํ์ฌ ๋๋๋งํ๊ธฐ (0) | 2021.01.25 |
View Engine <PUG> <res. locals> (0) | 2021.01.25 |