π» Webpack μ΄λ?
Webpackμ νλ‘μ νΈμ μν¬νΈλ μ¬λ¬ λͺ¨λλ€μ μμ‘΄μ±μ λ°λΌ λ¬Άμ΄μ£Όμ΄, νλ μ΄μμ λ²λ€μ μμ±ν΄ μ£Όλ λ²λ€λ¬(bundler)μ ν μ’ λ₯ μ λλ€. νλ‘μ νΈμ κ·λͺ¨κ° 컀μ§κ²λκ³ μν¬νΈνλ λͺ¨λλ€μ΄ λ§μμ§μλ‘ λ²λ€λ¬μ μ€μμ±μ΄ 컀μ§κ² λμλλ° κ·Έ μ΄μ λ₯Ό μμλ³΄κ² μ΅λλ€.
μλμ κ°μ λκ°μ JavaScript νμΌμ΄ μλ€κ³ κ°μ ν΄λ³΄κ² μ΅λλ€.
1
2
3
4
5
// src/intro.js
function intro() {
console.log("this is intro page");
}
1
2
3
// src/index.js
intro();
intro.js
λ λ¨μν λ©μΈμ§ μΆλ ₯νλ ν¨μλ₯Ό μ μν νμΌμ΄λ©°, index.js
λ μ μν ν¨μλ₯Ό νΈμΆνκ³ μμ΅λλ€. μ΄μ λ νμΌμ html
νμΌμ μν¬νΈ ν΄λ³΄κ² μ΅λλ€.
1
2
3
4
5
<!-- index.html -->
<body>
<script src="./src/intro.js"></script>
<script src="./src/index.js"></script>
</body>
μ λ¨κ³κΉμ§ λ§μΉ ν html
νμΌμ μ€νν΄λ³΄λ©΄, μ½μμ°½μ this is intro page
λΌλ λ©μΈμ§κ° μΆλ ₯λ©λλ€.
λ§μ½ html
νμΌμ μν¬νΈ μμλ₯Ό λ°κΎΈκ²λλ©΄, μ¬λ°λ₯Έ κ²°κ³Όκ° λμ€μ§ μκ²λ©λλ€. index.js
νμΌμ intro
ν¨μλ₯Ό μ€ννλ € νλλ°, intro
ν¨μκ° μ μλ intro.js
νμΌμ μ€νμμ μ μμ§ μν¬νΈ λμ§ μμκΈ° λλ¬Έμ
λλ€. μ μμμμλ νμΌμ κ°―μκ° μ μ΄ λ¬Έμ μ μ λ°λ‘ μ°Ύμ μ μμμ§λ§ νλ‘μ νΈ κ·λͺ¨κ° μ»€μ Έ html
νμΌμ μν¬νΈν΄μΌ νλ νμΌμ΄ μλ°±κ°μ μ΄λ₯΄κ² λλ©΄, λ¬Έμ λ₯Ό μ°ΎκΈ° μ΄λ €μ μ§λλ€. λͺ¨λ νμΌμ μμ‘΄μ±μ κ³ λ €ν΄ μ¬λ°λ₯Έ μμλ‘ μν¬νΈλ₯Ό ν΄μ£Όμ΄μΌ νκΈ° λλ¬Έμ
λλ€.
Webpackκ³Ό κ°μ λ²λ€λ¬λ₯Ό μ¬μ©νκ² λλ©΄, μ λ¬Έμ λ₯Ό μ½κ² ν΄κ²°ν μ μμ΅λλ€. Webpackμ΄ μμ‘΄μ± κ΄κ³λ₯Ό λ°μ Έ νλ μ΄μμ λ²λ€λ§λ νμΌμ λ§λ€κ² λλ©΄, κ°λ°μλ λ§λ€μ΄μ§ νμΌλ§ μν¬νΈνλ©΄ λ©λλ€.
μ§κΈκΉμ§ webpackμ΄ λ¬΄μμ΄λ©°, μ νμνμ§λ₯Ό μ΄ν΄ 보μμ΅λλ€. μ΄μ webpackμ μ¬μ©νκΈ° μν μ€μ λ€μ μ΄ν΄λ³΄κ² μ΅λλ€.
π» webpack, webpack-cli μ€μΉ
μ€μ μ μμ보기 μ μ, webpackκ³Ό webpack-cliλ₯Ό devDependencies
λ‘ μ€μΉν΄μΌ ν©λλ€. webpack-cliμ κ²½μ° package.json
μ script λͺ
λ Ήμ΄λ₯Ό μ¬μ©ν΄ webpackκ³Ό κ΄λ ¨λ κΈ°λ₯(λΉλ, μ€νλ±)μ μ€νν μ μμ΅λλ€.
π λ§μ½ webpack μ€μ μμ΄ webpack
λͺ
λ Ήμ΄λ₯Ό μ€ννκ²λλ©΄, κΈ°λ³Έ μ€μ μΌλ‘ λΉλλκ² λ©λλ€.
π» entry, output
μ μΌ λ¨Όμ μ΄ν΄λ³Ό webpack μ€μ νλ‘νΌν°λ entry
, output
μ
λλ€.
entry
μλ λΉλκ° μμλλ μμμ νμΌ, μ¦ μμ‘΄μ± κ·Έλνμμ μ΅μλ¨μ μμΉνλ νμΌλ₯Ό μ§μ νκ² λλ©°, output
μλ λΉλκ° μλ£λ κ²°κ³Όλ¬Όμ μ΄λ¦κ³Ό κ²°κ³Όλ¬Όμ΄ μμΉν ν΄λμ κ²½λ‘ λ° ν΄λμ μ΄λ¦λ±μ μ€μ ν΄μ£Όκ² λ©λλ€.
1
2
3
4
5
6
7
8
9
// src/intro.js
function intro() {
console.log("this is intro page");
}
// src/index.js
import intro from "./intro.js";
intro();
μμ μμμμ entry
λ src/index.js
κ° λ©λλ€. λ°λΌμ webpack μ€μ μ μλμ κ°μ΄ μ§μ ν μ μμ΅λλ€. λΉλμ μμμ μ΄ λλ νμΌμ λ°λμ νλμΌ νμλ μμ΅λλ€. νλκ° μλ μμλ μ΄νμ μμλ³΄κ² μ΅λλ€.
1
2
3
4
5
// webpack.config.js
module.exports = {
entry: "./src/intro.js",
};
output
μ μλμ κ°μ΄ μ€μ ν΄ μ€ μ μμ΅λλ€.
1
2
3
4
5
6
module.exports = {
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "dist"),
},
};
μ μ€μ μ μλ―Έλ λΉλκ° μλ£λ κ²°κ³Όλ¬Όμ bundle.js
λ‘ λͺ
λͺ
νκ³ , νμΌμ μμΉλ₯Ό dist/bundle.js
μ μμΉ μν€λΌλ μλ―Έμ
λλ€.
μ μ€μ λλ‘ λΉλλ₯Ό νκ² λλ©΄ κ²°κ³Όλ μλμ κ°μ΄ λμ€κ² λ©λλ€.
π Webpack μ€μ νμΌμ νμΌλͺ μ
webpack.config.js
λ‘ μ§μ ν΄ λ£¨νΈ ν΄λμ μμ±νλ©΄, webpackμ΄ μλμΌλ‘ μ€μ νμΌμ μΈμνκ² λ©λλ€.
π Browser Cache
μ°λ¦¬κ° μ¬μ©νλ μΉ λΈλΌμ°μ λ€μ μΊμλ₯Ό μ¬μ©νκ³ μμ΅λλ€. νλ² λ€νΈμν¬ μμ²μ λ³΄λΈ νμΌλ€μ κΈ°μ΅ν΄ λμλ€κ° λ€μ μμ²μ΄ λ€μ΄μ¬ λ, μΊμμμ νμΌμ κ°μ Έμ΅λλ€. μ΄λ₯Ό ν΅ν΄ λ‘λ©μκ°μ λ¨μΆμν¬ μ μλ€λ μ₯μ μ΄ μμ΅λλ€.
νμ§λ§ μΊμλ‘ μΈν΄ λ¬Έμ λ λ°μν©λλ€. μ΄λ€ μν©μμ λ¬Έμ κ° λ°μνλμ§ νκ°μ§ μν©μ κ°μ ν΄λ³΄κ² μ΅λλ€.μ΄λ€ μ¬μ©μκ° μμ£Ό μ¬μ©νκ³ μλ μΉ μλΉμ€κ° μμ΅λλ€. μ΄ μλΉμ€μ κ°λ°μλ μλ‘μ΄ λμμΈμ μ μ©ν΄ λΉλ ν λ°°ν¬νμ§λ§, μ¬μ©μλ λ°λ λμμΈμ λ°λ‘ λ³΄μ§ λͺ»ν©λλ€. λΈλΌμ°μ μ μΊμλ‘ μΈν΄ μμ
html
νμΌμ κΈ°μ΅νκ³ μκΈ° λλ¬Έμ λλ€.
μ΄ λ¬Έμ λ ν΄κ²°νκΈ° μν λ°©λ²μΌλ‘λ λΉλλ νμΌλͺ μhash
κ°μ μΆκ°νλ λ°©λ²μ΄ μμ΅λλ€.output.filename
μ[contenthash]
λ₯Ό μΆκ°νλ©΄ λΉλλ λλ§λ€ νμΌλͺ μhash
κ°μ΄ μΆκ°λμ΄ λ§€λ² λ€λ₯Έ μ΄λ¦μ νμΌμ΄ μμ±λ©λλ€. μ΄λ₯Ό ν΅ν΄ λΈλΌμ°μ μ μΊμλ₯Ό νΌν μ μμ΅λλ€.
π» Asset Modules
Webpackμ μν¬νΈν λͺ¨λ μ€, JavaScriptλ§ μμ λ³Ό μ μμ΅λλ€. λ€μλ§ν΄ μ΄λ―Έμ§ νμΌμ΄λ, ν
μ€νΈ νμΌ, CSS
νμΌλ± JavaScriptκ° μλ νμΌμ μν¬νΈνκ² λλ©΄ λΉλμ μ€λ₯κ° μκΈ°κ² λ©λλ€. λ€λ₯Έ μ’
λ₯μ νμΌλ€μ μν¬νΈνλ €λ©΄ μΆκ°μ μΌλ‘ μ€μ μ ν΄μ£Όμ΄μΌ ν©λλ€.
Asset Moduleμ μ΄λ―Έμ§, κΈκΌ΄, ν
μ€νΈμ κ°μ asset νμΌμ webpackμ΄ ν΄μν μ μλλ‘ λμμ£Όλ μν μ ν©λλ€. κ³Όκ±°μλ url-loader
, file-loader
λ±μ μ€μΉν΄μΌ νμ§λ§, webpack5λΆν°λ κΈ°λ³Έ κΈ°λ₯μΌλ‘ ν΅ν©λμμ΅λλ€.
Asset Moduleμ asset νμΌ μν¬νΈ λ°©μμ λ°λΌ μΈκ°μ§ μ’ λ₯λ‘ λλ μ μμ΅λλ€.
π¨βπ» asset/resource
λΉλμ λͺ¨λμ΄ μ μ©λ νμΌμ output
λλ ν 리μ μμ±ν©λλ€. μ΄λ λ³λμ νμΌλͺ
μ μ§μ νμ§ μμΌλ©΄, ν΄μ¬λ κ°μ΄ νμΌλͺ
μΌλ‘ μ§μ λκ² λ©λλ€.
μ΄ λͺ¨λμ μ μ©ν κ²½μ°, νμΌμ λΆλ¬μ¬λ http
μμ²μ 보λ΄λ©°, λ³΄ν΅ ν¬κΈ°κ° ν° νμΌμ κ°μ Έμ¬λ μ¬μ©ν©λλ€. μ€μ μ μλμ κ°μ΄ ν μ μμ΅λλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
// webpack.config.js
module.exports = {
module: {
rules: [
{
// νμ₯μκ° png, jpgμΈ νμΌμ λͺ¨λ μ μ©
test: /\.(png|jpg)$/,
type: "asset/resource",
},
],
},
};
μ μ€μ λλ‘ λΉλλ₯Ό νκ²λλ©΄ κ²°κ³Όλ λ€μκ³Ό κ°μ΅λλ€.
μμμ μΈκΈνλ―μ΄ μν¬νΈλ μ΄λ―Έμ§νμΌμ΄ output
λλ ν 리μ λ°λ‘ μμ±λμμ΅λλ€.
π μμ±λλ asset νμΌμ μ΄λ¦μ΄λ κ²½λ‘λ₯Ό λ°κΎΈκ³ μΆλ€λ©΄ Custom output filenameμ μ°Έμ‘°νλ©΄ λ©λλ€.
π¨βπ» asset/inline
λ³λμ νμΌμ output
λλ ν 리μ μμ±νμ§ μκ³ , νμΌμ data url(base64) νμμΌλ‘ λ°κΎΈμ΄ λ²λ€λ§λ JavaScript νμΌμ μ§μ λ£μ΅λλ€. λ³΄ν΅ ν¬κΈ°κ° μμ νμΌμ μ²λ¦¬ν λ μ¬μ©ν©λλ€.
1
2
3
4
5
6
7
8
9
10
11
12
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.(png|jpg)$/,
type: "asset/inline",
},
],
},
};
μ μ€μ μΌλ‘ λΉλλ₯Ό ν λ, λΉλ κ²°κ³Όλ¬Όμ μ©λμ΄ asset/resource
λ‘ λΉλνμλλ³΄λ€ μ»€μ§λ κ²μ λ³Ό μ μμ΅λλ€. λ²λ€λ§λ κ²°κ³Όλ¬Όμ data urlμ΄ μΆκ°λμκΈ° λλ¬Έμ
λλ€.
π¨βπ» asset
asset/resource
κ³Ό asset/inline
μ ν©μΉ λ°©μμ
λλ€. νΉμ ν¬κΈ° μ΄μμ΄λ©΄ asset/resource
λ‘ λΉλνκ³ λ―Έλ§μΌ κ²½μ°λ asset/inline
μΌλ‘ λΉλν©λλ€. κΈ°μ€μ΄ λλ κ°μ 8kbμ΄λ©°, μ§μ μ€μ ν μ μμ΅λλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.(png|jpg)$/,
type: "asset",
parser: {
dataUrlCondition: {
// 3kb μ΄μμΌ κ²½μ°, asset/resourceλ‘ λΉλ
maxSize: 3 * 1024,
},
},
},
],
},
};
π¨βπ» asset/source
νμΌμ ν
μ€νΈλ₯Ό λ¬Έμμ΄λ‘ μ½μ΄ JavaScriptμ μ£Όμ
νκΈ° μν΄ μ¬μ©ν©λλ€. asset/inline
κ³Ό λμΌνκ² output
λλ ν 리μ μλ‘μ΄ νμΌμ μμ±νμ§ μμ΅λλ€.
1
2
3
4
5
6
7
8
9
10
11
12
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.txt$/,
type: "asset/source",
},
],
},
};
π publicPath
output
νλ‘νΌν°μpublicPath
λΌλ μ΅μ μ΄ μμ΅λλ€. μ΄ μ΅μ μ μμ±λ νμΌλ€μ λΈλΌμ°μ μ λ‘λ©νκΈ° μν΄ μ΄λ€url
μ μ¬μ©ν΄μΌνλμ§ webpackμ μλ €μ£Όλ μν μ ν©λλ€.
publicPath
μ μλ¬΄λ° μ€μ μ ν΄μ£Όμ§ μκ³asset/resource
λ°©μμΌλ‘ μ΄λ―Έμ§λ₯Ό μν¬νΈ νλ€κ³ κ°μ ν΄λ³΄κ² μ΅λλ€. κ°λ°μ λꡬμμ ν΄λΉ μ΄λ―Έμ§μsrc
μμ±μ 보면http://[domain name]/dist/[image name][ext]
νμμΌλ‘ λμ΄μλ κ²μ λ³Ό μ μμ΅λλ€. μ΄λ webpack5μμpublicPath
κ°auto
μ΄κΈ° λλ¬Έμ λλ€. Webpack4μ κ²½μ°λ λΉ λ¬Έμμ΄(ββ) μ΄λ―λ‘ λ°λ‘ μ€μ μ ν΄μ£Όμ§ μμΌλ©΄, νμΌμ΄ λ‘λλμ§ μμ΅λλ€.Webpack5μμ μλμΌλ‘ assetλ€μ κ²½λ‘λ₯Ό μ€μ ν΄ μ€μλ λ°λ‘ μ§μ ν΄μΌνλ μ΄μ κ° μμκΉμ?
μ΄ μ΅μ μ μ μ νμΌλ€μ cdnμλ²λ, νΉμν prefixκ° λΆμ μλ²μ μ μ₯νμ κ²½μ° μ μ©ν©λλ€.
1 2 3 4 5 6 7 8 9 // webpack.config.js module.exports = { output: { filename: "bundle.js", path: path.resolve(__dirname, "dist"), publicPath: "http://~~~cdn.com/", }, };μμ κ°μ΄
publicPath
λ₯Ό μ€μ ν΄μ£Όκ² λλ©΄, μ΄λ―Έμ§ νμΌμ κ²½λ‘λ μλμ κ°μ΄ λμ€κ²λ©λλ€.
π» loader
loader
λ λͺ¨λλ‘ κ°μ Έμ¬ μ μλ νμΌλ€μ λ‘λ ν λ μ¬μ©ν©λλ€. λνμ μΈ loader
λ‘λ CSS
νμΌμ λ‘λν λ μ¬μ©νλ style-loader
μ css-loader
, ν΄λ¦¬νμ ν λ μ¬μ©νλ babel-loader
κ° μμ΅λλ€.
π¨βπ» css-loader
css-loader
λ CSS
νμΌμ μ½μ΄ λ²λ€λ§ λ JavaScript μ½λμ μ€νμΌμ λ£μ΄μ£Όλ μν μ ν©λλ€.
1
2
3
4
5
6
7
8
9
10
11
12
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: ["css-loader"],
},
],
},
};
μμ κ°μ΄ μ€μ ν ν λΉλλ₯Ό μ€ννκ² λλ©΄, λ²λ€λ§λ κ²°κ³Όμ CSS
νμΌμ΄ μ½λλ‘ λ³νλ κ²μ λ³Ό μ μμ΅λλ€. νμ§λ§ μ€νμΌμ μ½λλ‘ λ³ννκΈ°λ§ ν΄μλ μ€νμΌμ μ μ©ν μ μμ΅λλ€. λ³νλ κ²°κ³Όλ₯Ό νκ·Έλ₯Ό ν΅ν΄ νμ΄μ§μ μ½μ
ν΄μΌ ν©λλ€.
π¨βπ» style-loader
css-loader
λ₯Ό ν΅ν΄ λ³νλ CSS
νμΌμ style
νκ·Έμ λ£μ΄μ£Όλ μν μ ν©λλ€.
1
2
3
4
5
6
7
8
9
10
// webpack.config.js
module.exports = {
module: {
rules: [
test: /\.css$/,
use: ["style-loader", "css-loader"]
]
}
}
μμ κ°μ΄ μ€μ ν ν λΉλλ₯Ό μ€ννκ² λλ©΄ μλμ κ°μ΄, head
νκ·Έ νμμ style
νκ·Έκ° μκΈ΄κ²μ λ³Ό μ μμ΅λλ€.
π loader μ μ©μμ
style-loader
λ₯Ό μ μ©ν webpack μ€μ μ 보면use
νλ‘νΌν°μ
1 ["style-loader", "css-loader"];μμΌλ‘ μ μ©νκ²μ μ μ μμ΅λλ€.
loader
λ λ°°μ΄μ μμμΌλ‘ μ μ©μ΄ λκΈ°λλ¬Έμ μ μμλ₯Ό μ§ν€μ§ μμμ μ λλ‘ λμνμ§ μμ΅λλ€.
μ μ μΈμ λ§λ‘ νμ΄ μ€λͺ νμλ©΄,css-loader
λ₯Ό μ¬μ©ν΄CSS
νμΌμ μ½μ΄ λ²λ€λ§λ JavaScript μ½λμ λ£μ ν,style-loader
λ₯Ό μ¬μ©ν΄style
νκ·Έμ λ£μ΄μ€λ€λ μλ―Έ μ λλ€.
π¨βπ» sass-loader
sass-loader
λ SCSS
λ SASS
νμΌμ μ½μ΄λ€μΌ μ μκ²λ ν΄μ£Όλ loader
μ
λλ€. μ΄ loader
λ css-loader
λ³΄λ€ λ¨Όμ μ μ©λκ²λ μ€μ ν΄ μ£Όμ΄μΌ ν©λλ€.
1
2
3
4
5
6
7
8
9
10
11
12
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.s[ac]ss$/,
use: ["style-loader", "css-loader", "sass-loader"],
},
],
},
};
π¨βπ» babel-loader
babel-loader
μ κ²½μ°λ μ΅μ JavaScript λ¬Έλ²μ λͺ¨λ λΈλΌμ°μ μμ μ¬μ©ν μ μλλ‘ ν΄λ¦¬νμ λμμ£Όλ loader
μ
λλ€. μ¬μ©νκ³ μνλ plugin
λ€μ΄λ, preset
λ€μ ν¨κ» μ€μ ν΄μ€ μ μμ΅λλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.js$/,
use: {
loader: "babel-loader",
presets: ["@babel/env"],
plugins: ["@babel/plugin-proposal-class-properties"],
},
},
],
},
};
π» plugin
loader
λ νμΌμ΄λ λͺ¨λμ μν¬νΈνλλ° μ¬μ©νλ€λ©΄, plugin
μ κ²½μ°λ κ·Έ μΈμ μΆκ°μ μΈ κΈ°λ₯μ μννκ²λ λμμ€λλ€. λνμ μΈ plugin
μ μ’
λ₯μ μν μ μ΄ν΄λ³΄κ² μ΅λλ€.
π¨βπ» terser-webpack-plugin
λ²λ€λ§λ JavaScript νμΌμ ν¬κΈ°λ₯Ό μ€μ¬μ£Όλ plugin
μ
λλ€. Webpack4μμλ npm
λͺ¨λλ‘ μ€μΉν΄μ£Όμ΄μΌ νμΌλ, webpack5μμλ λ΄μ₯λμμ΅λλ€.
μλμ κ°μ΄ μ€μ ν΄ μ¬μ©ν μ μμΌλ©°, κ²°κ³Όλ¬Όμ λ€μκ³Ό κ°μ΅λλ€.
1
2
3
4
5
6
// webpack.config.js
const TerserPlugin = require("terser-webpack-plugin");
module.exports = {
plugins: [new TerserPlugin()],
};
terser-webpack-plugin
μ κ²½μ° κ°λ°μ€μΌλλ μ¬μ©νμ§ μμ΅λλ€. λΉλ μκ°μ΄ μ€λ걸리기 λλ¬Έμ
λλ€. λν μ€μ λ°°ν¬λ₯Ό ν κ²½μ°μλ μλμΌλ‘ κΈ°λ³Έμ€μ μ΄ μ μ©λμ΄ λΉλλ©λλ€.
π¨βπ» mini-css-extract
css-loader
μ style-loader
λ₯Ό μ¬μ©νκ²λλ©΄, CSS
μμ±λ€μ΄ λ²λ€λ§λ νμΌμ λ€μ΄κ°κΈ° λλ¬Έμ κ²°κ³Όλ¬Όμ μ©λμ΄ μ»€μ§κ² λ©λλ€. λ§μ½ CSS
λ§ λ°λ‘ μΆμΆνλ€λ©΄, λ²λ€λ§λ κ²°κ³Όλ¬Όμ μ©λμ΄ μ€μΌ μ μμ΅λλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// webpack.config.js
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, "css-loader"],
},
],
},
plugins: [
new MiniCssExtractPlugin({
filename: "style.[name].css",
}),
],
};
μμ κ°μ΄ μ€μ ν μ μμΌλ©°, λΉλλ κ²°κ³Όλ μλμ κ°μ΅λλ€.
μ κ·Έλ¦Όκ³Ό κ°μ΄ μν¬νΈν CSS
νμΌμ΄ λ³λμ νμΌλ‘ λΆλ¦¬λκ²μ μ μ μμ΅λλ€.
π mini-css-extract μ΅μ
λ²λ€λ§λ
CSS
μ νμΌλͺ μ΄λ μμΉλ₯Ό λ³κ²½νκ³ μΆλ€λ©΄, μΈμ€ν΄μ€ μμ±μμ μ΅μ λ€μ μΈμλ‘ λ겨주면 λ³κ²½ν μ μμ΅λλ€.
π¨βπ» clean-webpack-plugin
λΉλκ° μ€νλκΈ°μ output
λλ ν 리μ μλ μ΄μ κ²°κ³Όλ¬Όλ€μ λͺ¨λ μ§μμ£Όλ μν μ ν©λλ€.
1
2
3
4
5
6
// webpack.config.js
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
module.exports = {
plugins: [new CleanWebpackPlugin()],
};
π¨βπ» html-webpack-plugin
μ§κΈκΉμ§λ λΉλ κ²°κ³Όλ¬Όλ‘ λμ¨ JavaScript νμΌμ΄λ CSS
νμΌλ€μ μ§μ html
νμΌμ μν¬νΈν΄ μ€ννμ΅λλ€. κ²°κ³Όλ¬Όλ‘ λμ¨ νμΌμ κ°―μκ° μ κ±°λ μ΄λ¦μ΄ λ¨μνλ€λ©΄ ν° λ¬Έμ κ° λμ§ μμ§λ§, κ·Έ λ°λμ κ²½μ°λ λΆνΈν μ μμ΅λλ€. μ΄λ° λ¬Έμ λ₯Ό html-webpack-plugin
μΌλ‘ ν΄κ²°ν μ μμ΅λλ€.
html-webpack-plugin
μ κ²½μ° λ²λ€λ§ κ²°κ³Όλ‘ λμ¨ νμΌλ€μ μλμΌλ‘ html
νμΌμ λ£μ΄μ£Όλ μν μ ν©λλ€.
1
2
3
4
5
6
// webapck.config.js
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
plugins: [new HtmlWebpackPlugin()],
};
π» mode
νμ¬κΉμ§μ μ€μ μΌλ‘ λΉλλ₯Ό μ€νν΄λ³΄λ©΄ ν°λ―Έλμ μλμ κ°μ κ²½κ³ λ©μΈμ§κ° λμ€λκ²μ λ³Ό μ μμ΅λλ€.
mode
νλ‘νΌν°λ₯Ό μ€μ ν΄μΌ νλ€λ κ²½κ³ λ¬Έμ
λλ€. mode
νλ‘νΌν°μ κ°μ μ€μ ν΄ μ€μΌλ‘μ¨, κ°κ³Ό μΌμΉνλ webpack μ΅μ ν λ‘μ§μ λμμν¬ μ μμ΅λλ€. μλ₯Ό λ€μ΄, mode
μ development
λ₯Ό μ€μ ν κ²½μ° νΉλ³ν μ΅μ ν λ‘μ§μ΄ λμνμ§ μμ§λ§ production
μ μ€μ ν κ²½μ° λ΄λΆμ μΌλ‘ TerserPlugin
λ±μ΄ λμν©λλ€. mode
μ μμΈν μ°¨μ΄μ λ€μ μ΄κ³³μμ νμΈν΄λ³Ό μ μμ΅λλ€.
π Webpack νμΌ λΆλ¦¬νκΈ°
mode
νλ‘νΌν°μ κ²½μ° λ°°ν¬μμλproduction
μΌλ‘ κ°λ°μμλdevelopment
λ‘ μ€μ μ ν΄μ£Όμ΄μΌ νλλ°, λ§€λ² κ°μ λ°κΎΈκΈ°λ λ²κ±°λ‘μ΅λλ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄, λ°°ν¬μ© webpack νμΌκ³Ό κ°λ°μ© webpack νμΌμ λΆλ¦¬ν΄ κ΄λ¦¬ν΄μ£Όλ©΄ λ©λλ€. λΉλ λͺ λ Ήμ--config
νλκ·Έμ ν¨κ» webpackμ κ²½λ‘λ₯Ό λͺ μν΄ μ£Όλ©΄ λ©λλ€.
π» dev server
μ§κΈκΉμ§λ λΉλλ₯Ό ν ν, html-webpack-plugin
μΌλ‘ μμ±λ html
νμΌμ μ§μ μ€νμμΌ κ²°κ³Όλ₯Ό νμΈνμ΅λλ€. μ½λμ λ³κ²½μ΄ μμλ λ§λ€ λ§€λ² λΉλ ν μ€ννλ κ²μ λ²κ±°λ‘κ³ λΆνΈν©λλ€. μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ webpack-dev-server
λ₯Ό μ¬μ©ν μ μμ΅λλ€.
webpack-dev-server
λ κ°λ°μ© μλ²λ₯Ό μ κ³΅ν΄ μ½λμ λ³κ²½ μ¬νμ΄ μμ λ λ§λ€ μλμΌλ‘ λΉλ λ° reloadμμΌ λ°λ‘ κ²°κ³Όλ₯Ό νμΈν μ μκ² ν΄μ£Όλ λꡬ μ
λλ€. μ§κΈλΆν° webpack-dev-server
μ μ€ν λ°©λ²κ³Ό μ€μ λ°©λ²μ μμλ³΄κ² μ΅λλ€.
dev-serverλ webpack serve --config [config νμΌ κ²½λ‘]
λ‘ μ€νν μ μμΌλ©° --hot
νλκ·Έλ₯Ό λΆμΌκ²½μ° HMR(Hot Module Replace)λ₯Ό μνν©λλ€. λ¨ webpack-dev-server
v4.0.0 λΆν°λ κΈ°λ³Έμ μΌλ‘ ν΄λΉ μ΅μ
μ΄ νμ±ν λμ΄ μμ΅λλ€.
webpack-dev-server
μ€μ μ μλμ κ°μ΅λλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
module.exports = {
devServer: {
// ν¬νΈλ²νΈ
port: 9000,
// μ μ νμΌ μ 곡 μμΉ (λ³΄ν΅ output directoryμ λμΌ)
static: path.resolve(__dirname, "dist"),
devMiddleware: {
// html νμΌμ μ 곡ν μμΉ
index: "index.html",
writeToDisk: true,
},
},
};
νκ°μ§ λμ¬κ²¨ λ³Ό μ μ writeToDisk
νλ μ
λλ€. webpack-dev-server
λ in memoryλ‘ λμνκΈ° λλ¬Έμ μ€νμ ν΄λ κ²°κ³Όλ¬Όμ΄ νλ‘μ νΈλ΄μ λνλμ§ μμ΅λλ€. λ§μ½ κ²°κ³Όλ¬Όμ μ§μ νμΈνκ³ μΆλ€λ©΄, ν΄λΉ μ΅μ
μ true
λ‘ μ€μ νλ©΄ λ©λλ€.