ì´ ìµì ì íë¡ì í¸ ë´ìì ë¤ë¥¸ ì íì 모ëì ì²ë¦¬íë ë°©ë²ì ê²°ì í©ëë¤.
모ëì 기본ì ì¼ë¡ ì ì©ëë ê·ì¹ì ë°°ì´ì ëë¤.
ìì¸í ë´ì©ì ìì¤ ì½ë를 ì°¸ê³ íì¸ì.
module.exports = {
module: {
defaultRules: [
'...', // "..."를 ì¬ì©íì¬ ê¸°ë³¸ì ì¼ë¡ webpackì ìí´ ì ì©ëë ê·ì¹ì 참조í ì ììµëë¤.
],
},
};Webpack 5.87.0ë¶í° 0, "", false, null ë° undefined를 í¬í¨í falsy ê°ì module.defaultRulesë¡ ì ë¬íì¬ í¹ì ê·ì¹ì ì¡°ê±´ë¶ë¡ ë¹íì±íí ì ììµëë¤.
module.exports = {
module: {
defaultRules: [
false &&
{
// ì´ ê·ì¹ì ë¹íì±íë©ëë¤.
},
],
},
};module.generator를 ì¬ì©íì¬ í ê³³ìì 모ë ì ëë ì´í°ì ìµì
ì ì¤ì í ì ììµëë¤.
webpack.config.js
module.exports = {
module: {
generator: {
asset: {
// asset 모ë ì ëë ì´í° ìµì
// ì´ ì ì
ì ë°ì´ëë¦¬ë¡ ì²ë¦¬í´ì¼ íëì§ ì¬ë¶ë¥¼ ëíë
ëë¤. ëì í
ì¤í¸ë¡ ì²ë¦¬íë ¤ë©´ 'false'ë¡ ì¤ì í©ëë¤. webpack 5.93.0ë¶í° ì¬ì© ê°ë¥í©ëë¤.
binary: false,
// ë°ì´í° URL ì ëë ì´í° ìµì
ì
ëë¤.
dataUrl: {
// ì ì
ì¸ì½ë©(기본ê°ì "base64")
// type: 'base64' | false
encoding: 'base64',
// ì ì
Mimetype (기본ì ì¼ë¡ íì¼ íì¥ììì ê°ì ¸ìµëë¤).
// type: string
mimetype: 'image/png',
},
// ì´ ì ì
모ëìì ì¶ë ¥ ì ì
ì ë´ë³´ë
ëë¤. ì를 ë¤ì´ SSRì ê²½ì° ë´ë³´ë´ê¸°ë¥¼ ìëµíë ¤ë©´ 'false'ë¡ ì¤ì í ì ììµëë¤.
// type: boolean
emit: true,
// ì´ ì ì
모ëì íì¼ ì´ë¦ì ì¬ì©ì ì ìí©ëë¤.
// type: string | ((pathData: PathData, assetInfo?: AssetInfo) => string)
filename: 'static/[path][name][ext]',
// asset 모ëì ìí publicPath ì¬ì©ì ì ì. webpack 5.28.0 ì´íë¡ ì¬ì© ê°ë¥.
// type: string | ((pathData: PathData, assetInfo?: AssetInfo) => string)
publicPath: 'https://cdn/assets/',
// Webpack 5.67.0ë¶í° ì¬ì© ê°ë¥í 'output.path'를 기ì¤ì¼ë¡ ì§ì ë í´ëì ì ì
ì ë´ë³´ë
ëë¤.
// type: string | ((pathData: PathData, assetInfo?: AssetInfo) => string)
outputPath: 'cdn-assets/',
},
'asset/inline': {
// asset/inline 모ë ì ëë ì´í° ìµì
// ì´ ì ì
ì ë°ì´ëë¦¬ë¡ ì²ë¦¬í´ì¼ íëì§ ì¬ë¶ë¥¼ ëíë
ëë¤. ëì í
ì¤í¸ë¡ ì²ë¦¬íë ¤ë©´ 'false'ë¡ ì¤ì í©ëë¤. webpack 5.93.0ë¶í° ì¬ì© ê°ë¥í©ëë¤.
binary: false,
// ë°ì´í° URL ì ëë ì´í° ìµì
dataUrl: {
// ì ì
ì¸ì½ë©(기본ê°ì "base64")
// type: 'base64' | false
encoding: 'base64',
// ì ì
Mimetype (기본ì ì¼ë¡ íì¼ íì¥ììì ê°ì ¸ìµëë¤).
// type: string
mimetype: 'image/png',
},
},
'asset/resource': {
// asset/resource 모ë ì ëë ì´í° ìµì
// ì´ ì ì
ì ë°ì´ëë¦¬ë¡ ì²ë¦¬í´ì¼ íëì§ ì¬ë¶ë¥¼ ëíë
ëë¤. ëì í
ì¤í¸ë¡ ì²ë¦¬íë ¤ë©´ 'false'ë¡ ì¤ì í©ëë¤. webpack 5.93.0ë¶í° ì¬ì© ê°ë¥í©ëë¤.
binary: false,
// ì´ ì ì
모ëìì ì¶ë ¥ ì ì
ì ë´ë³´ë
ëë¤. ì를 ë¤ì´ SSRì ê²½ì° ë´ë³´ë´ê¸°ë¥¼ ìëµíë ¤ë©´ 'false'ë¡ ì¤ì í ì ììµëë¤.
// type: boolean
emit: true,
// ì´ ì ì
모ëì íì¼ ì´ë¦ì ì¬ì©ì ì ìí©ëë¤.
// type: string | ((pathData: PathData, assetInfo?: AssetInfo) => string)
filename: 'static/[path][name][ext]',
// asset/resource 모ëì ìí publicPath ì¬ì©ì ì ì. webpack 5.28.0 ì´íë¡ ì¬ì© ê°ë¥.
// type: string | ((pathData: PathData, assetInfo?: AssetInfo) => string)
publicPath: 'https://cdn/assets/',
// Webpack 5.67.0ë¶í° ì¬ì© ê°ë¥í 'output.path'를 기ì¤ì¼ë¡ ì§ì ë í´ëì ì ì
ì ë´ë³´ë
ëë¤.
// type: string | ((pathData: PathData, assetInfo?: AssetInfo) => string)
outputPath: 'cdn-assets/',
},
'asset/bytes': {
// ìì§ ì´ ëª¨ë ì íì ëí´ ì§ìëë ì ëë ì´í° ìµì
ì´ ììµëë¤.
}
javascript: {
// ì´ ëª¨ë ì íìë ìì§ ì ëë ì´í° ìµì
ì´ ì§ìëì§ ììµëë¤.
},
'javascript/auto': {
// ìì ëì¼
},
'javascript/dynamic': {
// ìì ëì¼
},
'javascript/esm': {
// ìì ëì¼
},
css: {
// CSS 모ëì© ì ëë ì´í° ìµì
// ì¤íì¼ìí¸ë¥¼ ìì±íê³ ë¡ëíë ê²ì í¼íê³ ì¶ë ¥ ìë°ì¤í¬ë¦½í¸ íì¼ì cssì ë´ë³´ë´ê¸°ë§ í¬í¨í©ëë¤.
// type: boolean, webpack 5.90.0ë¶í° ì¬ì© ê°ë¥í©ëë¤.
exportsOnly: true,
// CSS ë´ë³´ë´ê¸° ì´ë¦ì ê·¸ëë¡ ì ì§íê±°ë ì¹´ë© ì¼ì´ì¤ë¡ ë³ííë ë± javascript 모ëë¡ ë´ë³´ë´ë ë°©ë²ì ì¬ì©ì ì ìí©ëë¤.
// type: 'as-is' | 'camel-case' | 'camel-case-only' | 'dashes' | 'dashes-only' | ((name: string) => string)
// webpack 5.90.4ë¶í° ì¬ì© ê°ë¥í©ëë¤.
exportsConvention: 'camel-case-only',
},
'css/auto': {
// CSS/ìë 모ë ìì±ì© ìµì
// ì¤íì¼ìí¸ë¥¼ ìì±íê³ ë¡ëíë ê²ì í¼íê³ ì¶ë ¥ ìë°ì¤í¬ë¦½í¸ íì¼ì cssì ë´ë³´ë´ê¸°ë§ í¬í¨í©ëë¤.
// type: boolean, webpack 5.90.0ë¶í° ì¬ì© ê°ë¥í©ëë¤.
exportsOnly: true,
// CSS ë´ë³´ë´ê¸° ì´ë¦ì ê·¸ëë¡ ì ì§íê±°ë ì¹´ë© ì¼ì´ì¤ë¡ ë³ííë ë± javascript 모ëë¡ ë´ë³´ë´ë ë°©ë²ì ì¬ì©ì ì ìí©ëë¤.
// type: 'as-is' | 'camel-case' | 'camel-case-only' | 'dashes' | 'dashes-only' | ((name: string) => string)
// webpack 5.90.4ë¶í° ì¬ì© ê°ë¥í©ëë¤.
exportsConvention: 'camel-case-only',
// CSS 모ëì ëí´ ìì±ë ë¡ì»¬ í´ëì¤ ì´ë¦ì íìì ì¬ì©ì ì ìí©ëë¤.
// type: string, https://webpack.js.org/configuration/output/#template-stringsì íì¼ ìì¤ ë° ëª¨ë ìì¤ ëì²´ ì¸ìë [uniqueName] ë° [local]ë í¬í¨ë©ëë¤.
// webpack 5.90.4ë¶í° ì¬ì© ê°ë¥í©ëë¤.
localIdentName: '[uniqueName]-[id]-[local]',
},
'css/global': {
// ìì ëì¼
},
'css/module': {
// ìì ëì¼
},
json: {
// JSON 모ëì ëí ìì±ê¸° ìµì
// JSON 문ìì´ì´ 20ì를 ëë ê²½ì° `JSON.parse`를 ì¬ì©í©ëë¤.
JSONParse: true,
},
// ê·¸ì¸ ë¤ë¥¸ ìµì
ë¤â¦
},
},
};module.generatorì²ë¼ module.parser를 ì¬ì©íì¬ í ê³³ìì 모ë íìì ìµì
ì ì¤ì í ì ììµëë¤.
webpack.config.js
module.exports = {
module: {
parser: {
asset: {
// asset 모ë íì ìµì
// ë°ì´í° URL ì ëë ì´í° ìµì
ì
ëë¤.
dataUrl: {
// ì ì
ì¸ì½ë©(기본ê°ì "base64")
// type: 'base64' | false
encoding: 'base64',
// ì ì
Mimetype (기본ì ì¼ë¡ íì¼ íì¥ììì ê°ì ¸ìµëë¤).
// type: string
mimetype: 'image/png',
},
// ì´ ì ì
모ëìì ì¶ë ¥ ì ì
ì ë´ë³´ë
ëë¤. ì를 ë¤ì´ SSRì ê²½ì° ë´ë³´ë´ê¸°ë¥¼ ìëµíë ¤ë©´ 'false'ë¡ ì¤ì í ì ììµëë¤.
// type: boolean
emit: true,
// ì´ ì ì
모ëì íì¼ ì´ë¦ì ì¬ì©ì ì ìí©ëë¤.
// type: string | ((pathData: PathData, assetInfo?: AssetInfo) => string)
filename: 'static/[path][name][ext]',
// asset 모ëì ìí publicPath ì¬ì©ì ì ì. webpack 5.28.0 ì´íë¡ ì¬ì© ê°ë¥.
// type: string | ((pathData: PathData, assetInfo?: AssetInfo) => string)
publicPath: 'https://cdn/assets/',
// Webpack 5.67.0ë¶í° ì¬ì© ê°ë¥í 'output.path'를 기ì¤ì¼ë¡ ì§ì ë í´ëì ì ì
ì ë´ë³´ë
ëë¤.
// type: string | ((pathData: PathData, assetInfo?: AssetInfo) => string)
outputPath: 'cdn-assets/',
},
'asset/inline': {
// ì´ ëª¨ë ì íìë ìì§ íì ìµì
ì´ ì§ìëì§ ììµëë¤.
},
'asset/resource': {
// ìì ëì¼
},
'asset/source': {
// ìì ëì¼
},
'asset/bytes': {
// ìì ëì¼
},
javascript: {
// javascript 모ë íì ìµì
// ì. require.ensure 구문 íì± íì±í
requireEnsure: true,
// 모ëì 'ì격' ëë 'ë¹ì격' 모ëë¡ ì¤ì í©ëë¤. ì격 모ëì ë¹ì격 모ë ê°ì ì¼ë¶ ëìì´ ë¤ë¥´ê¸° ë문ì ì´ë 모ëì ëìì ìí¥ì ë¯¸ì¹ ì ììµëë¤.
overrideStrict: 'non-strict',
},
'javascript/auto': {
// ìì ëì¼
},
'javascript/dynamic': {
// ìì ëì¼
},
'javascript/esm': {
// ìì ëì¼
},
css: {
// CSS 모ëì íì ìµì
// Webpack 5.97.0ë¶í° ì¬ì© ê°ë¥í `@import` at-rules ì²ë¦¬ë¥¼ íì±í/ë¹íì±íí©ëë¤.
// type: boolean
import: true,
// webpack 5.97.0ë¶í° ì¬ì© ê°ë¥í url()/image-set()/src()/image() í¨ì ì²ë¦¬ë¥¼ íì±í/ë¹íì±íí©ëë¤.
// type: boolean
url: true,
// Webpack 5.90.0ë¶í° ì¬ì©í ì ìë CSS ë´ë³´ë´ê¸°ë¥¼ ìí´ exportë¼ë ì´ë¦ì ES 모ëì ì¬ì©íì¸ì.
// type: boolean
namedExports: true,
// CSS ì½í
ì¸ ê° ë´ë³´ë´ì§ë ë°©ìì ì¤ì í©ëë¤.
// type: string
exportType: 'link',
},
'css/auto': {
// ìì ëì¼
},
'css/global': {
// ìì ëì¼
},
'css/module': {
// ìì ëì¼
},
// ê·¸ì¸ ë¤ë¥¸ ìµì
ë¤â¦
},
},
};CSS íìì ëí ìµì ì ì¤ì í©ëë¤.
module.exports = {
module: {
parser: {
css: {
// ...
namedExports: true,
},
},
},
};ì´ ìµì
ì CSS íì¼ìì @import at-rules를 ì²ë¦¬í ì ìëë¡ í©ëë¤. trueë¡ ì¤ì íë©´ @import ë¬¸ì´ ì²ë¦¬ëì´ ë¤ë¥¸ CSS íì¼ìì ì¤íì¼ì 모ëìì¼ë¡ í¬í¨í ì ììµëë¤.
Type: boolean
Available: 5.97.0+
Example:
module.exports = {
module: {
parser: {
css: {
import: true,
},
},
},
};/* reset-styles.css */
body {
margin: 0;
padding: 0;
}/* styles.css */
@import './reset-styles.css';
body {
background-color: red;
}ì´ ìµì
ì CSS íì¼ ë´ url(), image-set(), src(), image()ì ê°ì í¨ììì URL ì²ë¦¬ë¥¼ íì±í ëë ë¹íì±íí©ëë¤. íì±ííë©´ ì´ë¬í URLì WebPackìì íì¸ ë° ì²ë¦¬ë©ëë¤.
Type: boolean
Available: 5.97.0+
Example:
module.exports = {
module: {
parser: {
css: {
url: true,
},
},
},
};/* styles.css */
.background {
background-image: url('./images/bg.jpg');
}
.icon {
content: image('./icons/star.svg');
}ì´ ìµì
ì ì¬ì©íë©´ CSS ë´ë³´ë´ê¸°ì exportë¼ë ì´ë¦ì ES 모ëì ì¬ì©í ì ììµëë¤. trueë¡ ì¤ì íë©´ CSS 모ëì ì´ë¦ì´ ì§ì ë ë´ë³´ë´ê¸°ë¥¼ ì¬ì©íì¬ í´ëì¤ì ì¤íì¼ì ë´ë³´ë
ëë¤.
Type: boolean
Available: 5.90.0+
Example:
module.exports = {
module: {
parser: {
css: {
namedExports: true,
},
},
},
};CSS 모ëì ëí´ namedExportsê° falseì¸ ê²½ì° ë¤ìí ê°ì ¸ì¤ê¸° ë°©ë²ì ì¬ì©íì¬ CSS í´ëì¤ë¥¼ ê²ìí ì ììµëë¤.
ì´ë¦ì´ ì§ì ëì ë´ë³´ë´ê¸°ë ê°ë°ì íê²½(DX)ì ê°ì í기 ìí´ ë¦¬ëë ì
ëì´ ê¸°ë³¸ ë´ë³´ë´ê¸°ìì ì´ë¦ì´ ì§ì ë ë´ë³´ë´ê¸°ë¡ ìííê² ì íí ì ììµëë¤.
import * as styles from './styles.module.css';
import styles1 from './styles.module.css';
import { foo } from './styles.module.css';
console.log(styles.default.foo); // styles.default를 íµí´ ì ê·¼
console.log(styles.foo); // stylesìì ì§ì ì ê·¼
console.log(styles1.foo); // 기본 ê°ì ¸ì¤ê¸°ë¥¼ íµí´ styles1ì ì ê·¼
console.log(foo); // ë°ë¡ ëª
ëª
ë ì´ë¦ì¼ë¡ ê°ì ¸ì¤ê¸°namedExportsê° íì±íëë©´(기본 ëì) ì´ë¦ì´ ì§ì ë ë´ë³´ë´ê¸°ë§ ì¬ì©íì¬ CSS í´ëì¤ë¥¼ ê°ì ¸ì¬ ì ììµëë¤.
/* styles.css */
.header {
color: blue;
}
.footer {
color: green;
}import { header, footer } from './styles.module.css';namedExports를 íì±ííë©´ JavaScript íë¡ì í¸ìì CSS를 ê´ë¦¬íë ë° ë 모ëíëê³ ì ì§ ê´ë¦¬ ê°ë¥í ì ê·¼ ë°©ìì ì±ííê³ ES 모ë 구문ì íì©íì¬ ë ëª
ííê³ ëª
ìì ì¸ ê°ì ¸ì¤ê¸°ë¥¼ ìíí ì ììµëë¤.
CSS ì½í ì¸ ë¥¼ ë´ë³´ë´ë ë°©ë²ì ì¤ì í©ëë¤.
Type: boolean
Available: 5.102.0+
Example:
module.exports = {
module: {
parser: {
css: {
// ...
exportType: 'text',
},
},
},
};ê°ë¥í ì¤ì ê°: `'link' | 'text' | 'css-style-sheet'
link - CSS를 ìì²´ íì¼ë¡ ì¶ì¶íê³ link í그를 ì¬ì©íì¬ DOMì ì½ì
í©ëë¤.text - CSS를 JS íì¼ì ì ì¥íê³ ê¸°ë³¸ ë´ë³´ë´ê¸°ë¥¼ ì¬ì©íì¬ ë°íí©ëë¤.css-style-sheet - 기본 ë´ë³´ë´ê¸°ë ìì± ê°ë¥í ì¤íì¼ìí¸(ì: CSSStyleSheet)ì
ëë¤. ì¬ì©ì ì ì ììì Shadow DOMì ì ì©í©ëë¤.JavaScript íì를 ìí ìµì ì ì¤ì í ì ììµëë¤.
module.exports = {
module: {
parser: {
javascript: {
// ...
commonjsMagicComments: true,
},
},
},
};Rule.parserìì ì´ë¬í ìµì
ì ì¤ì íê³ í¹ì 모ëì ëìì¼ë¡ ì§ì í ì ììµëë¤.
CommonJS를 ìí´ magic comments ì§ìì íì±íí ì ììµëë¤.
íì
: boolean
ê°ë¥í ë²ì : 5.17.0+
ìì :
module.exports = {
module: {
parser: {
javascript: {
commonjsMagicComments: true,
},
},
},
};webpackIgnore 주ìë§ ì§ìë©ëë¤.
const x = require(/* webpackIgnore: true */ 'x');ëì import를 ìí´ ì ì fetchPriority를 ì§ì í©ëë¤.
íì
: 'low' | 'high' | 'auto' | false
ê°ë¥í ë²ì : 5.87.0+
ìì :
module.exports = {
module: {
parser: {
javascript: {
dynamicImportFetchPriority: 'high',
},
},
},
};ëì import를 ìí ì ì í리ë¡ë를 ì§ì í©ëë¤.
íì
: 'eager' | 'weak' | 'lazy' | 'lazy-once'
ê°ë¥í ë²ì : 5.73.0+
ìì :
module.exports = {
module: {
parser: {
javascript: {
dynamicImportMode: 'lazy',
},
},
},
};ëì import를 ìí ì ì í리ë¡ë를 ì§ì í©ëë¤.
íì
: number | boolean
ê°ë¥í ë²ì : 5.73.0+
ìì :
module.exports = {
module: {
parser: {
javascript: {
dynamicImportPrefetch: false,
},
},
},
};ëì import를 ìí ì ì í리ë¡ë를 ì§ì í©ëë¤.
íì
: number | boolean
ê°ë¥í ë²ì : 5.73.0+
ìì :
module.exports = {
module: {
parser: {
javascript: {
dynamicImportPreload: false,
},
},
},
};\"import ... from ...\" ì \"export ... from ...\"ìì ë´ë³´ë´ê¸° ì´ë¦ì´ ì못ë ê²½ì°ì ëìì ì§ì í©ëë¤.
íì
: 'error' | 'warn' | 'auto' | false
ê°ë¥í ë²ì : 5.62.0+
ìì :
module.exports = {
module: {
parser: {
javascript: {
exportsPresence: 'error',
},
},
},
};\"import ... from ...\"ìì ë´ë³´ë´ê¸° ì´ë¦ì´ ì못ë ê²½ì°ì ëìì ì§ì í©ëë¤.
íì
: 'error' | 'warn' | 'auto' | false
ê°ë¥í ë²ì : 5.62.0+
ìì :
module.exports = {
module: {
parser: {
javascript: {
importExportsPresence: 'error',
},
},
},
};import.meta íê°ë¥¼ íì±í ëë ë¹íì±íí©ëë¤.
íì
: boolean = true
ê°ë¥í ë²ì : 5.68.0+
ìì :
module.exports = {
module: {
parser: {
javascript: {
importMeta: false,
},
},
},
};import.meta.webpackContext íê°ë¥¼ ì¬ì©íê±°ë ì¬ì©íì§ ìëë¡ ì¤ì í©ëë¤.
íì
: boolean
ê°ë¥í ë²ì : 5.70.0+
ìì :
module.exports = {
module: {
parser: {
javascript: {
importMetaContext: true,
},
},
},
};모ëì 'ì격' ëë 'ë¹ì격' 모ëë¡ ì¤ì í©ëë¤. ì격 모ëì ë¹ì격 모ë ê°ì ì¼ë¶ ëìì´ ë¤ë¥´ê¸° ë문ì ì´ë 모ëì ëìì ìí¥ì ë¯¸ì¹ ì ììµëë¤.
Type: 'strict' | 'non-strict'
Available: 5.93.0+
Example:
module.exports = {
module: {
parser: {
javascript: {
overrideStrict: 'non-strict',
},
},
},
};\"export ... from ...\"ìì ë´ë³´ë´ê¸° ì´ë¦ì´ ì못ë ê²½ì°ì ëìì ì§ì í©ëë¤. ì´ê²ì TypeScriptìì íì
ì ë¤ì ë´ë³´ë¼ë \"export ... from ...\"ìì \"export type ... from ...\"ì¼ë¡ ë§ì´ê·¸ë ì´ì
íë ëì ë¹íì±ííë ë° ì ì©í©ëë¤.
íì
: 'error' | 'warn' | 'auto' | false
ê°ë¥í ë²ì : 5.62.0+
ìì :
module.exports = {
module: {
parser: {
javascript: {
reexportExportsPresence: 'error',
},
},
},
};new URL() 구문 íì±ì íì±íí©ëë¤.
íì
: boolean = true | 'relative'
ìì :
module.exports = {
module: {
parser: {
javascript: {
url: false, // `new URL()` 구문 íì± ë¹íì±í
},
},
},
};module.parser.javascript.urlì 'relative' ê°ì webpack 5.23.0ë¶í° ì¬ì©í ì ììµëë¤. ì¬ì©íë©´ webpackì new URL() 구문ì ëí ìëê²½ë¡ URLì ìì±í©ëë¤. ì¦, ê²°ê³¼ URL ê¸°ì¤ URLì´ í¬í¨ëì§ ììµëë¤.
<!-- 'relative'ì¸ ê²½ì° -->
<img src="c43188443804f1b1f534.svg" />
<!-- 'relative'ê° ìë ê²½ì° -->
<img src="file:///path/to/project/dist/c43188443804f1b1f534.svg" />JSON íìì ëí ìµì ì ì¤ì í©ëë¤.
module.exports = {
module: {
parser: {
json: {
// options
},
},
},
};exportInfoë¡ íëê·¸ê° ì§ì ë json ì¢
ìì±ì ê¹ì´ì
ëë¤. 기본ì ì¼ë¡ íë¡ëì
모ëììë Infinityë¡ ì¤ì ëê³ ê°ë° 모ëììë 1ë¡ ì¤ì ë©ëë¤.
numbermodule.exports = {
module: {
parser: {
json: {
// ì를 ë¤ë©´, ë¤ì jsonì ê²½ì°ìë
// {
// "depth_1": {
// "depth_2": {
// "depth_3": "foo"
// }
// },
// "_depth_1": "bar"
// }
// `exportsDepth: 1`, `depth_2` ë° `depth_3`ì `exportInfo`ë¡ íëê·¸ê° ì§ì ëì§ ììµëë¤.
exportsDepth: 1,
},
},
},
};ê°ì²´ ì íì JSONì ëí´ ëª ëª ë ë´ë³´ë´ê¸°ë¥¼ íì©í©ëë¤.
booleanmodule.exports = {
module: {
parser: {
json: {
// Example:
// import { myField } from "./file.json";
//
// console.log(myField);
namedExports: true,
},
},
},
};ì½í ì¸ ë¥¼ íì±íê³ JSONì ë°ííë í¨ìì ëë¤.
((input: string) => Buffer | JsonValue)const json5 = require('json5');
module.exports = {
module: {
parser: {
json: {
parse: json5.parse,
},
},
},
};RegExp [RegExp] function(resource) string [string]
webpackì´ ì£¼ì´ì§ ì ê·ìê³¼ ì¼ì¹íë íì¼ì íì±íì§ ëª»íëë¡ í©ëë¤. ì ì¸ë íì¼ìë import, require, define ëë 기í import ë©ì»¤ëì¦ì í¸ì¶ì´ ìì´ì¼ í©ëë¤. ì´ë ê² íë©´ í° ë¼ì´ë¸ë¬ë¦¬ë¥¼ 무ìí ë ë¹ë ì±ë¥ì í¥ì ìí¬ ì ììµëë¤.
'noParse'ë 모ë 'import', 'require', 'define' ë±ì í¸ì¶ì´ ë°íììì ëë¬í ì ìë ê²½ì° íì¥ì ìëì ì¼ë¡ ë°©ì§íë ë°©ë²ì¼ë¡ë ì¬ì©í ì ììµëë¤.
ì를 ë¤ì´ 'ë¸ë¼ì°ì ' ëìì© íë¡ì í¸ë¥¼ ë¹ëíê³ ë¸ë¼ì°ì ì Node.js 모ëì ëí´ ì¬ì ë¹ëë íì¬ ë¼ì´ë¸ë¬ë¦¬ë¥¼ ì¬ì©í ë, ì를 ë¤ë©´ require('os')ì ê°ì Node.jsì ë´ì¥ 기ë¥ì´ íìí©ëë¤.
webpack.config.js
module.exports = {
//...
module: {
noParse: /jquery|lodash|src[\\/]vendor[\\/]somelib/,
},
};module.exports = {
//...
module: {
noParse: (content) =>
/jquery|lodash|src[\\/]vendor[\\/]somelib/.test(content),
},
};boolean function (module)
모ë ìì²ì ëí í´ìì ìºìí©ëë¤. module.unsafeCacheì ëí ëª ê°ì§ 기본ê°ì´ ììµëë¤.
cacheê° ë¹íì±íëì´ ìë¤ë©´ falsecacheê° íì±íëì´ ìê³ ëª¨ëì´ node 모ëìì ì¨ ê²ì¼ë¡ ë³´ì¸ë¤ë©´ true, ê·¸ë ì§ ìë¤ë©´ falsewebpack.config.js
module.exports = {
//...
module: {
unsafeCache: false,
},
};(Rule | undefined | null | false | "" | 0 | "...")[]
모ëì´ ìì± ë ë ìì²ê³¼ ì¼ì¹íë Ruleì ë°°ì´ì ëë¤. ì´ë¬í ê·ì¹ì 모ë ìì± ë°©ë²ì ìì í ì ììµëë¤. ë¡ë를 모ëì ì ì©ìí¤ê±°ë íì를 ìì í ì ììµëë¤.
Webpack 5.87.0ë¶í° false, undefined, null ë° 0ê³¼ ê°ì falsy ê°ì ì¬ì©íì¬ ì¡°ê±´ë¶ë¡ ê·ì¹ì ë¹íì±íí ì ììµëë¤.
object
Ruleì Conditions, Results ê·¸ë¦¬ê³ ì¤ì²©ë Rules ì¸ ë¶ë¶ì¼ë¡ ëë ì§ ì ììµëë¤.
conditionsì ëí ëê°ì§ ì ë ¥ ê°ì´ ììµëë¤.
resource: ìì²ë íì¼ì ì ë ê²½ë¡ì
ëë¤. resolve ê·ì¹ì ë°ë¼ ì´ë¯¸ í´ìëììµëë¤.
issuer: resource를 ìì²í 모ëì íì¼ì ëí ì ë ê²½ë¡ì ëë¤. importíë ìì¹ì ëë¤.
ì: app.js ë´ìì import './style.css'를 ìíí ë, resourceë /path/to/style.cssì´ê³ issuerë /path/to/app.jsì
ëë¤.
Ruleì test, include, exclude ê·¸ë¦¬ê³ resource íë¡í¼í°ê° resourceì ì¼ì¹íê³ issuer íë¡í¼í°ê° issuerì ì¼ì¹í©ëë¤.
ì¬ë¬ ì¡°ê±´ì ì¬ì©íë ê²½ì°, 모ë ì¡°ê±´ì´ ì¼ì¹í´ì¼ í©ëë¤.
Rule resultsë Rule conditionì´ ì¼ì¹íë ê²½ì°ìë§ ì¬ì©ë©ëë¤.
Ruleìë ë ê°ì§ ì¶ë ¥ ê°ì´ ììµëë¤.
loader, options, use íë¡í¼í°ë ë¡ëì ìí¥ì ì¤ëë¤.
query, loaders íë¡í¼í°ë í¸íì±ì ìí´ ì¡´ì¬í©ëë¤.
enforce íë¡í¼í°ë ì¼ë°, ì¬ì ëë ì¬í ë¡ëì¸ì§ì ë°ë¼ì ë¡ëì ë²ì£¼ì ìí¥ì ì¤ëë¤.
parser íë¡í¼í°ë íì ìµì
ì ìí¥ì ì¤ëë¤.
ì¤ì²©ë rulesì rules, oneOf íë¡í¼í°ìì ì§ì í ì ììµëë¤.
ì´ë¬í ruleì ìì Rule conditionì´ ì¼ì¹íë ê²½ì°ìë§ íê°ë©ëë¤. ê° ì¤ì²© ruleì ìì²´ì ì¼ë¡ ì¡°ê±´ì í¬í¨ í ì ììµëë¤.
íê°ì ììë ë¤ìê³¼ ê°ìµëë¤.
ì¢
ìì±ì ê°ì ¸ì¤ê¸° ì´ì¤ì
ì ì¼ì¹ìí¤ê³ ì´ì¤ì
ì íì ë°ë¼ í¹ì ê·ì¹ì ì ì©í ì ìë ì¡°ê±´ì
ëë¤.
webpack.config.js
module.exports = {
// ...
module: {
rules: [
{
// "assert { type: 'json' }" ì´ì¤ì
ì ì¬ì©íì¬ ê°ì ¸ì¤ê¸°ë¥¼ ì²ë¦¬í©ëë¤.
assert: { type: 'json' },
loader: require.resolve('./loader-assert.js'),
},
],
},
};index.js
import one from './pkg-1.json' assert { type: 'json' };ì´ ìììë Rule.assert를 ì¬ì©íì¬ assert { type: "json" }ì´ë¼ë ì´ì¤ì
ê³¼ í¨ê» ê°ì ¸ì¨ 모ë 모ëì loader-assert.js를 ì ì©íì¬ JSON íì¼ì´ ì¬ë°ë¥´ê² ì²ë¦¬ëëì§ íì¸í©ëë¤.
íì ì»´íì¼ë¬ ì´ë¦ì ì¼ì¹ìí¬ ì ìë ì¡°ê±´.
webpack.config.js
module.exports = {
// ...
name: 'compiler',
module: {
rules: [
{
test: /a\.js$/,
compiler: 'compiler', //"ì»´íì¼ë¬" ì´ë¦ê³¼ ì¼ì¹íë©´ ë¡ëê° ì ì©ë©ëë¤.
use: './loader',
},
{
test: /b\.js$/,
compiler: 'other-compiler', // "ì»´íì¼ë¬" ì´ë¦ê³¼ ì¼ì¹íì§ ìì¼ë¯ë¡ ë¡ëê° ì ì©ëì§ ììµëë¤.
use: './loader',
},
],
},
};string
ê°ë¥í ê°: 'pre' | 'post'
ë¡ëì ë²ì£¼ë¥¼ ì§ì í©ëë¤. ê°ì´ ìì¼ë©´ ì¼ë° ë¡ë를 ì미í©ëë¤.
ì¶ê°ì ì¼ë¡ import/requireì ì¸ë¼ì¸ì¼ë¡ ì ì©ë "ì¸ë¼ì¸ ë¡ë"ë ììµëë¤.
모ë ë¡ëê° ì°¨ë¡ë¡ íµê³¼íë ë ë¨ê³ê° ììµëë¤.
post, inline, normal, pre ììë¡ í¸ì¶ë©ëë¤. ìì¸í ë´ì©ì Pitching Loader를 ì°¸ê³ íì¸ì.pre, normal, inline, post ììë¡ í¸ì¶ë©ëë¤. 모ëì ìì¤ ì½ëìì ë³íì´ ì´ ë¨ê³ìì ë°ìí©ëë¤.모ë ì¼ë° ë¡ëë ìì²ì !를 ì ëì¬ë¡ ì¶ê°íì¬ ìëµ(ì¬ì ì) í ì ììµëë¤.
모ë ì¼ë° ë° ì¬ì ë¡ëë ìì²ì -!를 ì ëì¬ë¡ ì¶ê°íì¬ ìëµ(ì¬ì ì) í ì ììµëë¤.
모ë ì¼ë°, ì¬í ë° ì¬ì ë¡ëë ìì²ì !!를 ì ëì¬ë¡ ì¶ê°íì¬ ìëµ(ì¬ì ì) í ì ììµëë¤.
// ì¼ë° ë¡ë ë¹íì±í
import { a } from '!./file1.js';
// ì¬ì , ì¼ë° ë¡ë ë¹íì±í
import { b } from '-!./file2.js';
// 모ë ë¡ë ë¹íì±í
import { c } from '!!./file3.js';ì¸ë¼ì¸ ë¡ëì ! ì ëì¬ë ë¹íì¤ì´ë¯ë¡ ì¬ì©í´ìë ìë©ëë¤. ì´ê²ë¤ì ë¡ëê° ìì±í ì½ëìì ì¬ì©í ì ììµëë¤.
ì¡°ê±´ê³¼ ì¼ì¹íë 모ë 모ëì ì ì¸í©ëë¤. Rule.exclude ìµì
ì ì¬ì©íë©´ Rule.resource ìµì
ì ì¬ì©í ì ììµëë¤. ìì¸í ë´ì©ì Rule.resource ë° Condition.exclude를 ì°¸ê³ íì¸ì.
ì¡°ê±´ê³¼ ì¼ì¹íë 모ë 모ëì í¬í¨í©ëë¤. Rule.include ìµì
ì ì¬ì©íë©´ Rule.resource ìµì
ì ì¬ì©í ì ììµëë¤. ìì¸í ë´ì©ì Rule.resource ë° Condition.include를 ì°¸ê³ íì¸ì.
ìì²í 모ëê³¼ ë¹êµí Conditionì
ëë¤. ìëì ìì ìì, a.jsì issuerë index.js íì¼ì ê²½ë¡ì
ëë¤.
index.js
import A from './a.js';ì´ ìµì ì í¹ì 모ë ëë 모ë ì¸í¸ì ëíëìì ë¡ë를 ì ì©íë ë° ì¬ì©í ì ììµëë¤.
issuerì ê³ì¸µë³ë¡ íí°ë§íê³ ì¼ì¹ìí¬ ì ììµëë¤.
webpack.config.js
module.exports = {
// ...
module: {
rules: [
{
issuerLayer: 'other-layer',
},
],
},
};string
모ëì´ ë°°ì¹ëì´ì¼ íë ê³ì¸µì ì§ì í©ëë¤. 모ë 그룹ì ë¶í ì²í¬, íµê³ ëë ìí¸ë¦¬ ìµì ìì ì¬ì©í ì ìë íëì ë ì´ì´ë¡ íµí©ë ì ììµëë¤.
webpack.config.js
module.exports = {
// ...
module: {
rules: [
{
test: /module-layer-change/,
layer: 'layer',
},
],
},
};boolean = false
íì¼ìì 기존 ìì¤ ë§µ ë°ì´í°ë¥¼ ì¶ì¶í©ëë¤(//# sourceMappingURL 주ììì). ì´ë íì¬ ë¼ì´ë¸ë¬ë¦¬ì ìì¤ ë§µì ë³´ì¡´íë ë° ì ì©í©ëë¤.
webpack.config.js
module.exports = {
// ...
module: {
rules: [
{
test: /\.m?js$/,
extractSourceMap: true,
},
],
},
};Rule.loaderë Rule.use: [ { loader } ]ì ë¨ì¶ì´ì
ëë¤. ìì¸í ë´ì©ì Rule.useì UseEntry.loader를 ì°¸ê³ íì¸ì.
Rule.loadersë Rule.useì ë³ì¹ì
ëë¤. ìì¸í ë´ì©ì Rule.use를 ì°¸ê³ íì¸ì.
mimetypeì ì¬ì©íì¬ ì¤ì ê·ì¹ì ë°ì´í° URIì ì¼ì¹ìí¬ ì ììµëë¤.
webpack.config.js
module.exports = {
// ...
module: {
rules: [
{
mimetype: 'application/json',
type: 'json',
},
],
},
};application/json, text/javascript, application/javascript, application/node ë° application/wasmì ì´ë¯¸ 기본ì ì¸ mimetypeì¼ë¡ í¬í¨ëì´ ììµëë¤.
Ruleì´ ì¼ì¹í ë 첫 ë²ì§¸ ì¼ì¹íë Ruleë§ ì¬ì©ëë Rulesì ë°°ì´ì
ëë¤.
webpack.config.js
module.exports = {
//...
module: {
rules: [
{
test: /\.css$/,
oneOf: [
{
resourceQuery: /inline/, // foo.css?inline
type: 'asset/inline',
},
{
resourceQuery: /external/, // foo.css?external
type: 'asset/resource',
},
],
},
],
},
};Rule.optionsê³¼ Rule.queryë Rule.use: [ { options } ]ì ë¨ì¶ì´ì
ëë¤. ìì¸í ë´ì©ì Rule.useì UseEntry.optionsì ì°¸ê³ íì¸ì.
íì ìµì ì´ ìë ê°ì²´ì ëë¤. ì ì©ë 모ë íì ìµì ì´ ë³í©ë©ëë¤.
íìë ì´ë¬í ìµì ì ê²ì¬íê³ ê·¸ì ë°ë¼ ìì²´ì ì¼ë¡ ë¹íì±ííê±°ë ì¬êµ¬ì±í ì ììµëë¤. ëë¶ë¶ì 기본 íë¬ê·¸ì¸ì ê°ì ë¤ìê³¼ ê°ì´ í´ìí©ëë¤.
falseë¡ ì¤ì íë©´ íìê° ë¹íì±íë©ëë¤.trueë¡ ì¤ì íê±°ë undefinedë¡ ëë©´ íìê° íì±íë©ëë¤.ê·¸ë¬ë, íì íë¬ê·¸ì¸ì boolean ì´ìì ê°ì ë°ìë¤ì¼ ì ììµëë¤. ì를 ë¤ë©´, ë´ë¶ì NodeStuffPluginì true ëì ì ê°ì²´ë¥¼ ë°ì í¹ì Ruleì ëí ìµì
ì ì¶ê°í ì ììµëë¤.
ìì (기본 íë¬ê·¸ì¸ì íì ìµì ):
module.exports = {
//...
module: {
rules: [
{
//...
parser: {
amd: false, // AMD ë¹íì±í
commonjs: false, // CommonJS ë¹íì±í
system: false, // SystemJS ë¹íì±í
harmony: false, // ES2015 Harmony import/export ë¹íì±í
requireInclude: false, // require.include ë¹íì±í
requireEnsure: false, // require.ensure ë¹íì±í
requireContext: false, // require.context ë¹íì±í
browserify: false, // Browserify ë²ë¤ì í¹ì ì²ë¦¬ ë¹íì±í
requireJs: false, // requirejs.* ë¹íì±í
node: false, // __dirname, __filename, module, require.extensions, require.main, ë± ë¹íì±í
commonjsMagicComments: false, // CommonJS를 ìí magic comments ì§ì ë¹íì±í
node: {}, // 모ë ìì¤ìì [node](/configuration/node) ê³ì¸µ ì¬êµ¬ì±
worker: ['default from web-worker', '...'], // javascript íì¼ì ëí WebWorker ì²ë¦¬ë¥¼ 커ì¤í°ë§ì´ì¦í©ëë¤. "..."ë 기본ê°ì ëíë
ëë¤.
},
},
],
},
};Rule.typeì´ assetì´ë©´ Rules.parser ìµì
ì íì¼ ë´ì©ì Base64ë¡ ì¸ì½ë©í ì§ ëë ë³ëì íì¼ë¡ ì¶ë ¥ ëë í°ë¦¬ì ë´ë³´ë¼ ì§ ì¬ë¶ë¥¼ ëíë´ë ì¡°ê±´ì ì¤ëª
íë ê°ì²´ ëë í¨ìì¼ ì ììµëë¤.
Rule.typeì´ asset ëë asset/inlineì¸ ê²½ì° Rule.generatorìµì
ì 모ë ìì¤ì ì¸ì½ë©ì ì¤ëª
íë ê°ì²´ì´ê±°ë ì¬ì©ì ì§ì ìê³ ë¦¬ì¦ì¼ë¡ 모ëì ìì¤ë¥¼ ì¸ì½ë©íë í¨ìì¼ ì ììµëë¤.
ì¶ê°ì ì¸ ì ë³´ë ì¬ì© ì¬ë¡ë¥¼ ìí´ ì ì 모ë ê°ì´ë를 ì°¸ê³ íì¸ì.
object = { maxSize number = 8096 } function (source, { filename, module }) => boolean
모ë ìì¤ í¬ê¸°ê° maxSizeë³´ë¤ ìì¼ë©´ 모ëì´ Base64 ì¸ì½ë© 문ìì´ë¡ ë²ë¤ì ì½ì
ëê³ , ê·¸ë ì§ ìì¼ë©´ 모ë íì¼ì´ ì¶ë ¥ ëë í°ë¦¬ë¡ ë´ë³´ë´ì§ëë¤.
webpack.config.js
module.exports = {
//...
module: {
rules: [
{
//...
parser: {
dataUrlCondition: {
maxSize: 4 * 1024,
},
},
},
],
},
};í¨ì를 dataUrlConditionì ê°ì¼ë¡ ì¤ì í ê²½ì°ìë true를 ë°ííë©´ webpackì´ ëª¨ëì Base64 ì¸ì½ë© 문ìì´ë¡ ë²ë¤ì ì½ì
íëë¡ ì§ìí©ëë¤. ê·¸ë ì§ ìì¼ë©´ 모ë íì¼ì´ ì¶ë ¥ ëë í°ë¦¬ë¡ ë´ë³´ë´ì§ëë¤.
webpack.config.js
module.exports = {
//...
module: {
rules: [
{
//...
parser: {
dataUrlCondition: (source, { filename, module }) => {
const content = source.toString();
return content.includes('some marker');
},
},
},
],
},
};object = { encoding string = 'base64' | false, mimetype string = undefined | false } function (content, { filename, module }) => string
Rule.generator.dataUrlì´ ê°ì²´ë¡ ì¬ì©ëë©´ ëê°ì íë¡í¼í°ë¥¼ ì¤ì í ì ììµëë¤.
'base64'ë¡ ì¤ì íë©´ 모ë ìì¤ë Base64 ìê³ ë¦¬ì¦ì ì¬ì©íì¬ ì¸ì½ë©ë©ëë¤. encodingì falseë¡ ì¤ì íë©´ ì¸ì½ë©ì´ ë¹íì±íë©ëë¤.webpack.config.js
module.exports = {
//...
module: {
rules: [
{
//...
generator: {
dataUrl: {
encoding: 'base64',
mimetype: 'mimetype/png',
},
},
},
],
},
};í¨ìë¡ ì¬ì©íë©´ 모ë 모ëì ëí´ ì¤íëë©° ë°ì´í° URI 문ìì´ì ë°íí´ì¼ í©ëë¤.
module.exports = {
//...
module: {
rules: [
{
//...
generator: {
dataUrl: (content) => {
const svgToMiniDataURI = require('mini-svg-data-uri');
if (typeof content !== 'string') {
content = content.toString();
}
return svgToMiniDataURI(content);
},
},
},
],
},
};ì ì 모ëìì ì ì ì°ê¸°ë¥¼ íì§ ìë ê²½ì°, ìë² ì¬ì´ë ëëë§ìì ì¬ì©í ì ììµëë¤.
íì
: boolean = true
ê°ë¥í ë²ì : 5.25.0+
ìì :
module.exports = {
// â¦
module: {
rules: [
{
test: /\.png$/i,
type: 'asset/resource',
generator: {
emit: false,
},
},
],
},
};output.assetModuleFilenameê³¼ ëì¼íì§ë§ í¹ì ê·ì¹ì ì¬ì©ë©ëë¤. output.assetModuleFilenameì ì¬ì ìíê³ asset ë° asset/resource 모ë ì íììë§ ìëí©ëë¤.
webpack.config.js
module.exports = {
//...
output: {
assetModuleFilename: 'images/[hash][ext][query]',
},
module: {
rules: [
{
test: /\.png$/,
type: 'asset/resource',
},
{
test: /\.html$/,
type: 'asset/resource',
generator: {
filename: 'static/[hash][ext]',
},
},
],
},
};í¹ì ì ì
모ëì ëí´ publicPath를 ì¬ì©ì ì§ì í©ëë¤.
string | ((pathData: PathData, assetInfo?: AssetInfo) => string)module.exports = {
//...
output: {
publicPath: 'static/',
},
module: {
rules: [
{
test: /\.png$/i,
type: 'asset/resource',
generator: {
publicPath: 'assets/',
},
},
],
},
};'output.path'를 기ì¤ì¼ë¡ ì§ì ë í´ëì ì ì ì ë´ë³´ë ëë¤. ì¬ì©ì ì§ì 'publicPath'ê° í´ë 구조ì ì¼ì¹íëë¡ ì§ì ë ê²½ì°ìë§ íìí©ëë¤.
string | ((pathData: PathData, assetInfo?: AssetInfo) => string)module.exports = {
//...
output: {
publicPath: 'static/',
},
module: {
rules: [
{
test: /\.png$/i,
type: 'asset/resource',
generator: {
publicPath: 'https://cdn/assets/',
outputPath: 'cdn-assets/',
},
},
],
},
};리ìì¤ì ì¼ì¹íë Conditionì
ëë¤. ìì¸í ë´ì©ì ê·ì¹ ì¡°ê±´ì ì°¸ê³ íì¸ì.
리ìì¤ ì¿¼ë¦¬ì ì¼ì¹íë Conditionì
ëë¤. ì´ ìµì
ì ìì² ë¬¸ìì´ì 쿼리 ì¹ì
ì ëí´ í
ì¤í¸íë ê²½ì° ì¬ì©ë©ëë¤(ì¦, 물ìíë¶í°). import Foo from './foo.css?inline'ì ì¬ì©íë ê²½ì° ë¤ì ì¡°ê±´ì´ ì¼ì¹í©ëë¤.
webpack.config.js
module.exports = {
//...
module: {
rules: [
{
test: /\.css$/,
resourceQuery: /inline/,
type: 'asset/inline',
},
],
},
};function(input) => string | object
Rule.typeì´ 'json'ì¼ë¡ ì¤ì ë ê²½ì° Rules.parser.parseìµì
ì 모ëì ìì¤ë¥¼ 구문 ë¶ìíê³ ì´ë¥¼ JavaScript ê°ì²´ë¡ ë³ííë 커ì¤í
ë¡ì§ì 구ííë í¨ìì¼ ì ììµëë¤. í¹ì ë¡ëìì´ toml, yaml ë° ê¸°í JSONì´ ìë íì¼ì JSONì¼ë¡ ê°ì ¸ ì¤ë ê²ì´ ì ì©í ì ììµëë¤.
webpack.config.js
const toml = require('toml');
module.exports = {
//...
module: {
rules: [
{
test: /\.toml/,
type: 'json',
parser: {
parse: toml.parse,
},
},
],
},
};Ruleì´ ì¼ì¹ í ëë ì¬ì©ëë Rulesì ë°°ì´ì
ëë¤.
bool
모ëì ì´ë¤ ë¶ë¶ì ë¶ìì©ì´ ìëì§ íìíì¸ì. ìì¸í ë´ì©ì Tree Shakingì ì°¸ê³ íì¸ì.
í
ì¤í¸ë¥¼ íµê³¼íë 모ë 모ëì í¬í¨í©ëë¤. Rule.test ìµì
ì ì ê³µíë©´ Rule.resourceë ì ê³µ í ì ììµëë¤. ìì¸í ë´ì©ì Rule.resource ë° Condition를 ì°¸ê³ íì¸ì.
string
ê°ë¥í ë³ì: 'javascript/auto' | 'javascript/dynamic' | 'javascript/esm' | 'json' | 'webassembly/sync' | 'webassembly/async' | 'asset' | 'asset/source' | 'asset/resource' | 'asset/inline' | 'asset/bytes' | 'css' | 'css/auto' | 'css/module' | 'css/global'
Rule.typeì ì¼ì¹íë 모ëì ì íì ì¤ì í©ëë¤. ì´ë defaultRules ë° ê¸°ë³¸ê° import ëìì´ ë°ìíì§ ììµëë¤. ì를 ë¤ì´ 커ì¤í
ë¡ë를 íµí´ .jsoníì¼ì ë¡ëíë ¤ë©´ typeì javascript/autoë¡ ì¤ì íì¬ webpackì ë´ì¥ë json import를 ì°íí´ì¼í©ëë¤.
webpack.config.js
module.exports = {
//...
module: {
rules: [
//...
{
test: /\.json$/,
type: 'javascript/auto',
loader: 'custom-json-loader',
},
],
},
};
asset*ì íì ëí ìì¸í ë´ì©ì ì ì 모ë ê°ì´ë를 ì°¸ê³ íì¸ì.
css/auto 모ë ì íì ì¬ì© ì¬ë¡ë ì¬ê¸°ë¥¼ ì°¸ê³ íì¸ì. css/auto를 ì¬ì©íë ¤ë©´ experiments.css를 íì±íí´ì¼ í©ëë¤.
module.exports = {
target: 'web',
mode: 'development',
experiments: {
css: true,
},
module: {
rules: [
{
test: /\.less$/,
use: 'less-loader',
type: 'css/auto',
},
],
},
};[UseEntry] function(info)
Webpack 5.87.0ë¶í° undefined nullê³¼ ê°ì falsy ê°ì ì¬ì©íì¬ ì¡°ê±´ë¶ë¡ í¹ì ì¬ì© í목ì ë¹íì±íí ì ììµëë¤.
[UseEntry]
Rule.useë 모ëì ì ì©ëë UseEntryì ë°°ì´ì¼ ì ììµëë¤.
use: [ 'style-loader' ] ê°ì´ stringì ì ë¬íë ê²ì use: [ { loader: 'style-loader '} ] ê°ì´ loader íë¡í¼í°ì ëí ë¨ì¶ì´ ì
ëë¤.
ë¡ëë ì¬ë¬ ë¡ë를 ì ë¬íì¬ ì°ê²°ë ì ìì¼ë©°, ì´ë ì¤ë¥¸ìª½ìì ì¼ìª½ì¼ë¡, ë§ì§ë§ ì¤ì ìì 첫 ë²ì§¸ ì¤ì ììë¡ ì ì©ë©ëë¤.
webpack.config.js
module.exports = {
//...
module: {
rules: [
{
//...
use: [
'style-loader',
{
loader: 'css-loader',
options: {
importLoaders: 1,
},
},
{
loader: 'less-loader',
options: {
noIeCompat: true,
},
},
],
},
],
},
};function(info)
Rule.useë ë¡ë ì¤ì¸ 모ëì ì¤ëª
íë ê°ì²´ë¥¼ ì¸ìë¡ ë°ë í¨ìì¼ ìë ìì¼ë©° UseEntry를 ììë¡ ê°ì§ë ë°°ì´ì ë°íí´ì¼ í©ëë¤.
info ê°ì²´ íë¼ë¯¸í°ë ë¤ìê³¼ ê°ì íë를 ê°ì§ëë¤.
compiler: íì¬ webpack ì»´íì¼ë¬ (ì ìëì§ ìì ì ìì)issuer: ë¡ë ì¤ì¸ 모ëì ê°ì ¸ì¤ë 모ëì ê²½ë¡realResource: íì ë¡ëëë 모ëì ê²½ë¡resource: ë¡ëëë 모ëì ê²½ë¡. ìì² ë¬¸ìì´ì !=!를 íµí´ 리ìì¤ ì´ë¦ì ë®ì´ ì°ë ê²½ì°ë¥¼ ì ì¸íê³ ë ì¼ë°ì ì¼ë¡ realResourceì ê°ìµëë¤.ë°íê°ì use: [ 'style-loader' ]ê°ì´ ë°°ì´ê³¼ ëì¼í ë¨ì¶ì´ë¥¼ ì¬ì©í ì ììµëë¤.
webpack.config.js
module.exports = {
//...
module: {
rules: [
{
use: (info) => [
{
loader: 'custom-svg-loader',
},
{
loader: 'svgo-loader',
options: {
plugins: [
{
cleanupIDs: {
prefix: basename(info.resource),
},
},
],
},
},
],
},
],
},
};ìì¸í ì ë³´ë UseEntry를 ì°¸ê³ íì¸ì.
모ë ê³ì¸µìì í´ìì ëí ì¤ì ì í ì ììµëë¤. í´ì¤ ì¤ì íì´ì§ìì ê°ë¥í 모ë ìµì ì ì°¸ê³ íì¸ì. ì ì©ë 모ë í´ì ìµì ì ìì ê³ì¸µì í´ì ìµì ê³¼ ë³í©ë©ëë¤.
ì를 ë¤ë©´, 모ë ê³ì¸µ í´ìì ë³´ì¬ì£¼ê¸° ìí´ ./src/index.js, ./src/footer/default.js ë° ./src/footer/overridden.js ìí¸ë¦¬ê° ìë¤ê³ ê°ì íê² ìµëë¤.
./src/index.js
import footer from 'footer';
console.log(footer);./src/footer/default.js
export default 'default footer';./src/footer/overridden.js
export default 'overridden footer';webpack.js.org
module.exports = {
resolve: {
alias: {
footer: './footer/default.js',
},
},
};ì´ ì¤ì ì¼ë¡ ë²ë¤ì ìì±íë©´ console.log(footer)ë 'default footer'를 ì¶ë ¥í©ëë¤. .jsíì¼ì ëí Rule.resolve를 ì¤ì íê³ footer ë³ì¹ì overridden.jsë¡ ì¤ì í´ë³´ê² ìµëë¤.
webpack.js.org
module.exports = {
resolve: {
alias: {
footer: './footer/default.js',
},
},
module: {
rules: [
{
resolve: {
alias: {
footer: './footer/overridden.js',
},
},
},
],
},
};ë³ê²½ë ì¤ì ì¼ë¡ ë²ë¤ì ìì±íë©´ console.log(footer)ë 'overridden footer'를 ì¶ë ¥í©ëë¤.
boolean = true
íì±íëë©´ .mjs íì¼ ëë ë¤ë¥¸ .js íì¼ìì 모ëì importí ë ê°ì¥ ê°ê¹ì´ ìì package.jsoníì¼ì "type"íëê° "module"ì ê°ì¼ë¡ ê°ì§ê³ ìë ê²½ì° íì¼ íì¥ì를 ì ê³µí´ì¼í©ëë¤. ê·¸ë ì§ ìì¼ë©´ webpackì´ Module not found ì¤ë¥ì í¨ê» ì»´íì¼ì ì¤í¨í©ëë¤. ê·¸ë¦¬ê³ webpackì resolve.mainFilesì ì ìë íì¼ ì´ë¦ì¼ë¡ ëë í°ë¦¬ë¥¼ íì¸íì§ ìì¼ë¯ë¡ íì¼ ì´ë¦ì ì§ì ì§ì í´ì¼í©ëë¤.
webpack.config.js
module.exports = {
// ...
module: {
rules: [
{
test: /\.m?js$/,
resolve: {
fullySpecified: false, // ë¹íì±í
},
},
],
},
};with í¤ìëë¡ ì ê³µë í¹ì ì¡°ê±´ì ë°ë¼ ê°ì ¸ì¤ê¸°ë¥¼ ì¼ì¹ìí¬ ì ìë ì¡°ê±´ì íµí´ ì½í
ì¸ ì íì ë°ë¼ ë¤ë¥¸ ê·ì¹ì ì ì©í ì ììµëë¤.
webpack.config.js
module.exports = {
// ...
module: {
rules: [
{
// "with { type: 'json' }" ì¡°ê±´ì¼ë¡ ê°ì ¸ì¤ê¸°ë¥¼ ì²ë¦¬í©ëë¤.
with: { type: 'json' },
loader: require.resolve('./loader-assert.js'),
},
],
},
};index.js
import one from './pkg-1.json' with { type: 'json' };ì´ ììì Rule.withë with { type: "json" } ì¡°ê±´ì¼ë¡ ê°ì ¸ì¨ 모ë 모ëì loader-assert.js를 ì ì©íë ë° ì¬ì©ë©ëë¤.
Conditionì ìë í목ì¤ì íëê° ë©ëë¤.
{ and: [Condition] }: 모ë Conditionì´ ì¼ì¹í´ì¼ í©ëë¤.
{ or: [Condition] }: ì´ë¤ Conditionì´ë ì¼ì¹íë©´ ë©ëë¤.
{ not: [Condition] }: 모ë Conditionì´ ì¼ì¹íë©´ ì ë©ëë¤.
Example:
const path = require('path');
module.exports = {
//...
module: {
rules: [
{
test: /\.css$/,
include: [
// `app/styles`ë¡ ììíë íì¬ ëë í°ë¦¬ì ê´ë ¨ë 모ë ê²½ë¡ë¥¼ í¬í¨í©ëë¤.
// ì. `app/styles.css`, `app/styles/styles.css`, `app/stylesheet.css`
path.resolve(__dirname, 'app/styles'),
// `vendor/styles/` ëë í°ë¦¬ì ë´ì©ë§ í¬í¨íëë¡ ì¬ëì를 ì¶ê°í©ëë¤.
path.join(__dirname, 'vendor/styles/'),
],
},
],
},
};object function(info)
object
문ìì´ì¸ loader íë¡í¼í°ê° ìì´ì¼ í©ëë¤. ë¡ë í´ì ìµì
(resolveLoader)ì ì¬ì©íì¬ ì¤ì contextì ìëì ì¼ë¡ í´ìë©ëë¤.
options íë¡í¼í°ë 문ìì´ì´ë ê°ì²´ê° ë ì ììµëë¤. ì´ ê°ì ë¡ëì ì ë¬ëë©° ë¡ë ìµì
ì¼ë¡ í´ìëì´ì¼ í©ëë¤.
í¸íì±ì ìí´ options íë¡í¼í°ì ë³ì¹ì¸ query ìì±ë ê°ë¥í©ëë¤. options íë¡í¼í°ë¥¼ ì¬ì©íë ê²ì ê¶ì¥í©ëë¤.
webpackì ìµì
ì í¬í¨í 모ë ë¡ëì 리ìì¤ìì ê³ ì í 모ë ìë³ì를 ìì±í´ì¼í©ëë¤. ìµì
ê°ì²´ì JSON.stringifyë¡ ì´ë¥¼ ìëí©ëë¤. 99.9%ì ê²½ì°ì 문ì ê° ìì§ë§ 리ìì¤ì ë¤ë¥¸ ìµì
ì´ ìë ëì¼í ë¡ë를 ì ì©íê³ ìµì
ì ëì¼í 문ìì´ ê°ì´ ìë ê²½ì° ê³ ì íì§ ìì ì ììµëë¤.
ìí JSON ê°ì ìµì
ê°ì²´ë¥¼ 문ìì´í í ì ìë ê²½ì°ìë ì¤ë¨ë©ëë¤. ì´ë¥¼ í´ê²°í기 ìí´ ê³ ì ìë³ìë¡ ì¬ì©ëë ìµì
ê°ì²´ìì ident ìì±ì ê°ì§ ì ììµëë¤.
webpack.config.js
module.exports = {
//...
module: {
rules: [
{
loader: 'css-loader',
options: {
modules: true,
},
},
],
},
};function(info)
UseEntryë ë¡ëëë 모ëì ëíë´ë ê°ì²´ë¥¼ ì¸ìë¡ ë°ë í¨ìì¼ ìë ìì¼ë©° í¨ìê° ìë UseEntry ê°ì²´ë¥¼ ë°íí´ì¼ í©ëë¤.
info ê°ì²´ íë¼ë¯¸í°ìë ë¤ìê³¼ ê°ì íëê° ììµëë¤.
compiler: íì¬ webpack ì»´íì¼ë¬ (ì ìëì§ ìì ì ìì)issuer: ë¡ë ì¤ì¸ 모ëì ê°ì ¸ì¤ë 모ëì ê²½ë¡realResource: íì ë¡ëëë 모ëì ê²½ë¡resource: ë¡ëëë 모ëì ê²½ë¡. ìì² ë¬¸ìì´ì !=!를 íµí´ 리ìì¤ ì´ë¦ì ë®ì´ ì°ë ê²½ì°ë¥¼ ì ì¸íê³ ë ì¼ë°ì ì¼ë¡ realResourceì ê°ìµëë¤.webpack.config.js
module.exports = {
//...
module: {
rules: [
{
test: /\.svg$/,
type: 'asset',
use: (info) => ({
loader: 'svgo-loader',
options: {
plugins: [
{
cleanupIDs: { prefix: basename(info.resource) },
},
],
},
}),
},
],
},
};ì´ ìµì ì ëì ì¢ ìì±ì´ ë°ìí ë ìì±ëë 컨í ì¤í¸ì 기본 ì¤ì ì ì¤ëª í©ëë¤.
unknown ëì ì¢
ìì± ì ìì: require.
expr ëì ì¢
ìì± ì ìì: require(expr).
wrapped ëì ì¢
ìì± ì ìì: require('./templates/' + expr).
ë¤ìì 기본ê°ì¼ë¡ ì¬ì© ê°ë¥í ìµì ì ëë¤.
webpack.config.js
module.exports = {
//...
module: {
exprContextCritical: true,
exprContextRecursive: true,
exprContextRegExp: false,
exprContextRequest: '.',
unknownContextCritical: true,
unknownContextRecursive: true,
unknownContextRegExp: false,
unknownContextRequest: '.',
wrappedContextCritical: false,
wrappedContextRecursive: true,
wrappedContextRegExp: /.*/,
strictExportPresence: false,
},
};ë¤ìì ëª ê°ì§ ì¬ì© ì¬ë¡ì ëë¤.
wrappedContextCritical: true)require(expr)ë ì ì²´ ëë í°ë¦¬ë¥¼ í¬í¨í´ì¼í©ëë¤(exprContextRegExp: /^\.\//).require('./templates/' + expr)ì 기본ì ì¼ë¡ íì ëë í°ë¦¬ë¥¼ í¬í¨íì§ ììì¼ í©ëë¤(wrappedContextRecursive: false).strictExportPresenceë exportê° ëë½ëë©´ ê²½ê³ ëì ì¤ë¥ë¥¼ ë°ììíµëë¤.wrappedContextRegExp: /\\.\\*/)