CommonsChunkPluginì ì¬ë¬ ìí¸ë¦¬ í¬ì¸í¸ ê°ì ê³µì ëë ê³µíµ ëª¨ëë¡ ì´ë£¨ì´ì§ ë³ëì íì¼(ì²í¬ë¼ê³ í©ëë¤)ì ë§ëë opt-in 기ë¥ì
ëë¤.
ë²ë¤ìì ê³µíµ ëª¨ëì ë¶ë¦¬í ê²°ê³¼ë¡ ìì±ë ì²í¬ íì¼ì ì²ìì í ë² ë¡ëíê³ ëì¤ì ì¬ì©í기 ìí´ ìºìì ì ì¥í ì ììµëë¤. ì´ë¡ ì¸í´ ë¸ë¼ì°ì ê° ì íì´ì§ë¥¼ 방문í ëë§ë¤ ë í° ë²ë¤ì ë¡ëíì§ ìê³ ìºììì ê³µì ì½ë를 ë¹ ë¥´ê² ì ê³µí ì ìì¼ë¯ë¡ íì´ì§ ìëê° ìµì íë©ëë¤.
new webpack.optimize.CommonsChunkPlugin(options);{
name: string, // ëë
names: string[],
// ê³µíµ ì²í¬ì ì²í¬ ì´ë¦ì
ëë¤. ì²í¬ì ì´ë¦ì ì ë¬íì¬ ê¸°ì¡´ ì²í¬ë¥¼ ì íí ì ììµëë¤.
// 문ìì´ ë°°ì´ë¡ ì ë¬ëë©´ ê° ì²í¬ ì´ë¦ì ëí´ íë¬ê·¸ì¸ì ì¬ë¬ ë² í¸ì¶íë ê²ê³¼ ê°ìµëë¤.
// ìëµíë©´ `options.async` ëë `options.children`ì´ ì¤ì ëê³ ëª¨ë ì²í¬ê° ì¬ì©ë©ëë¤.
// ê·¸ë ì§ ìì¼ë©´ ì²í¬ ì´ë¦ì¼ë¡ ì¬ì©ëë `options.filename`ì´ ì¬ì©ëê² ë©ëë¤.
// `options.async`를 ì¬ì©íì¬ ë¤ë¥¸ ë¹ë기 ì²í¬ìì ê³µíµ ì²í¬ë¥¼ ë§ë¤ ë `option.name`ì ìëµíë ëì ì¬ê¸°ì
// ìí¸ë¦¬ í¬ì¸í¸ ì²í¬ ì´ë¦ì ì§ì í´ì¼ í©ëë¤.
filename: string,
// ê³µíµ ì²í¬ì íì¼ ì´ë¦ í
í릿ì
ëë¤. `output.filename`ê³¼ ëì¼í íë ì´ì¤íë를 í¬í¨í ì ììµëë¤.
// ìëµíë©´ ì본 íì¼ ì´ë¦ì ìì ëì§ ììµëë¤(ì¼ë°ì ì¼ë¡ `output.filename` í¹ì `output.chunkFilename`).
// ì´ ìµì
ì `options.async`를 ì¬ì©íë ê²½ì°ìë íì©ëì§ ììµëë¤. ìì¸í ë´ì©ì ìë를 참조íì¸ì.
minChunks: number|Infinity|function(module, count) => boolean,
// ê³µíµ ì²í¬ë¡ ì´ëí기 ì ì 모ëì í¬í¨í´ì¼ íë ìµì ì²í¬ ìì
ëë¤.
// ì«ìë 2ë³´ë¤ í¬ê±°ë ê°ê³ ì²í¬ ìë³´ë¤ ìê±°ë ê°ìì¼ í©ëë¤.
// `Infinity`를 ì ë¬íë©´ ê³µíµ ì²í¬ê° ìì±ëì§ë§ 모ëì ì´ëíì§ ììµëë¤.
// `function`ì ì ê³µíì¬ ë§ì¶¤ ë¡ì§ì ì¶ê° í ì ììµëë¤.(기본ê°ì ì²í¬ì ìì
ëë¤)
chunks: string[],
// ì²í¬ ì´ë¦ì¼ë¡ ìì¤ ì²í¬ë¥¼ ì íí©ëë¤. ì²í¬ë ê³µíµ ì²í¬ì ììì´ì´ì¼ í©ëë¤.
// ìëµíë©´ 모ë ìí¸ë¦¬ ì²í¬ê° ì íë©ëë¤.
children: boolean,
// `true`ì´ë©´ ê³µíµ ì²í¬ì 모ë ììì´ ì íë©ëë¤.
deepChildren: boolean,
// `true`ì´ë©´ ê³µíµ ì²í¬ì 모ë ììì´ ì íë©ëë¤.
async: boolean|string,
// `true`ì´ë©´ ìë¡ì´ ë¹ë기 ê³µíµ ì²í¬ê° `options.name`ì íì í목 ë° `options.chunks`ì ëë±í í목ì¼ë¡ ìì±ë©ëë¤.
// `options.chunks`ì ë³ë ¬ë¡ ë¡ëë©ëë¤.
// `option.filename`ì ì¬ì©íë ëì `true`ê° ìë ìíë 문ìì´ì ì ê³µí´
// ì¶ë ¥ íì¼ì ì´ë¦ì ë³ê²½í ì ììµëë¤.
minSize: number,
// ê³µíµ ì²í¬ê° ìì±ë기 ì 모ë ê³µíµ ëª¨ëì ìµì ì¬ì´ì¦ì
ëë¤.
}ìí¸ë¦¬ í¬ì¸í¸ ê°ì ê³µì ëë ê³µíµ ëª¨ëì í¬í¨íë ì¶ê° ì²í¬ë¥¼ ìì±í©ëë¤.
new webpack.optimize.CommonsChunkPlugin({
name: 'commons',
// (ê³µíµ ì²í¬ ì´ë¦)
filename: 'commons.js',
// (ê³µíµ ì²í¬ì íì¼ ì´ë¦)
// minChunks: 3,
// (모ëì ìµì 3ê°ì ìí¸ë¦¬ ì¬ì´ìì ê³µì í´ì¼ í©ëë¤)
// chunks: ["pageA", "pageB"],
// (ì´ ìí¸ë¦¬ììë§ ì¬ì©ë©ëë¤)
});ìì±ë ì²í¬ë ìí¸ë¦¬ í¬ì¸í¸ ì ì ë¡ëí´ì¼ í©ëë¤.
<script src="commons.js" charset="utf-8"></script>
<script src="entry.bundle.js" charset="utf-8"></script>ì½ë를 vendorì ì í리ì¼ì´ì ì¼ë¡ ë¶í í©ëë¤.
module.exports = {
//...
entry: {
vendor: ['jquery', 'other-lib'],
app: './entry',
},
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
// filename: "vendor.js"
// (ì²í¬ì ë¤ë¥¸ ì´ë¦ì ì§ì íì¸ì)
minChunks: Infinity,
// (ìí¸ë¦¬ê° ë ë§ì¼ë©´ ë¤ë¥¸ 모ëì´ vendor ì²í¬ë¡
// ë¤ì´ê°ì§ ììµëë¤)
}),
],
};<script src="vendor.js" charset="utf-8"></script>
<script src="app.js" charset="utf-8"></script>Code Splittingì ì¬ì©íë©´ ìí¸ë¦¬ ì²í¬ì ì¬ë¬ íì(ìì) ì²í¬ê° ê³µíµ ì¢ ìì±ì ê°ì§ ì ììµëë¤. ì¤ë³µì ë°©ì§í기 ìí´ ì´ë¤ì ë¶ëª¨ ì²í¬ë¡ ì®ê¸¸ ì ììµëë¤. ì´ë ê² íë©´ ì ì²´ í¬ê¸°ê° ì¤ì´ë¤ì§ë§, ì´ê¸° ë¡ë ìê°ì ë¶ì ì ì¸ ìí¥ì 미칩ëë¤. ì¬ì©ìê° ë§ì íì ì²í¬(ì: ìí¸ë¦¬ ì²í¬ì ìì)를 ë¤ì´ë¡ëí´ì¼ í ê²ì¼ë¡ ììëë ê²½ì° ì ì²´ ë¡ë ìê°ì´ í¥ìë©ëë¤.
new webpack.optimize.CommonsChunkPlugin({
// names: ["app", "subPageA"]
// (ì²í¬ë¥¼ ì ííê±°ë 모ë ì²í¬ë¥¼ ìëµíì¸ì)
children: true,
// (ì íë ì²í¬ì 모ë ììì ì íí©ëë¤)
// minChunks: 3,
// (모ëì ì®ê¸°ê¸° ì ì 3ëª
ì ììì´ ê³µì í´ì¼ í©ëë¤)
});ìì ê²ê³¼ ì ì¬íì§ë§ ê³µíµ ëª¨ëì ë¶ëª¨ë¡ ì´ëíë ëì (ì´ê¸° ë¡ë ìê°ì ì¦ê°ìí¤ê² ë©ëë¤) ë¹ë기ìì¼ë¡ ë¡ëë ìë¡ì´ ì¶ê° ê³µíµ ì²í¬ê° ì¬ì©ë©ëë¤. ì´ë ì¶ê° ì²í¬ê° ë¤ì´ë¡ëëë©´ ìëì¼ë¡ ë³ë ¬ë¡ ë¤ì´ë¡ëë©ëë¤.
new webpack.optimize.CommonsChunkPlugin({
name: 'app',
// ëë
names: ['app', 'subPageA'],
// ë¨ì¼ ì´ë¦ ëë ë°°ì´ ííì ì´ë¦ì ë¹ë기 ì²í¬ë¥¼ ìì±íë
// ìí¸ë¦¬ í¬ì¸í¸ì ì´ë¦ê³¼ ì¼ì¹í´ì¼ í©ëë¤.
children: true,
// (ì²í¬ì 모ë ììì ì¬ì©í©ëë¤)
async: true,
// (ë¹ë기 ê³µíµ ì²í¬ë¥¼ ìì±í©ëë¤)
minChunks: 3,
// (모ëì´ ë¶ë¦¬ë기 ì ì 3ëª
ì ììì´ ëª¨ëì ê³µì í´ì¼ í©ëë¤)
});minChunks property a functionëí minChunks ìì±ì í¨ì를 ì ë¬í ìë ììµëë¤. ì´ í¨ìë CommonsChunkPluginì ìí´ í¸ì¶ëë©° module ë° count ì¸ìë¡ í¨ì를 í¸ì¶í©ëë¤.
module ì¸ìë name/names ìì±ì íµí´ ì ê³µë ì²í¬ì ê° ëª¨ëì ëíë
ëë¤.
moduleì NormalModuleì ííë¡, ì´ ì¬ì© ì¬ë¡ì í¹í ì ì©í ë ê°ì ìì±ì´ ììµëë¤.
module.context: íì¼ì ì ì¥íë ëë í°ë¦¬ì
ëë¤. ì: '/my_project/node_modules/example-dependency'module.resource: ì²ë¦¬ì¤ì¸ íì¼ì ì´ë¦ì
ëë¤. ì: '/my_project/node_modules/example-dependency/index.js'count ì¸ìë moduleì´ ì¬ì©ëë ì²í¬ ì를 ëíë
ëë¤.
ì´ ìµì ì CommonsChunk ìê³ ë¦¬ì¦ì íµí´ 모ëì ì´ëí ìì¹ë¥¼ ê²°ì íë ë°©ë²ì ì¸ë°íê² ì ì´íë ¤ë ê²½ì°ì ì ì©í©ëë¤.
new webpack.optimize.CommonsChunkPlugin({
name: 'my-single-lib-chunk',
filename: 'my-single-lib-chunk.js',
minChunks: function (module, count) {
// 모ëì´ ê²½ë¡ë¥¼ ê°ì§ê³ ìê³ ê²½ë¡ì "somelib"ì´ ì¡´ì¬íê³
// 3ê°ì ê°ë³ ì²í¬/ìí¸ë¦¬ìì ì¬ì©ëë ê²½ì°
// ì²í¬ì í¤ ì´ë¦ì´ "my-single-lib-chunk", íì¼ ì´ë¦ì´ "my-single-lib-chunk.js"ë¡ ë¶í ë©ëë¤.
return module.resource && /somelib/.test(module.resource) && count === 3;
},
});ììì ë³¼ ì ìë¯ì´ ì´ ìì 를 ì¬ì©íë©´ í¨ì ë´ì 모ë ì¡°ê±´ì´ ì¶©ì¡±ëë ê²½ì°ìë§, íëì ë¼ì´ë¸ë¬ë¦¬ë¥¼ ë³ëì íì¼ë¡ ì´ëí ì ììµëë¤.
ì´ ê°ë ì ììì ê³µíµ vendor ì²í¬ë¥¼ ì»ëë° ì¬ì©í ì ììµëë¤.
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks: function (module) {
// ì´ë vendorì importê° node_modules ëë í°ë¦¬ì ì¡´ì¬íë¤ê³ ê°ì í©ëë¤.
return module.context && module.context.includes('node_modules');
},
});webpack ë¶í¸ì¤í¸ë© ë¡ì§ì ë³ëì íì¼ë¡ ì¶ì¶íë ¤ë©´ entryë¡ ì ìëì´ ìì§ ìì nameì CommonsChunkPluginì ì¬ì©íì¸ì. ìì¸í ë´ì©ì ìºì± ê°ì´ë를 참조íì¸ì.
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
minChunks: Infinity,
});vendorì manifest ì²í¬ë minChunksì ëí´ ë¤ë¥¸ ì ì를 ì¬ì©íë¯ë¡ íë¬ê·¸ì¸ì ë ë² í¸ì¶í´ì¼ í©ëë¤.
[
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks: function (module) {
return module.context && module.context.includes('node_modules');
},
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
minChunks: Infinity,
}),
];