λ²λ€λ§
: μΉ μ ν리μΌμ΄μ λμμ νμν HTML, CSS, JavaScript λ±μ νμΌλ€μ λ¬Άμ΄μ μ 곡νλ κ²
: HTML, CSS, JavaScript λ±μ μμμ μ λΆ κ°κ°μ λͺ¨λλ‘ λ³΄κ³ , μ΄λ₯Ό μ‘°ν©ν΄ νλμ λ¬ΆμμΌλ‘ λ²λ€λ§(λΉλ)ν΄μ£Όλ λꡬ
νλμ μμμ (entry)μΌλ‘λΆν° μμν΄μ, μμ‘΄μ±μ κ°μ§λ λͺ¨λ λͺ¨λμ μΆμ νμ¬ νλμ κ²°κ³Όλ¬Ό(output)μ λ§λ€μ΄μ€λ€.
: μ¬λ¬ κ°μ νμΌμ νλμ νμΌλ‘ ν©μ³μ£Όλ λͺ¨λ λ²λ€λ¬
: κ°λ°μ΄ μλ£λ μ±μ λ°°ν¬νκΈ° μν΄ νλμ ν΄λ(directory)λ‘ κ΅¬μ±νμ¬ μ€λΉνλ μμ
e.g. React μ±μμ npm run build
λ₯Ό μ€ννλ©΄, React build μμ
μ΄ μ§νλκ³ , index.html
νμΌμ μμΆλμ΄ λ°°ν¬μ μ΅μ νλ μνλ₯Ό μ 곡ν΄μ€λ€.
: μμ‘΄μ κ΄κ³(import
, export
)μ μλ νμΌλ€μ λ¬Άλ μμ
λΉλ β λ²λ€λ§
npmμΌλ‘ webpackκ³Ό webpack-cliλ₯Ό μ€μΉνλ€.
npm install -D webpack webpack-cli
webpackμ λ²λ€λ§μ μν λΌμ΄λΈλ¬λ¦¬λ‘, μ€μ μ ν리μΌμ΄μ μ νμν λͺ¨λμ μλλ―λ‘ devDependency μ΅μ μΌλ‘ μ€μΉνλ€.
npx webpack
package.json
νμΌμ μλ μ€ν¬λ¦½νΈλ₯Ό μΆκ°νμ¬ npm run build
λ‘ λ²λ€λ§μ μ€νν μλ μλ€."scripts": {
"build": "npx webpack"
}
νμ§λ§, λ²λ€λ§μ νκΈ° μ μ λ¨Όμ webpack.config.js
νμΌμ λ§λ€κ³ μ€μ νλ μ½λλ₯Ό μμ±ν΄μ€μΌ νλ€.
webpack.config.js
νμΌμλ 6κ°μ§ μμ±μ μμ±ν μ μλ€.
module.export = {
...
}
μλμμ κ° μμ±λ€μ΄ μ΄λ€ μν μ νλμ§ μμ보며, μ°¨κ·Όμ°¨κ·Ό μμ±ν΄λ³΄μ.
./src/index.js
μ΄μ§λ§, λ€λ₯Έ νμΌλ‘ μ€μ νκ±°λ λλ μ¬λ¬ κ°μ Entry pointλ₯Ό μ€μ ν μ μλ€.module.export = {
entry: './src/index.js', // index.js νμΌμ Entry pointλ‘ μ€μ νλ€.
}
dist
ν΄λκ° μμ±λκ³ , κ·Έ μμ main.js
λ‘ μ μ₯λλ€.const path = require('path'); // path λͺ¨λμ λΆλ¬μ¨λ€.
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'), // λ²λ€μ λ΄λ³΄λΌ μμΉ(ν΄λ)
filename: 'app.bundle.js', // λ²λ€ νμΌμ μ΄λ¦
},
};
path λͺ¨λ
: νμΌμ΄λ ν΄λμ κ²½λ‘λ₯Ό νΈλ¦¬νκ² μ€μ ν μ μλ κΈ°λ₯μ μ 곡νλ path λͺ¨λ
Node.js λ΄μ₯ λͺ¨λμ΄κΈ° λλ¬Έμ, λ³λμ μ€μΉμμ΄require()
ꡬ문μ μ΄μ©ν΄ λΆλ¬μ€λ©΄ λλ€.
path.join()
: μ¬λ¬ κ°μ λ¬Έμμ΄μ μ λ¬μΈμλ‘ λ°μ ν©μ³μ£Όλ λ©μλpath.join('/foo', 'bar', 'baz/asdf'); // μ€ν κ²°κ³Ό : '/foo/bar/baz/asdf'
path.resolve()
:path.join()
κ³Ό λΉμ·νμ§λ§,/
λ₯Ό λ§λλ©΄ μ λ κ²½λ‘λ‘ μΈμνκ³ κ·Έ κ²½λ‘λ₯Ό λ°ννλ€.path.resolve('/foo/bar', './baz'); // μ€ν κ²°κ³Ό : '/foo/bar/baz' path.resolve('/foo/bar', '/baz/asdf'); // μ€ν κ²°κ³Ό : '/baz/asdf'
__dirname
: fileλͺ μ μ μΈν μ λ κ²½λ‘
console.log(__dirname); // /Users/ano/temp
__filename
: fileλͺ μ ν¬ν¨ν μ λκ²½λ‘
console.log(__filename); // /Users/ano/temp/directory.js
Webpackμ κΈ°λ³Έμ μΌλ‘ JavaScriptμ JSON νμΌλ§ μ΄ν΄νλ€.
λ°λΌμ Webpackμ΄ λ€λ₯Έ μ νμ νμΌμ μ²λ¦¬νκΈ° μν΄μλ λ‘λκ° νμνλ€.
λ‘λλ λ κ°μ§μ μμ±μ κ°μ§λ€.
test
: λ³νμ΄ νμν νμΌμ μλ³νλ μμ±μΌλ‘ μ κ·μμΌλ‘ μμ±ν΄μΌ νλ€.use
: νμΌμ λ³ννλ λ°μ μ¬μ©λλ λ‘λλ₯Ό κ°λ¦¬ν€λ μμ±exclude
(optional) : λ°λ²¨λ‘ μ»΄νμΌνμ§ μμ νμΌμ΄λ ν΄λλ₯Ό μ§μ ν μ μλ€.const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'app.bundle.js',
},
module: {
rules: [{ test: /\.txt$/, use: 'raw-loader' }],
// .txt νμΌμ λ°κ²¬νλ©΄ raw-loaderλ₯Ό μ¬μ©ν΄ λ³ννμ¬ λ²λ€μ μΆκ°νλ€.
},
};
: λ‘λλ νΉμ μ νμ λͺ¨λμ λ³ννλ λ° μ¬μ©λμ§λ§, νλ¬κ·ΈμΈμ νμ©νμ¬ λ²λ€μ μ΅μ ννκ±°λ, μμ μ κ΄λ¦¬νκ³ , νκ²½ λ³μ μ£Όμ κ³Ό κ°μ κ΄λ²μν μμ μ μνν μ μλ€.
require()
ꡬ문μ μ΄μ©ν΄ νλ¬κ·ΈμΈμ μμ²νκ³ , plugins λ°°μ΄μ μΆκ°ν΄μΌ νλ€.const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin'); // html-webpack-pluginμ λΆλ¬μ¨λ€.
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'app.bundle.js',
},
module: {
rules: [{ test: /\.txt$/, use: 'raw-loader' }],
},
plugins: [new HtmlWebpackPlugin({ template: './src/index.html' })],
// `html-webpack-plugin`μ λ²λ€λ§ ν΄λ(`dist`) μμ μ ν리μΌμ΄μ
μ© HTML νμΌμ μλμΌλ‘ μμ±ν΄μ€λ€.
};
mode
νλΌλ―Έν°λ₯Ό development
, production
λλ none
μΌλ‘ μ€μ νλ©΄ Webpackμ λ΄μ₯λ νκ²½λ³ μ΅μ νλ₯Ό ν μ μλ€. κΈ°λ³Έκ°μ production μ΄λ€.
module.exports = {
mode: 'production',
};
Webpackμ λ€μν νκ²½κ³Ό targetμ μ»΄νμΌ νλ€.
target
μ κΈ°λ³Έκ°μ web
μΌλ‘, μ μ©νμ§ μμΌλ©΄ μ΄ κΈ°λ³Έκ°μ΄ μ μ©λλ€.target
μλ web
μ΄μΈμλ λ€μν νκ²½μ μ»΄νμΌν μ μλλ°, esX
λ₯Ό λ£μΌλ©΄ μ§μ λ ECMAScript λ²μ μΌλ‘ μ»΄νμΌν μ μλ€.module.exports = {
target: ['web', 'es5'],
};
Webpackμ μ΅μ νλ₯Ό μν λ€μν μ΅μ
μ΄ μ§μλλλ°, λνμ μΌλ‘ minimize
μ minimizer
λ±μ μ¬μ©νλ€.
TerserPlugin
λλ optimization.minimize
μ μ§μ λ νλ¬κ·ΈμΈμ μ¬μ©νμ¬ λ²λ€μ μ΅μννλ€.module.exports = {
...
optimization: {
minimize: false,
},
};
TerserPlugin
μΈμ€ν΄μ€λ₯Ό μ 곡νμ¬ κΈ°λ³Έ μ΅μν λꡬλ₯Ό λ€μ μ€μ ν μ μμ΅λλ€.module.exports = {
optimization: {
minimizer: [new TerserPlugin(),]
}
};
module.exports = {
optimization: {
minimizer: [new CssMinimizerPlugin(),] // mini-css-extract-pluginμ κ΄λ ¨λ λ²λ€μ μ΅μνμν¨λ€.
}
};
μ΄ κΈμ μλμ λ§ν¬λ₯Ό μ°Έκ³ νμ¬ μμ±ν κΈμ
λλ€.
https://webpack.kr/concepts/