Code Splitting
ì½ë ì¤í리í ì webpackì ê°ì¥ ë§¤ë ¥ì ì¸ ê¸°ë¥ ì¤ íëì ëë¤. ì´ ê¸°ë¥ì ì¬ì©íì¬ ì½ë를 ë¤ìí ë²ë¤ë¡ ë¶í íê³ , ìì²ì ë°ë¼ ë¡ëíê±°ë ë³ë ¬ë¡ ë¡ëí ì ììµëë¤. ë ìì ë²ë¤ì ë§ë¤ê³ 리ìì¤ ì°ì ìì를 ì¬ë°ë¥´ê² ì ì´í기 ìí´ì ì¬ì©íë©°, ì íì©íë©´ ë¡ë ìê°ì í° ìí¥ì ë¼ì¹ ì ììµëë¤.
ì¼ë°ì ì¼ë¡ ì½ë ì¤í리í ì ì¸ ê°ì§ ë°©ìì¼ë¡ ì ê·¼í ì ììµëë¤.
- Entry Points:
entryì¤ì ì ì¬ì©íì¬ ì½ë를 ìëì¼ë¡ ë¶í í©ëë¤. - Prevent Duplication: Entry dependencies ëë
SplitChunksPluginì ì¬ì©íì¬ ì¤ë³µ ì²í¬ë¥¼ ì ê±°íê³ ì²í¬ë¥¼ ë¶í í©ëë¤. - Dynamic Imports: 모ë ë´ìì ì¸ë¼ì¸ í¨ì í¸ì¶ì íµí´ ì½ë를 ë¶í í©ëë¤.
Entry Points
ì½ë를 ë¶í íë ê°ì¥ ì½ê³ ì§ê´ì ì¸ ë°©ë²ì ëë¤. ê·¸ë¬ë ë¤ë¥¸ ë°©ë²ì ë¹í´ ìëì ì´ë©°, ê°ì´ ì´í´ë³¼ ëª ê°ì§ í¨ì ì´ ììµëë¤. ë©ì¸ ë²ë¤ìì ë¤ë¥¸ 모ëì ì´ë»ê² ë¶ë¦¬íëì§ ììë³´ê² ìµëë¤.
project
webpack-demo
âââ package.json
âââ package-lock.json
âââ webpack.config.js
âââ /dist
âââ /src
â âââ index.js
+ â âââ another-module.js
âââ /node_modulesanother-module.js
import _ from "lodash";
console.log(_.join(["Another", "module", "loaded!"], " "));webpack.config.js
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export default {
- entry: './src/index.js',
+ mode: 'development',
+ entry: {
+ index: './src/index.js',
+ another: './src/another-module.js',
+ },
output: {
- filename: 'main.js',
+ filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist'),
},
};ë¤ìê³¼ ê°ì ë¹ë ê²°ê³¼ê° ìì±ë©ëë¤.
...
[webpack-cli] Compilation finished
asset index.bundle.js 553 KiB [emitted] (name: index)
asset another.bundle.js 553 KiB [emitted] (name: another)
runtime modules 2.49 KiB 12 modules
cacheable modules 530 KiB
./src/index.js 257 bytes [built] [code generated]
./src/another-module.js 84 bytes [built] [code generated]
./node_modules/lodash/lodash.js 530 KiB [built] [code generated]
webpack 5.x.x compiled successfully in 245 msì¸ê¸íë¯ì´ ì´ ì ê·¼ ë°©ììë ëª ê°ì§ í¨ì ì´ ììµëë¤.
- ìí¸ë¦¬ ì²í¬ ì¬ì´ì ì¤ë³µë 모ëì´ ìë ê²½ì° ë ë²ë¤ì 모ë í¬í¨ë©ëë¤.
- ì½ì´ ì í리ì¼ì´ì ë¡ì§ì íµí ì½ëì ëì ë¶í ìë ì¬ì©í ì ìì¼ë©° ì ì°íì§ ììµëë¤.
ì´ ì¤ ì²« ë²ì§¸ í목ì íµí´ ì§ê¸ ìì ì 문ì 를 ì ì ììµëë¤. ìëíë©´ ./src/index.jsììë lodash를 ê°ì ¸ì¤ë¯ë¡ ì쪽 ë²ë¤ìì ì¤ë³µì¼ë¡ í¬í¨ë기 ë문ì
ëë¤. ë¤ì ì¹ì
ìì ì¤ë³µë ê²ì ì ê±°íê² ìµëë¤.
Prevent Duplication
Entry dependencies
dependOn ìµì
ì ì¬ì©íë©´ ì²í¬ê° 모ëì ê³µì í ì ììµëë¤.
webpack.config.js
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export default {
mode: 'development',
entry: {
- index: './src/index.js',
- another: './src/another-module.js',
+ index: {
+ import: './src/index.js',
+ dependOn: 'shared',
+ },
+ another: {
+ import: './src/another-module.js',
+ dependOn: 'shared',
+ },
+ shared: 'lodash',
},
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist'),
},
};ë¨ì¼ HTML íì´ì§ìì ì¬ë¬ ìí¸ë¦¬ í¬ì¸í¸ë¥¼ ì¬ì©íë ê²½ì° optimization.runtimeChunk: 'single'ë íìí©ëë¤. ê·¸ë ì§ ìì¼ë©´ ì¬ê¸°ìì ì¤ëª
íë 문ì ê° ë°ìí ì ììµëë¤.
webpack.config.js
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export default {
mode: 'development',
entry: {
index: {
import: './src/index.js',
dependOn: 'shared',
},
another: {
import: './src/another-module.js',
dependOn: 'shared',
},
shared: 'lodash',
},
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist'),
},
+ optimization: {
+ runtimeChunk: 'single',
+ },
};ë¤ìì ë¹ë ê²°ê³¼ì ëë¤.
...
[webpack-cli] Compilation finished
asset shared.bundle.js 549 KiB [compared for emit] (name: shared)
asset runtime.bundle.js 7.79 KiB [compared for emit] (name: runtime)
asset index.bundle.js 1.77 KiB [compared for emit] (name: index)
asset another.bundle.js 1.65 KiB [compared for emit] (name: another)
Entrypoint index 1.77 KiB = index.bundle.js
Entrypoint another 1.65 KiB = another.bundle.js
Entrypoint shared 557 KiB = runtime.bundle.js 7.79 KiB shared.bundle.js 549 KiB
runtime modules 3.76 KiB 7 modules
cacheable modules 530 KiB
./node_modules/lodash/lodash.js 530 KiB [built] [code generated]
./src/another-module.js 84 bytes [built] [code generated]
./src/index.js 257 bytes [built] [code generated]
webpack 5.x.x compiled successfully in 249 msë³´ìë¤ìí¼ shared.bundle.js, index.bundle.js ë° another.bundle.js ì¸ì ë ë¤ë¥¸ runtime.bundle.js íì¼ì´ ìì±ë©ëë¤.
webpackì íëì íì´ì§ì ì¬ë¬ ìí¸ë¦¬ í¬ì¸í¸ë¥¼ íì©íì§ë§, ê°ë¥íë¤ë©´ entry: { page: ['./analytics', './app'] }ì²ë¼ ì¬ë¬ ê°ì importê° í¬í¨ë ìí¸ë¦¬ í¬ì¸í¸ ì¬ì©ì í¼í´ì¼ í©ëë¤. ì´ë async ì¤í¬ë¦½í¸ í그를 ì¬ì©í ë ìµì íì ì©ì´íë©° ì¼ê´ë ììë¡ ì¤íí ì ìëë¡ í©ëë¤.
SplitChunksPlugin
SplitChunksPluginì ì¬ì©íë©´ 기존 ìí¸ë¦¬ ì²í¬ ëë ìì í ìë¡ì´ ì²í¬ë¡ ê³µíµ ìì¡´ì±ì ì¶ì¶í ì ììµëë¤. ì´ë¥¼ íì©íì¬ ì´ì ìì ì lodash ì¤ë³µì ì ê±°í´ ë³´ê² ìµëë¤.
webpack.config.js
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export default {
mode: 'development',
entry: {
index: './src/index.js',
another: './src/another-module.js',
},
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist'),
},
+ optimization: {
+ splitChunks: {
+ chunks: 'all',
+ },
+ },
};optimization.splitChunks ì¤ì ìµì
ì ì ì©íë©´ index.bundle.jsì another.bundle.jsìì ì¤ë³µ ìì¡´ì±ì´ ì ê±°ë ê²ì íì¸ í ì ììµëë¤. íë¬ê·¸ì¸ì lodash를 ë³ëì ì²í¬ë¡ ë¶ë¦¬íê³ ë©ì¸ ë²ë¤ììë ì ê±°ë ê²ì ì ì ììµëë¤. ê·¸ë¬ë ê³µíµ ìì¡´ì±ì webpackìì ì§ì í í¬ê¸° ìê³ê°ì 충족íë ê²½ì°ìë§ ë³ëì ì²í¬ë¡ ì¶ì¶ëë¤ë ì ì ì ìí´ì¼ í©ëë¤.
...
[webpack-cli] Compilation finished
asset vendors-node_modules_lodash_lodash_js.bundle.js 549 KiB [compared for emit] (id hint: vendors)
asset index.bundle.js 8.92 KiB [compared for emit] (name: index)
asset another.bundle.js 8.8 KiB [compared for emit] (name: another)
Entrypoint index 558 KiB = vendors-node_modules_lodash_lodash_js.bundle.js 549 KiB index.bundle.js 8.92 KiB
Entrypoint another 558 KiB = vendors-node_modules_lodash_lodash_js.bundle.js 549 KiB another.bundle.js 8.8 KiB
runtime modules 7.64 KiB 14 modules
cacheable modules 530 KiB
./src/index.js 257 bytes [built] [code generated]
./src/another-module.js 84 bytes [built] [code generated]
./node_modules/lodash/lodash.js 530 KiB [built] [code generated]
webpack 5.x.x compiled successfully in 241 msë¤ìì ì½ë ì¤í리í ì ìí´ ì»¤ë®¤ëí°ìì ì ê³µíë ë¤ë¥¸ ì ì©í íë¬ê·¸ì¸ê³¼ ë¡ëì ëë¤.
-mini-css-extract-plugin : ë©ì¸ ì í리ì¼ì´ì
ìì CSS를 ë¶ë¦¬íëë° ì ì©í©ëë¤.
Dynamic Imports
webpackì ëì ì½ë ì¤í리í
ì ë ê°ì§ ì ì¬í 기ì ì ì§ìí©ëë¤. 첫 ë²ì§¸ì´ì ê¶ì¥íë ì ê·¼ ë°©ìì ECMAScript ì ìì ì¤ìíë import()구문ì ì¬ì©íë ë°©ìì
ëë¤. 기존ì webpack ì ì© ë°©ìì require.ensure를 ì¬ì©íë ê²ì
ëë¤. ì´ ë ê°ì§ ì¤ ì²« ë²ì§¸ë¥¼ ì¬ì©í´ ë³´ê² ìµëë¤.
ììí기 ì ì ì ìì ì ì¤ì ìì ì¶ê° entry ë° optimization.splitChunks를 ì ê±°íê² ìµëë¤. ë¤ì ë°ëª¨ìë íìíì§ ììµëë¤.
webpack.config.js
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export default {
mode: 'development',
entry: {
index: './src/index.js',
- another: './src/another-module.js',
},
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist'),
},
- optimization: {
- splitChunks: {
- chunks: 'all',
- },
- },
};ëí íì¬ ì¬ì©íì§ ìë íì¼ì íë¡ì í¸ìì ì ê±°íê² ìµëë¤.
project
webpack-demo
âââ package.json
âââ package-lock.json
âââ webpack.config.js
âââ /dist
âââ /src
â âââ index.js
- â âââ another-module.js
âââ /node_modulesì´ì ì ì ì¼ë¡ ê°ì ¸ì¤ë lodash를 ëì ì¼ë¡ ê°ì ¸ìì ì²í¬ë¥¼ ë¶ë¦¬í´ë³´ê² ìµëë¤.
src/index.js
-import _ from 'lodash';
-
-function component() {
+function getComponent() {
- const element = document.createElement('div');
- // ì´ì ì´ ì¤í¬ë¦½í¸ê° Lodash를 importí©ëë¤.
- element.innerHTML = _.join(['Hello', 'webpack'], ' ');
+ return import('lodash')
+ .then(({ default: _ }) => {
+ const element = document.createElement('div');
+
+ element.innerHTML = _.join(['Hello', 'webpack'], ' ');
- return element;
+ return element;
+ })
+ .catch((error) => 'An error occurred while loading the component');
}
-document.body.appendChild(component());
+getComponent().then((component) => {
+ document.body.appendChild(component);
+});defaultê° íìí ì´ì ë webpack 4 ì´íë¡ CommonJS 모ëì ê°ì ¸ì¬ ë ë ì´ì module.exports ê° ì¼ë¡ í´ìëì§ ìì¼ë©° ëì CommonJS 모ëì ëí ì¸ê³µ ë¤ì ì¤íì´ì¤ ê°ì²´ë¥¼ ìì±í기 ë문ì
ëë¤. ê·¸ ì´ì ì ëí ìì¸í ë´ì©ì webpack 4: import() ë° CommonJs를 ì°¸ê³ íì¸ì.
webpackì ì¤ííì¬ lodashê° ë³ëì ë²ë¤ë¡ ë¶ë¦¬ëì´ ìëì§ ì´í´ë³´ê² ìµëë¤.
...
[webpack-cli] Compilation finished
asset vendors-node_modules_lodash_lodash_js.bundle.js 549 KiB [compared for emit] (id hint: vendors)
asset index.bundle.js 13.5 KiB [compared for emit] (name: index)
runtime modules 7.37 KiB 11 modules
cacheable modules 530 KiB
./src/index.js 434 bytes [built] [code generated]
./node_modules/lodash/lodash.js 530 KiB [built] [code generated]
webpack 5.x.x compiled successfully in 268 msimport(
/* webpackExports: ["default", "namedExport"] */
"./module"
);ì´ë ê² íë©´ ì¹í©ì´ ì¬ì©ëì§ ìë ë¤ë¥¸ ë´ë³´ë´ê¸°ë¥¼ í¸ë¦¬ ìì´í¹íë ë° ëìì´ ë ì ììµëë¤. ìì¸í ë´ì©ì ë§¤ì§ ì£¼ìì ì°¸ê³ íì¸ì.
import()ë íë¡ë¯¸ì¤ë¥¼ ë°ííë¯ë¡ async í¨ìì í¨ê» ì¬ì©í ì ììµëë¤. ë¤ìì ì´ë¥¼ ì¬ì©íì¬ ì½ë를 ê°ìííë ë°©ë²ì
ëë¤.
src/index.js
-function getComponent() {
+async function getComponent() {
+ const element = document.createElement('div');
+ const { default: _ } = await import('lodash');
- return import('lodash')
- .then(({ default: _ }) => {
- const element = document.createElement('div');
+ element.innerHTML = _.join(['Hello', 'webpack'], ' ');
- element.innerHTML = _.join(['Hello', 'webpack'], ' ');
-
- return element;
- })
- .catch((error) => 'An error occurred while loading the component');
+ return element;
}
getComponent().then((component) => {
document.body.appendChild(component);
});Understanding ChunkLoadError
ëì import() ëë ì½ë ë¶í ì ì¬ì©í ë, Webpackì ë°íìì ì²í¬ ë¡ëì ì¤í¨íë©´ ChunkLoadError를 ë°ììí¬ ì ììµëë¤.
ì´ ì¤ë¥ë ì¼ë°ì ì¼ë¡ ìì²ë ì²í¬ê° ì ëë¡ ì¤íëê±°ë í´ê²°ëì§ ëª»íìì ëíë
ëë¤. ê²½ì°ì ë°ë¼ ë¸ë¼ì°ì ì 기본 ë¤í¸ìí¬ ì¤ë¥ ëë ì¤í¬ë¦½í¸ ë¡ë© ì¤ë¥ê° ChunkLoadError ë©ìì§ ìì²´ì ìì í ë°ìëì§ ìì ìë ììµëë¤.
ë¤ìê³¼ ê°ì ì¤ë¥ê° ë°ìíë ê²½ì°:
- ì²í¬ íì¼ì´ ë¤í¸ìí¬ë¥¼ íµí´ ì ê·¼ ê°ë¥íì§ íì¸í©ëë¤.
publicPathê° ì¬ë°ë¥´ê² 구ì±ëìëì§ íì¸í©ëë¤.- ë¸ë¼ì°ì ì½ììì ì¶ê°ì ì¸ ì¤í¬ë¦½í¸ ëë ë¤í¸ìí¬ ì¤ë¥ê° ìëì§ íì¸í©ëë¤.
ë ìì¸í ë´ì©ì webpack ì´ì í¸ë커ì ê´ë ¨ ë ¼ì를 참조íì¸ì.
Prefetching/Preloading modules
Webpack 4.6.0+ìì í리íì¹ ë° í리ë¡ëì ëí ì§ìì´ ì¶ê°ëììµëë¤.
모ëì ê°ì ¸ì¬ ë ì¸ë¼ì¸ ì§ì문ì ì¬ì©íë©´ webpackì´ ë¸ë¼ì°ì ì ìëì ê°ì "리ìì¤ íí¸"를 ì¤ ì ììµëë¤.
- prefetch : í¥í ì¼ë¶ íìì 리ìì¤ê° íìí ì ììµëë¤.
- preload : íì¬ íì ì¤ì 리ìì¤ë íìí©ëë¤.
ê°ë¨í í리íì¹ì ìì 를 ë¤ì´ë³´ê² ìµëë¤. HomePage ì»´í¬ëí¸ìì LoginButton ì»´í¬ëí¸ë¥¼ ë ëë§íê³ , ì´ ì»´í¬ëí¸ë¥¼ í´ë¦íë©´ LoginModal ì»´í¬ëí¸ë¥¼ ìì²íì¬ ë¡ëíë ê²½ì°ì
ëë¤.
LoginButton.js
// ...
import(/* webpackPrefetch: true */ "./path/to/LoginModal.js");ì´ë íì´ì§ headì <link rel="prefetch" href="login-modal-chunk.js">를 ì¶ê°íê³ ë¸ë¼ì°ì ì login-modal-chunk.js를 ì í´ ìê°ì 미리 ê°ì ¸ì¤ëë¡ ì§ìí©ëë¤.
í리ë¡ë ì§ì문ì í리íì¹ì ë¹êµíì ë ì¬ë¬ ê°ì§ ì°¨ì´ì ì´ ììµëë¤.
- í리ë¡ë ì²í¬ë ë¶ëª¨ ì²í¬ì ë³ë ¬ë¡ ë¡ë를 ììí©ëë¤. í리íì¹ ì²í¬ë ë¶ëª¨ ì²í¬ê° ë¡ë ìë£ë íì ë¡ë를 ììí©ëë¤.
- í리ë¡ë ì²í¬ë ì¤ê° ì°ì ìì를 ê°ì§ë©° ì¦ì ë¤ì´ë¡ëë©ëë¤. í리íì¹ ì²í¬ë ë¸ë¼ì°ì ê° ì í´ ìíì¼ ë ë¤ì´ë¡ë ë©ëë¤.
- í리ë¡ë ì²í¬ë ë¶ëª¨ ì²í¬ìì ì¦ì ìì² ëì´ì¼ í©ëë¤. í리íì¹ ì²í¬ë ëì¤ì ì¸ì ë¼ë ì¬ì©í ì ììµëë¤.
- ì§ìíë ë¸ë¼ì°ì ì ì°¨ì´ê° ììµëë¤.
ê°ë¨í í리ë¡ëì ìë¡ë, ë³ëì ì²í¬ì ìì´ì¼ íë í° ë¼ì´ë¸ë¬ë¦¬ì íì ìì¡´íë Component를 ìê°í´ ë³¼ ì ììµëë¤.
ê±°ëí ChartingLibraryê° íìí ChartComponent를 ììí´ ë´
ìë¤. ë ëë§ ë ë LoadingIndicator를 íìíê³ ì¦ì ChartingLibrary를 ìì²íì¬ ë¶ë¬ìµëë¤.
ChartComponent.js
// ...
import(/* webpackPreload: true */ "ChartingLibrary");ChartComponent를 ì¬ì©íë íì´ì§ë¥¼ ìì²í ë <link rel="preload">를 íµí´ charting-library-chunkë ìì²ë©ëë¤. page-chunkê° ë ìê³ ë 빨리 ìë£ëë¤ê³ ê°ì íë©´ ì´ë¯¸ ìì²ë charting-library-chunkê° ìë£ë ëê¹ì§ íì´ì§ìë LoadingIndicatorê° íìë©ëë¤. ë ë²ì´ ìë í ë²ì ë¼ì´ë í¸ë¦½ì´ íìíë¯ë¡ ë기 ìê°ì´ 긴 íê²½ìì ë¡ë ìê°ì´ ì¦ê°í ì ììµëë¤.
ëë¡ë í리ë¡ëì ëí ìì ë§ì ì ì´ê° íìí©ëë¤. ì를 ë¤ì´ 모ë ëì importì í리ë¡ëë ë¹ë기 ì¤í¬ë¦½í¸ë¥¼ íµí´ ìíí ì ììµëë¤. ì´ë ìë²ì¬ì´ë ëëë§ì ì¤í¸ë¦¬ë°í ë ì ì©í©ëë¤.
const lazyComp = () =>
import("DynamicComponent").catch((error) => {
// ìë¬ê° ìë ìì
ì ìíí©ëë¤.
// ì를 ë¤ì´, 모ë ë¤í¸ìí¬ ìë¬ê° ë°ìí ê²½ì° ìì²ì ì¬ìëí ì ììµëë¤.
});Webpackì´ í´ë¹ ì¤í¬ë¦½í¸ì ìì²´ ë¡ë를 ììí기 ì ì ì¤í¬ë¦½í¸ ë¡ëê° ì¤í¨íë©´(Webpackì í´ë¹ ì¤í¬ë¦½í¸ê° íì´ì§ì ìë ê²½ì° í´ë¹ ì½ë를 ë¡ëí기 ìí´ ì¤í¬ë¦½í¸ í그를 ìì±í¨), í´ë¹ catch í¸ë¤ë¬ë chunkLoadTimeoutì ì ë¬ëì§ ììµëë¤. ì´ ëìì ìê¸°ì¹ ìì ê²ì¼ ì ììµëë¤. íì§ë§ ì¤ëª ê°ë¥í©ëë¤. Webpackì í´ë¹ ì¤í¬ë¦½í¸ê° ì¤í¨íë¤ë ê²ì 모르기 ë문ì ìë¬ë¥¼ ë°ììí¬ ì ììµëë¤. Webpackì ìë¬ê° ë°ìí í ì¦ì onerror í¸ë¤ë¬ë¥¼ ì¤í¬ë¦½í¸ì ì¶ê°í©ëë¤.
ì´ë¬í 문ì 를 ë°©ì§í기 ìí´, ìë¬ ë°ì ì ì¤í¬ë¦½í¸ë¥¼ ì ê±°íë ìì²´ onerror í¸ë¤ë¬ë¥¼ ì¶ê°í ì ììµëë¤.
<script
src="https://example.com/dist/dynamicComponent.js"
async
onerror="this.remove()"
></script>ì´ ê²½ì° ìë¬ê° ìë ì¤í¬ë¦½í¸ë ì ê±°ë©ëë¤. Webpackì ìì²´ ì¤í¬ë¦½í¸ë¥¼ ìì±íê³ ëª¨ë ìë¬ë ìê° ì´ê³¼ ìì´ ì²ë¦¬ë©ëë¤.
Bundle Analysis
ì½ë ì¤í리í ì ììíë©´ ì¶ë ¥ì ë¶ìíì¬ ì´ëì 모ëì´ ì¢ ë£ëìëì§ íì¸íë ë° ì ì©í©ëë¤. ê³µì ë¶ì ë구ë¶í° ììíë ê²ì´ ì¢ìµëë¤. 커뮤ëí°ìì ì§ìíë ë¤ë¥¸ ìµì ë ììµëë¤.
- webpack-chart: webpack íµê³ë¥¼ ìí ì¸í°ë í°ë¸ ìí ì°¨í¸.
- webpack-visualizer: ë²ë¤ì ìê°ííê³ ë¶ìíì¬ ì´ë¤ 모ëì´ ê³µê°ì ì°¨ì§íê³ ìê³ ì´ë¤ 모ëì´ ì¤ë³µë ì ìëì§ íì¸í©ëë¤.
- webpack-bundle-analyzer: íë/ì¶ì ê°ë¥í í¸ë¦¬í ì¸í°ë í°ë¸ í¸ë¦¬ ë§µì¼ë¡ ë²ë¤ ì½í ì¸ ë¥¼ íííë íë¬ê·¸ì¸ ë° CLI ì í¸ë¦¬í°ì ëë¤.
- webpack bundle optimize helper: ì´ ë구ë ë²ë¤ì ë¶ìíê³ ë²ë¤ í¬ê¸°ë¥¼ ì¤ì´ê¸° ìí ì¤ì©ì ì¸ ê°ì ì¬íì ì ê³µí©ëë¤.
- bundle-stats: ë²ë¤ ë³´ê³ ì(ë²ë¤ í¬ê¸°, ì ì , 모ë)를 ìì±íê³ ìë¡ ë¤ë¥¸ ë¹ë ê°ì 결과를 ë¹êµí©ëë¤.
- webpack-stats-viewer: Webpack íµê³ì© ë¹ëê° í¬í¨ë íë¬ê·¸ì¸ì ëë¤. Webpack ë²ë¤ ì¸ë¶ì ëí ìì¸í ì 보를 íìí©ëë¤.
Next Steps
ì¤ì ì í리ì¼ì´ì
ìì ì´ë»ê² import()를 ì¬ì©íëì§ ë 구체ì ì¼ë¡ ìê³ ì¶ë¤ë©´ Lazy Loadingì ìì 를 íì¸íì¸ì. ë í¨ì¨ì ì¸ ì½ë ì¤í리í
ë°©ë²ì Cachingì ì°¸ê³ íì¸ì.



