ìë ì²í¬(ë° ê·¸ ìì ê°ì ¸ì¨ 모ë)ë webpack ë´ë¶ ê·¸ëíìì ë¶ëª¨-ìì ê´ê³ë¡ ì°ê²°ëììµëë¤. CommonsChunkPluginì ì¤ë³µëë ìì¡´ì±ì í¼íê³ ì ì¬ì©ëìì§ë§, ì¶ê° ìµì íë ë¶ê°ë¥íìµëë¤.
webpack v4ë¶í° optimization.splitChunks를 ìí´ CommonsChunkPluginì ì ê±°ëììµëë¤.
ì¦ì ì¬ì© ê°ë¥í SplitChunksPluginì ëë¶ë¶ì ì¬ì©ììê² ì ìëí©ëë¤.
ì´ê¸° ì²í¬ë¥¼ ë³ê²½íë©´ HTML íì¼ì´ íë¡ì í¸ë¥¼ ì¤íí기 ìí´ í¬í¨í´ì¼ íë ì¤í¬ë¦½í¸ íê·¸ì ìí¥ì 미ì¹ê¸° ë문ì 기본ì ì¼ë¡ on-demand ì²í¬ìë§ ìí¥ì 미칩ëë¤.
Webpackì ë¤ì ì¡°ê±´ì ë°ë¼ ìëì¼ë¡ ì²í¬ë¥¼ ë¶í í©ëë¤.
node_modules í´ëì ìë ê²½ì°ë§ì§ë§ ë ê°ì§ ì¡°ê±´ì 충족íë ¤ê³ í ë ë í° ì²í¬ê° ì í¸ë©ëë¤.
Webpackì ì´ ê¸°ë¥ì ëí ë ë§ì ì ì´ë¥¼ ìíë ê°ë°ì를 ìí´ ìµì ì¸í¸ë¥¼ ì ê³µí©ëë¤.
ì´ ì¤ì ê°ì²´ë SplitChunksPluginì 기본 ëìì ëíë
ëë¤.
webpack.config.js
module.exports = {
//...
optimization: {
splitChunks: {
chunks: 'async',
minSize: 20000,
minRemainingSize: 0,
minChunks: 1,
maxAsyncRequests: 30,
maxInitialRequests: 30,
enforceSizeThreshold: 50000,
cacheGroups: {
defaultVendors: {
test: /[\\/]node_modules[\\/]/,
priority: -10,
reuseExistingChunk: true,
},
default: {
minChunks: 2,
priority: -20,
reuseExistingChunk: true,
},
},
},
},
};string = '~'
기본ì ì¼ë¡ webpackì ì¶ì²ì ì²í¬ ì´ë¦ì ì¬ì©íì¬ ì´ë¦ì ìì±í©ëë¤(ì: vendors~main.js). ì´ ìµì
ì ì¬ì©íë©´ ìì±ë ì´ë¦ì ì¬ì©í êµ¬ë¶ ê¸°í¸ë¥¼ ì§ì í ì ììµëë¤.
string = 'async' function (chunk) RegExp
ì´ê²ì ìµì í를 ìí´ ì íë ì²í¬ë¥¼ ëíë
ëë¤. 문ìì´ì´ ì ê³µë ë ì í¨í ê°ì all, async ë° initialì
ëë¤. allì ì ê³µíë ê²ì ë¹ë기 ì²í¬ì ë기 ì²í¬ ê°ìë ì²í¬ë¥¼ ê³µì í ì ìë¤ë ê²ì ì미í기 ë문ì í¹í ê°ë ¥í ì ììµëë¤.
ëì²´ ìºì 그룹(splitChunks.fallbackCacheGroup.chunks)ìë ì ì©ë©ëë¤.
webpack.config.js
module.exports = {
//...
optimization: {
splitChunks: {
// 모ë ì íì ì²í¬ë¥¼ í¬í¨í©ëë¤.
chunks: 'all',
},
},
};ëë ë ë§ì ì ì´ë¥¼ ìí 기ë¥ì ì ê³µí ì ììµëë¤. ë°í ê°ì ê° ì²í¬ë¥¼ í¬í¨í ì§ ì¬ë¶ë¥¼ ëíë ëë¤.
module.exports = {
//...
optimization: {
splitChunks: {
chunks(chunk) {
// `my-excluded-chunk`를 ì ì¸í©ëë¤.
return chunk.name !== 'my-excluded-chunk';
},
},
},
};Webpack ë²ì 5.86.0 ì´ìì ì¬ì©íë ê²½ì° ì ê·ìì ì ë¬í ìë ììµëë¤.
module.exports = {
//...
optimization: {
splitChunks: {
chunks: /foo/,
},
},
};number = 30
on-demand ë¡ë ìì ìµë ë³ë ¬ ìì² ìì ëë¤.
number = 30
ìí¸ë¦¬ í¬ì¸í¸ì ìµë ë³ë ¬ ìì² ìì ëë¤.
[string] = ['javascript', 'unknown']
í¬ê¸°ì ì«ì를 ì¬ì©í ë ì ì©ëë í¬ê¸° ì íì ì¤ì í©ëë¤.
number = 1
모ëì´ ë¶í ì ì ì²í¬ ê°ì ê³µì ëì´ì¼ íë ìµì ê°ìì ëë¤.
boolean
maxSizeë¡ ë¶í ë ë¶ë¶ì ì´ë¦ì ë§ë¤ ë ê²½ë¡ ì ë³´ê° ë ¸ì¶ëì§ ìëë¡ í©ëë¤.
number = 20000 { [index: string]: number }
ìì±í ì²í¬ì ìµì byte í¬ê¸°ì ëë¤.
number { [index: string]: number }
ì²í¬ë¥¼ ìì±íë ë° íìí 기본 ì²í¬(ë²ë¤)ì ë°ì´í¸ ë¨ìì ì¤ì´ë¤ ìµì í¬ê¸°ì
ëë¤. ì¦, ì²í¬ë¡ ë¶í í´ë 기본 ì²í¬(ë²ë¤)ì í¬ê¸°ê° 주ì´ì§ ë°ì´í¸ë§í¼ ì¤ì´ë¤ì§ ìì¼ë©´ splitChunks.minSize ê°ì 충족íëë¼ë ë¶í ëì§ ììµëë¤.
splitChunks.cacheGroups.{cacheGroup}.enforceSizeThresholdnumber = 50000
ë¶í ì´ ì ì©ëê³ ê¸°í ì í(minRemainingSize, maxAsyncRequests, maxInitialRequests)ì´ ë¬´ìëë ìê³ í¬ê¸° ê°ì ëë¤.
splitChunks.cacheGroups.{cacheGroup}.minRemainingSizenumber = 0
splitChunks.minRemainingSize ìµì
ì ë¶í í ë¨ììë ì²í¬ì ìµì í¬ê¸°ê° ì íì ì´ê³¼íëë¡ íì¬ í¬ê¸°ê° 0ì¸ ëª¨ëì ë°©ì§í기 ìí´ webpack 5ì ëì
ëììµëë¤. 'development' 모ëìì 기본ê°ì 0ì
ëë¤. ë¤ë¥¸ ê²½ì° splitChunks.minRemainingSizeë 기본ì ì¼ë¡ splitChunks.minSize ê°ì¼ë¡ ì¤ì ëë¯ë¡ ì¬ì¸µ ì ì´ê° íìí ë문 ê²½ì°ë¥¼ ì ì¸íê³ ë ìëì¼ë¡ ì§ì í íìê° ììµëë¤.
splitChunks.cacheGroups.{cacheGroup}.layerRegExp string function
모ë ê³ì¸µë³ë¡ ìºì 그룹ì 모ëì í ë¹í©ëë¤.
number = 0
maxSize를 ì¬ì©íë©´(ìºì 그룹 optimization.splitChunks.cacheGroups[x].maxSizeë¹ ì ìì ì¼ë¡ optimization.splitChunks.maxSize ëë ëì²´ ìºì 그룹 optimization.splitChunks.fallbackCacheGroup.maxSizeì ê²½ì°) webpackì´ maxSize byteë³´ë¤ í° ì²í¬ë¥¼ ë ìì ë¶ë¶ì¼ë¡ ë¶í íëë¡ í©ëë¤. ë¶í ë í¬ê¸°ë ìµì minSize(maxSize ë¤ì)ì
ëë¤.
ìê³ ë¦¬ì¦ì ê²°ì ë¡ ì ì´ë©° 모ë ë³ê²½ì ë¡ì»¬ìë§ ìí¥ì 미칩ëë¤. ë°ë¼ì ì¥ê¸° ìºì±ì ì¬ì©í ë ì¬ì©í ì ìì¼ë©° 기ë¡ì´ íìíì§ ììµëë¤. maxSizeë íí¸ì¼ ë¿ì´ë©° 모ëì´ maxSize ë³´ë¤ í¬ê±°ë ë¶í ì´ minSize를 ë²ì´ë ë ìë°ë ì ììµëë¤.
ì²í¬ì ì´ë¯¸ ì´ë¦ì´ ìë ê²½ì° ê° ë¶ë¶ì í´ë¹ ì´ë¦ìì íìë ì ì´ë¦ì ì»ìµëë¤. optimization.splitChunks.hidePathInfoì ê°ì ë°ë¼ 첫 ë²ì§¸ 모ë ì´ë¦ì´ë í´ììì íìë í¤ë¥¼ ì¶ê°í©ëë¤.
maxSize ìµì
ì HTTP/2 ë° ì¥ê¸° ìºì±ê³¼ í¨ê» ì¬ì©í기 ìí ê²ì
ëë¤. ë ëì ìºì±ì ìí´ ìì²ìê° ì¦ê°í©ëë¤. ë¹ ë¥¸ ì¬êµ¬ì¶ì ìí´ íì¼ í¬ê¸°ë¥¼ ì¤ì´ë ë°ë ì¬ì©í ì ììµëë¤.
number
maxSizeì ë§ì°¬ê°ì§ë¡ maxAsyncSizeë ì ìì ì¼ë¡(splitChunks.maxAsyncSize) ìºì 그룹(splitChunks.cacheGroups.{cacheGroup}.maxAsyncSize) ëë ëì²´ ìºì 그룹(splitChunks.fallbackCacheGroup.maxAsyncSize)ì ì ì©ë ì ììµëë¤.
maxAsyncSizeì maxSizeì ì°¨ì´ì ì maxAsyncSizeê° on-demand ë¡ë© ì²í¬ìë§ ìí¥ì 미ì¹ë¤ë ì ì
ëë¤.
number
maxSizeì ë§ì°¬ê°ì§ë¡ maxInitialSizeë ì ìì ì¼ë¡(splitChunks.maxInitialSize) ìºì 그룹(splitChunks.cacheGroups.{cacheGroup}.maxInitialSize) ëë ëì²´ ìºì 그룹(splitChunks.fallbackCacheGroup.maxInitialSize)ì ì ì©ë ì ììµëë¤.
maxInitialSizeì maxSizeì ì°¨ì´ì ì maxInitialSizeê° ì´ê¸° ë¡ë© ì²í¬ ìë§ ìí¥ì 미ì¹ë¤ë ê²ì
ëë¤.
boolean = false function (module, chunks, cacheGroupKey) => string string
ëí splitChunks.cacheGroups.{cacheGroup}.nameì ê°ì´ ê° ìºì 그룹ì ëí´ìë ì¬ì© ê°ë¥í©ëë¤.
ì´ë ë¶í ì²í¬ì ì´ë¦ì
ëë¤. false를 ì ê³µíë©´ ì²í¬ì ì´ë¦ì´ ëì¼íê² ì ì§ëë¯ë¡ ë¶íìíê² ì´ë¦ì´ ë³ê²½ëì§ ììµëë¤. íë¡ëì
ë¹ëì ê¶ì¥ëë ê°ì
ëë¤.
문ìì´ì´ë í¨ì를 ì ê³µíë©´ ì´ë¦ì 커ì¤í í ì ììµëë¤. íì ê°ì 문ìì´ì ë°ííë 문ìì´ì´ë í¨ì를 ì§ì íë©´ 모ë ê³µíµ ëª¨ëê³¼ vendorê° ë¨ì¼ ì²í¬ë¡ ë³í©ë©ëë¤. ì´ë¡ ì¸í´ ì´ê¸° ë¤ì´ë¡ëê° ë 커ì§ê³ íì´ì§ ë¡ëê° ëë ¤ì§ ì ììµëë¤.
í¨ì를 ëª
ìí ê²½ì° ì²í¬ì ì´ë¦ì ì ííë ë° í¹í ì ì©í chunk.name ìì±(ì¬ê¸°ì chunkë chunks ë°°ì´ì ìì)ì ì°¾ì ì ììµëë¤.
splitChunks.nameì´ ìí¸ë¦¬ í¬ì¸í¸ì´ë¦ê³¼ ì¼ì¹íë©´ ìí¸ë¦¬ í¬ì¸í¸ ì²í¬ ë° ìºì ê·¸ë£¹ì´ ë¨ì¼ ì²í¬ë¡ ê²°í©ë©ëë¤.
main.js
import _ from 'lodash';
console.log(_.join(['Hello', 'webpack'], ' '));webpack.config.js
module.exports = {
//...
optimization: {
splitChunks: {
cacheGroups: {
commons: {
test: /[\\/]node_modules[\\/]/,
// ì¬ê¸°ì cacheGroupKeyë cacheGroupì í¤ë¡ `commons`ì
ëë¤.
name(module, chunks, cacheGroupKey) {
const moduleFileName = module
.identifier()
.split('/')
.reduceRight((item) => item);
const allChunksNames = chunks.map((item) => item.name).join('~');
return `${cacheGroupKey}-${allChunksNames}-${moduleFileName}`;
},
chunks: 'all',
},
},
},
},
};splitChunks 구ì±ì¼ë¡ webpackì ì¤ííë©´ ë¤ìì ì´ë¦ì¼ë¡ ê³µíµ ê·¸ë£¹ ì²í¬ë ì¶ë ¥ë©ëë¤. commons-main-lodash.js.e7519d2bb8777058fa27.js(í´ìë ì¤ì ì¶ë ¥ì ìë¡ ì ê³µë©ëë¤).
splitChunks.cacheGroups{cacheGroup}.usedExportsboolean = true
모ëì´ export í íì¼ì ì´ë¦ì ìì (mangle)íê³ ì¬ì©íì§ ìë export를 ìëµíê³ ë³´ë¤ í¨ì¨ì ì¸ ì½ë를 ìì±í기 ìí´ ì´ë¤ export를 ì¬ì©íëì§ ììë´
ëë¤.
trueì¸ ê²½ì° ê° ë°íìì ëí´ ì¬ì©ë export를 ë¶ìíê³ , "global"ì¸ ê²½ì° ê²°í©í 모ë ë°íìì ëí´ ì ìì ì¼ë¡ export를 ë¶ìí©ëë¤.
ìºì 그룹ì splitChunks.*ì 모ë ìµì
ì ìì ë°(ëë) ì¬ì ìí ì ììµëë¤. ê·¸ë¬ë test, priority ë° reuseExistingChunkë ìºì 그룹 ìì¤ììë§ êµ¬ì±í ì ììµëë¤. 기본 ìºì 그룹ì ë¹íì±ííë ¤ë©´ falseë¡ ì¤ì íì¸ì.
webpack.config.js
module.exports = {
//...
optimization: {
splitChunks: {
cacheGroups: {
default: false,
},
},
},
};splitChunks.cacheGroups.{cacheGroup}.prioritynumber = -20
모ëì ì¬ë¬ ìºì 그룹ì ìí ì ììµëë¤. ìµì íë priority(ì°ì ìì)ê° ë ëì ìºì 그룹ì ì í¸í©ëë¤. 기본 그룹ì 커ì¤í
ê·¸ë£¹ì´ ë ëì ì°ì ìì를 ê°ì§ ì ìëë¡ ìì ì°ì ìì를 ê°ìµëë¤(커ì¤í
ê·¸ë£¹ì¼ ê²½ì° ê¸°ë³¸ê°ì 0ì
ëë¤).
splitChunks.cacheGroups.{cacheGroup}.reuseExistingChunkboolean = true
íì¬ ì²í¬ì ì´ë¯¸ 기본 ë²ë¤ìì ë¶ë¦¬ë 모ëì´ í¬í¨ëì´ ìì¼ë©´ ìë¡ ìì±ëë ëì ì¬ì¬ì©ë©ëë¤. ì´ê²ì ì²í¬ì íì¼ ì´ë¦ì ìí¥ì ì¤ ì ììµëë¤.
webpack.config.js
module.exports = {
//...
optimization: {
splitChunks: {
cacheGroups: {
defaultVendors: {
reuseExistingChunk: true,
},
},
},
},
};splitChunks.cacheGroups.{cacheGroup}.typefunction RegExp string
모ë ì íë³ë¡ ìºì 그룹ì 모ëì í ë¹í ì ììµëë¤.
webpack.config.js
module.exports = {
//...
optimization: {
splitChunks: {
cacheGroups: {
json: {
type: 'json',
},
},
},
},
};splitChunks.cacheGroups.{cacheGroup}.testfunction (module, { chunkGraph, moduleGraph }) => boolean RegExp string
ìºì 그룹ì ìí´ ì íëë 모ëì ì ì´í©ëë¤. ìëµíë©´ 모ë 모ëì´ ì íë©ëë¤. ì´ë ì ë ê²½ë¡ ëª¨ë 리ìì¤ ëë ì²í¬ ì´ë¦ê³¼ ì¼ì¹í ì ììµëë¤. ì²í¬ ì´ë¦ì´ ì¼ì¹íë©´ ì²í¬ì 모ë 모ëì´ ì íë©ëë¤.
ìëì ê°ì´ {cacheGroup}.testì 기ë¥ì ì ê³µí©ëë¤.
webpack.config.js
module.exports = {
//...
optimization: {
splitChunks: {
cacheGroups: {
svgGroup: {
test(module) {
// `module.resource`ë ëì¤í¬ì ìë íì¼ì ì ë ê²½ë¡ë¥¼ í¬í¨í©ëë¤.
// íë«í¼ ê° í¸íì±ì ìí´ / ëë \ ëì `path.sep`ì ì¬ì©í©ëë¤.
const path = require('path');
return (
module.resource &&
module.resource.endsWith('.svg') &&
module.resource.includes(`${path.sep}cacheable_svgs${path.sep}`)
);
},
},
byModuleTypeGroup: {
test(module) {
return module.type === 'javascript/auto';
},
},
},
},
},
};module ë° chunks ê°ì²´ìì ì´ë¤ ì 보를 ì¬ì©í ì ìëì§ íì¸íë ¤ë©´ ì½ë°±ì debugger; 문ì ë£ì¼ë©´ ë©ëë¤. ê·¸ë° ë¤ì ëë²ê·¸ 모ëìì webpack ë¹ë를 ì¤ííì¬ Chromium DevToolsì íë¼ë¯¸í°ë¥¼ ê²ì¬í©ëë¤.
ìëë {cacheGroup}.testì RegExp를 ì ê³µí ê²½ì°ì
ëë¤.
webpack.config.js
module.exports = {
//...
optimization: {
splitChunks: {
cacheGroups: {
defaultVendors: {
// íë«í¼ ê° í¸íì±ì ìí ê²½ë¡ êµ¬ë¶ ê¸°í¸ë¡ `[\\/]`ì ì¬ì©ì ì ìíì¸ì.
test: /[\\/]node_modules[\\/]|vendor[\\/]analytics_provider|vendor[\\/]other_lib/,
},
},
},
},
};splitChunks.cacheGroups.{cacheGroup}.filenamestring function (pathData, assetInfo) => string
ì´ê¸° ì²í¬ì¸ ê²½ì°ìë§ íì¼ ì´ë¦ì ì¬ì ìí ì ììµëë¤.
output.filenameìì ì¬ì©í ì ìë 모ë íë ì´ì¤íëë ì¬ê¸°ììë ì¬ì©í ì ììµëë¤.
webpack.config.js
module.exports = {
//...
optimization: {
splitChunks: {
cacheGroups: {
defaultVendors: {
filename: '[name].bundle.js',
},
},
},
},
};ìëë í¨ìë¡ ì¬ì©íë ë°©ë²ì ëë¤.
webpack.config.js
module.exports = {
//...
optimization: {
splitChunks: {
cacheGroups: {
defaultVendors: {
filename: (pathData) => {
// ì구 ì¬íì ë°ë¼ íì¼ ì´ë¦ 문ìì´ì ìì±í기 ìí´ pathData ê°ì²´ë¥¼ ì¬ì©íì¸ì.
return `${pathData.chunk.name}-bundle.js`;
},
},
},
},
},
};íì¼ ì´ë¦ ìì ê²½ë¡ë¥¼ ì ê³µíì¬ í´ë 구조를 ìì±í ì ììµëë¤(ì: 'js/vendor/bundle.js').
webpack.config.js
module.exports = {
//...
optimization: {
splitChunks: {
cacheGroups: {
defaultVendors: {
filename: 'js/[name]/bundle.js',
},
},
},
},
};splitChunks.cacheGroups.{cacheGroup}.enforceboolean = false
Webpackì splitChunks.minSize, splitChunks.minChunks, splitChunks.maxAsyncRequests ë° splitChunks.maxInitialRequests ìµì
ì 무ìíê³ íì ì´ ìºì 그룹ì ëí ì²í¬ë¥¼ ìì±íëë¡ ì§ìí©ëë¤.
webpack.config.js
module.exports = {
//...
optimization: {
splitChunks: {
cacheGroups: {
defaultVendors: {
enforce: true,
},
},
},
},
};splitChunks.cacheGroups.{cacheGroup}.idHintstring
ì²í¬ IDì ëí íí¸ë¥¼ ì¤ì í©ëë¤. ì²í¬ì íì¼ ì´ë¦ì ì¶ê°ë©ëë¤.
webpack.config.js
module.exports = {
//...
optimization: {
splitChunks: {
cacheGroups: {
defaultVendors: {
idHint: 'vendors',
},
},
},
},
};// index.js
import('./a'); // ëì import// a.js
import 'react';
//...ê²°ê³¼: react를 í¬í¨íë ë³ëì ì²í¬ê° ìì±ë©ëë¤. import í¸ì¶ìì ì´ ì²í¬ë ./a를 í¬í¨íë ìë ì²í¬ì ë³ë ¬ë¡ ë¡ëë©ëë¤.
ì´ì :
node_modulesì 모ëì í¬í¨í©ëë¤reactê° 30kbë³´ë¤ í½ëë¤ì´ ì´ì ë 무ìì¼ê¹ì? reactë ì í리ì¼ì´ì
ì½ëë§í¼ ì주 ë³ê²½ëì§ ìì ê²ì
ëë¤. ë³ëì ì²í¬ë¡ ì´ëíë©´ ì´ ì²í¬ë¥¼ ì± ì½ëì ë³ëë¡ ìºìí ì ììµëë¤(ì²í¬ í´ì, ë ì½ë, Cache-Control ëë ì¥ê¸° ìºì ì ê·¼ ë°©ìì ì¬ì©íë¤ê³ ê°ì í©ëë¤).
// entry.js
// ëì imports
import('./a');
import('./b');// a.js
import './helpers'; // helpersì í¬ê¸°ë 40kbì
ëë¤
//...// b.js
import './helpers';
import './more-helpers'; // more-helpers ëí 40kbì í¬ê¸°ë¥¼ ê°ì§ëë¤
//...ê²°ê³¼: ./helpersì ì´ì ëí 모ë ìì¡´ì±ì í¬í¨íë ë³ëì ì²í¬ê° ìì±ë©ëë¤. import í¸ì¶ìì ì´ ì²í¬ë ìë ì²í¬ì ë³ë ¬ë¡ ë¡ëë©ëë¤.
ì´ì :
helpersë 30kbë³´ë¤ í½ëë¤helpersì ë´ì©ì ê° ì²í¬ì ë£ì¼ë©´ ì½ëê° ë ë² ë¤ì´ë¡ëë©ëë¤. ë³ëì ì²í¬ë¥¼ ì¬ì©íë©´ í ë²ë§ ë°ìí©ëë¤. ì°ë¦¬ë ì¶ê° ìì² ë¹ì©ì ì§ë¶íë©° ì´ë ì ì¶©ìì¼ë¡ ê°ì£¼í ì ììµëë¤. ê·¸ë 기 ë문ì ìµì í¬ê¸°ë 30kbì
ëë¤.
ìí¸ë¦¬ í¬ì¸í¸ ê°ì ê³µì ëë 모ë ì½ë를 í¬í¨íë commons ì²í¬ë¥¼ ë§ëëë¤.
webpack.config.js
module.exports = {
//...
optimization: {
splitChunks: {
cacheGroups: {
commons: {
name: 'commons',
chunks: 'initial',
minChunks: 2,
},
},
},
},
};ì ì²´ ì í리ì¼ì´ì
ìì node_modulesì 모ë ì½ë를 í¬í¨íë vendors ì²í¬ë¥¼ ë§ëëë¤.
webpack.config.js
module.exports = {
//...
optimization: {
splitChunks: {
cacheGroups: {
commons: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all',
},
},
},
},
};RegExpì ì¼ì¹íë í¹ì node_modules í¨í¤ì§ë¥¼ í¬í¨íë custom vendor ì²í¬ë¥¼ ë§ëëë¤.
webpack.config.js
module.exports = {
//...
optimization: {
splitChunks: {
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/](react|react-dom)[\\/]/,
name: 'vendor',
chunks: 'all',
},
},
},
},
};