๋ฒ๋ค๋ง : ๋ชจ๋ ํ์ผ๋ค์ ํ๋ํ๋์ ๋ชจ๋๋ก ๋ณด๊ณ , ์ด ๋ชจ๋๋ค์ ๋ฐฐํฌ์ฉ์ผ๋ก ๋ณํฉํ๊ณ ํฌ์ฅํ๋ ์์ .(์ต์ ํ๋ ํด์ค)
์ด๋ฌํ ๋ฒ๋ค๋ง ์์ ์ ์ํํ๋ ํด์ ๋ฒ๋ค๋ฌ๋ผ๊ณ ํ๋ค.
ํ์ฌ ์์ ์์๋ ๋ฒ๋ค๋ฌ ์ค์์ '์นํฉ'์ด ๊ฐ์ฅ ์ธ๊ธฐ๊ฐ ๋ง๋ค.
์ฒ์ package.json ์ํ
{
"name": "webpack-test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"build": "cross-env NODE_ENV=production webpack --progress",
"start": "webpack serve --progress"
},
"keywords": [],
"author": "",
"license": "ISC"
}
webpack.config.js
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');
const CopyWebpackPlugin = require("copy-webpack-plugin");
const webpackMode = process.env.NODE_ENV || 'development';
module.exports = {
mode: webpackMode,
entry: {
main: './src/main.js',
},
output: {
path: path.resolve('./dist'),
filename: '[name].min.js'
},
// es5๋ก ๋น๋ ํด์ผ ํ ๊ฒฝ์ฐ ์ฃผ์ ์ ๊ฑฐ
// ๋จ, ์ด๊ฑฐ ์ค์ ํ๋ฉด webpack-dev-server 3๋ฒ๋ ๋ฒ์ ์์ live reloading ๋์ ์ํจ
// target: ['web', 'es5'],
devServer: {
liveReload: true
},
optimization: {
minimizer: webpackMode === 'production' ? [
new TerserPlugin({
terserOptions: {
compress: {
drop_console: true
}
}
})
] : [],
splitChunks: {
chunks: 'all'
}
},
module: {
rules: [
{
test: /\.js$/,
loader: 'babel-loader',
exclude: /node_modules/
},
{
test: /\.js$/,
enforce: 'pre',
use: ['source-map-loader'],
}
]
},
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html',
minify: process.env.NODE_ENV === 'production' ? {
collapseWhitespace: true,
removeComments: true,
} : false
}),
new CleanWebpackPlugin(),
// CopyWebpackPlugin: ๊ทธ๋๋ก ๋ณต์ฌํ ํ์ผ๋ค์ ์ค์ ํ๋ ํ๋ฌ๊ทธ์ธ
// ์๋ patterns์ ์ค์ ํ ํ์ผ/ํด๋๋ ๋น๋ ์ dist ํด๋์ ์๋ ์์ฑ
// patterns์ ์ค์ ํ ๊ฒฝ๋ก์ ํด๋น ํ์ผ์ด ์์ผ๋ฉด ์๋ฌ ๋ฐ์
// ์ฌ์ฉํ๋ ํ์ผ์ด๋ ํด๋ ์ด๋ฆ์ด ๋ค๋ฅด๋ค๋ฉด ๋ณ๊ฒฝ
// ๊ทธ๋๋ก ์ฌ์ฉํ ํ์ผ๋ค์ด ์๋ค๋ฉด CopyWebpackPlugin ํต์งธ ์ฃผ์ ์ฒ๋ฆฌ
new CopyWebpackPlugin({ //์ฌ๊ธฐ์๋ dist ํด๋์ ๊ทธ๋๋ก ๋ณต์ ์ํฌ ํ์ผ๋ค์ ์์ฑ
patterns: [
{ from: "./src/style.css", to: "./style.css" },
{ from: "./src/images", to: "./images" },
],
})
]
};
<1> ์ด๋ ๊ฒ ํ ์๋ ์์ง๋ง ์๋ <2>๋ฅผ ํฐ๋ฏธ๋์ ์ ์ฉ
JS๋ง ๊ฐ๋จํ ๋น๋ํ๋ ์นํฉ ์ธํ
1. ํจํค์ง ์ค์น
npm i -D @babel/cli @babel/core @babel/preset-env babel-loader clean-webpack-plugin core-js cross-env terser-webpack-plugin webpack webpack-cli
2. ๋น๋(๋ฐฐํฌ์ฉ ํ์ผ ์์ฑ) : ๊ฐ๋ฐ ํ ์ต์ข
์ค์ ๋ก ์๋น์คํ ๋ฐฐํฌ์ฉ ํ์ผ. ์ฌ์ค์ ๋ฒ๋ค๋ง, ์ต์ข
ํ์ผ์ ๋ง๋๋ ์์
npm run build
(!)
npm run build ์คํ ์ ์๋ฌ๊ฐ ๋๋ค๋ฉด Node.js๋ฅผ LTS ๋ฒ์ (์ฅ๊ธฐ ์ง์ ๋ฒ์ )์ผ๋ก ์ค์น ํ ๋ค์ ์๋
n lts
<2> ์ ์ฉ ํ ๊ฒฐ๊ณผ๋
1. ํจํค์ง ์ค์น : -D ๋ ๊ฐ๋ฐ์์๋ง ์ด๋ค๋ ๊ฒ์ ๋ช
์
npm i -D @babel/cli @babel/core @babel/preset-env babel-loader clean-webpack-plugin copy-webpack-plugin core-js cross-env html-webpack-plugin source-map-loader terser-webpack-plugin webpack webpack-cli webpack-dev-server
2. ๊ฐ๋ฐ์ฉ ์๋ฒ ๊ตฌ๋
npm start
3. ๋น๋(๋ฐฐํฌ์ฉ ํ์ผ ์์ฑ)
npm run build
(!)
npm start ๋๋ npm run build ์คํ ์ ์๋ฌ๊ฐ ๋๋ค๋ฉด Node.js๋ฅผ LTS ๋ฒ์ (์ฅ๊ธฐ ์ง์ ๋ฒ์ )์ผ๋ก ์ค์น ํ ๋ค์ ์๋
n lts
(!)
ERROR in unable to locate '๊ฒฝ๋ก...'
์์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ฉด, webpack.config.js์ CopyWebpackPlugin์ ์ค์ ๋ ํ์ผ์ด ์๋์ง ํ์ธ
CSS๋ ์ด๋ฏธ์ง ํด๋ ๋ฑ์ด ํ์ํ์ง ์๋ค๋ฉด webpack.config.js์์ CopyWebpackPlugin ๋ถ๋ถ ์ ์ฒด๋ฅผ ์ฃผ์ ์ฒ๋ฆฌ
<2>์์ 1 ํฐ๋ฏธ๋ ์ ๋ ฅ ํ package.json ์ํ
{
"name": "webpack-test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"build": "cross-env NODE_ENV=production webpack --progress",
"start": "webpack serve --progress"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@babel/cli": "^7.17.10",
"@babel/core": "^7.17.10",
"@babel/preset-env": "^7.17.10",
"babel-loader": "^8.2.5",
"clean-webpack-plugin": "^4.0.0",
"copy-webpack-plugin": "^10.2.4",
"core-js": "^3.22.4",
"cross-env": "^7.0.3",
"html-webpack-plugin": "^5.5.0",
"source-map-loader": "^3.0.1",
"terser-webpack-plugin": "^5.3.1",
"webpack": "^5.72.0",
"webpack-cli": "^4.9.2",
"webpack-dev-server": "^4.9.0"
}
}
ํ์ ์, ์ ํจํค์ง ํ์ผ๋ง ์๋ค๋ฉด
npm i๋ฅผ ์ ๋ ฅํด์ฃผ๋ฉด, ํ์ ์๋๋ฐฉ๋ ํจํค์ง๋ค์ ์๋ ์ค์น๋ฐ์ ๋ณผ ์ ์๋ค.
์นํฉ์ ๊ฐ๋ฐํ ๋๋ง ์ฐ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ -D ์ต์ ์ ๋ฃ์ด์ฃผ๋๋ก ํ์
<2>2. ๊ฐ๋ฐ์ฉ ์๋ฒ ๊ตฌ๋ : ์ข
๋ฃ๋ ์ปจํธ๋กค c
npm start : ์ฑ๊ณต์ ์ผ๋ก ๊ตฌ๋์ด ๋๋ฉด ํฐ๋ฏธ๋์ ์ฃผ์๊ฐ์ด ๋์จ๋ค. ํด๋น ์ฃผ์์ ๋ค์ด๊ฐ๋ฉด ์น์ ๋ณผ ์ ์๋ค.
ํต์ src ํด๋์ ํ๋ก์ ํธ ํ์ผ๋ค์ ๋ด์ ๋๋ค.
<3>3. ๋น๋(๋ฐฐํฌ์ฉ ํ์ผ ์์ฑ)
npm run build
dist ๋ผ๋ ์๋ก์ด ํด๋๊ฐ ์์ฑ๋๊ณ , ์ต์ข ๋ฐฐํฌ์ฉ ํ์ผ๋ค์ ํ์ธํ ์ ์๋ค(๋ค ์ต์ ํ, ์์ถ๋ ์ํ)
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');
const CopyWebpackPlugin = require("copy-webpack-plugin");
const webpackMode = process.env.NODE_ENV || 'development';
module.exports = {
mode: webpackMode,
entry: {
main: './src/main.js', //์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ ๋น๋ํ ๋, ์์์ ์ด ๋๋ ํ์ผ(์ํธ๋ฆฌ ๊ธฐ์ค ํ์ผ)
},
output: { //๋น๋ํ์ ๋ dist ํ์ผ์ด ์๋ ์์ฑ๋๋ฉด์ ๊ทธ ์์ ๋ฒ๋ค๋ง๋ ํ์ผ๋ค์ด ์๊ฒจ๋จ
path: path.resolve('./dist'),
filename: '[name].min.js' //ํ์ผ ์ด๋ฆ๊น์ง ์ง์ ๊ฐ๋ฅ
},
// es5๋ก ๋น๋ ํด์ผ ํ ๊ฒฝ์ฐ ์ฃผ์ ์ ๊ฑฐ
// ๋จ, ์ด๊ฑฐ ์ค์ ํ๋ฉด webpack-dev-server 3๋ฒ๋ ๋ฒ์ ์์ live reloading ๋์ ์ํจ
// target: ['web', 'es5'],
devServer: {
liveReload: true //์๋ ์๋ก๊ณ ์นจ ์ค์
},
optimization: {
minimizer: webpackMode === 'production' ? [
new TerserPlugin({ //๋น๋ํ ๋ ์ฝ๋ ์์ถ๋๋๋ก
terserOptions: {
compress: {
drop_console: true //์ฐ์ด๋์ ์ฝ์๋ก๊ทธ ์ง์ฐ๊ธฐ
}
}
})
] : [],
splitChunks: {
chunks: 'all'
}
},
module: {
rules: [
{
test: /\.js$/,
loader: 'babel-loader',
exclude: /node_modules/
},
{
test: /\.js$/,
enforce: 'pre',
use: ['source-map-loader'],
}
]
},
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html',
minify: process.env.NODE_ENV === 'production' ? {
collapseWhitespace: true,
removeComments: true,
} : false
}),
new CleanWebpackPlugin(),
new CopyWebpackPlugin({
patterns: [
{ from: "./src/main.css", to: "./main.css" },
{ from: "./src/images", to: "./images" },
],
})
]
};
<์นํฉ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ฒ๋ค๋งํด๋ณด๊ธฐ>
babel.config.js : ๋ฐ๋ฒจ์ ์ต์ ๋ฌธ๋ฒ์ผ๋ก ์์ฑ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฒ์ ์ ๋ค์ด๊ทธ๋ ์ด๋ ์์ผ์ฃผ๋ ์ญํ ์ ํ๋ค.
์์ ๋ธ๋ผ์ฐ์ ์๋ ์ ๋์๊ฐ๊ฒ๋ ํ๊ธฐ ์ํจ ( ํธ๋์คํ์ผ๋ฌ)
ํนํ ๋ฐ๋ฒจ์ ์นํฉ๊ณผ์ ์กฐํฉ์ด ์ข๊ธฐ์ ๋ณดํต ์นํฉ์ ์ฐ๋ฉด ์นํฉ์ ๋ฐ๋ฒจ์ ๋ก๋๋ก ๋ถ๋ฌ์์ ๊ฐ์ด ์คํํด์ค๋ค.
module.exports = {
presets: [
['@babel/preset-env', {
targets: {
chrome: '58',
ie: '11',
},
useBuiltIns: 'usage',
corejs: {
version: 3,
}
}]
]
};
'Javascript > FE ๊ฐ๋ฐํ๊ฒฝ์ค์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[FE ๋ฒ๋ค๋ฌ] parceljs (0) | 2022.05.07 |
---|---|
node.js ์ด์ฉํด์ ํ๋ก ํธ์๋ ๊ฐ๋ฐ ํ๋ก์ ํธ ์์ฑํ๊ธฐ (0) | 2022.03.26 |