Module
ì´ ìµì ì íë¡ì í¸ ë´ìì ë¤ë¥¸ ì íì 모ëì ì²ë¦¬íë ë°©ë²ì ê²°ì í©ëë¤.
module.defaultRules
모ëì 기본ì ì¼ë¡ ì ì©ëë ê·ì¹ì ë°°ì´ì ëë¤.
ìì¸í ë´ì©ì ìì¤ ì½ë를 ì°¸ê³ íì¸ì.
export default {
module: {
defaultRules: [
"...", // "..."를 ì¬ì©íì¬ ê¸°ë³¸ì ì¼ë¡ webpackì ìí´ ì ì©ëë ê·ì¹ì 참조í ì ììµëë¤.
],
},
};Webpack 5.87.0ë¶í° 0, "", false, null ë° undefined를 í¬í¨í falsy ê°ì module.defaultRulesë¡ ì ë¬íì¬ í¹ì ê·ì¹ì ì¡°ê±´ë¶ë¡ ë¹íì±íí ì ììµëë¤.
export default {
module: {
defaultRules: [
false &&
{
// ì´ ê·ì¹ì ë¹íì±íë©ëë¤.
},
],
},
};module.generator
5.12.0+module.generator를 ì¬ì©íì¬ í ê³³ìì 모ë ì ëë ì´í°ì ìµì
ì ì¤ì í ì ììµëë¤.
webpack.config.js
export default {
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 export ì´ë¦ì javascript moduleë¡ ë´ë³´ë´ë ë°©ìì ì¬ì©ì ì ìí©ëë¤. ì를 ë¤ì´ íì¬ íí를 ì ì§íê±°ë camel caseë¡ ë³íí ì ììµëë¤.
// type: 'as-is' | 'camel-case' | 'camel-case-only' | 'dashes' | 'dashes-only' | ((name: string) => string | string[])
// webpack 5.90.4ë¶í° ì¬ì© ê°ë¥íë©°, í¨ì íìì webpack 5.107.0ë¶í° string[]를 ë°íí ì ììµëë¤.
exportsConvention: "camel-case-only",
},
"css/auto": {
// CSS/ìë 모ë ìì±ì© ìµì
// ì¤íì¼ìí¸ë¥¼ ìì±íê³ ë¡ëíë ê²ì í¼íê³ ì¶ë ¥ ìë°ì¤í¬ë¦½í¸ íì¼ì cssì ë´ë³´ë´ê¸°ë§ í¬í¨í©ëë¤.
// type: boolean, webpack 5.90.0ë¶í° ì¬ì© ê°ë¥í©ëë¤.
exportsOnly: true,
// css export ì´ë¦ì javascript moduleë¡ ë´ë³´ë´ë ë°©ìì ì¬ì©ì ì ìí©ëë¤. ì를 ë¤ì´ íì¬ íí를 ì ì§íê±°ë camel caseë¡ ë³íí ì ììµëë¤.
// type: 'as-is' | 'camel-case' | 'camel-case-only' | 'dashes' | 'dashes-only' | ((name: string) => string | string[])
// webpack 5.90.4ë¶í° ì¬ì© ê°ë¥íë©°, í¨ì íìì webpack 5.107.0ë¶í° string[]를 ë°íí ì ììµëë¤.
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`를 ì¬ì©í©ëë¤.
parse: JSONParse,
},
// ê·¸ì¸ ë¤ë¥¸ ìµì
ë¤â¦
},
},
};Multiple aliases via exportsConvention
5.107.0+
exportsConventionì´ í¨ìì¸ ê²½ì° string ëë string[]를 ë°íí ì ììµëë¤. ë°°ì´ì ë°ííë©´ ë°°ì´ì í¬í¨ë 모ë ì´ë¦ì¼ë¡ local class를 exportíë©°, ì´ë css-loaderì ëìê³¼ ì¼ì¹í©ëë¤. ê°ì class를 ì¬ë¬ aliasë¡ ë
¸ì¶íê³ ì¶ì§ë§ ë ê°ì ruleì ìì±íê³ ì¶ì§ ìì ë ì ì©í©ëë¤.
webpack.config.js
export default {
experiments: { css: true },
module: {
generator: {
"css/module": {
// ê° class를 ìë ì´ë¦ê³¼ ë문ì alias ë ê°ì§ë¡ 모ë ë
¸ì¶í©ëë¤.
exportsConvention: (name) => [name, name.toUpperCase()],
},
},
},
};import styles from "./button.module.css";
console.log(styles.btn); // í´ìë class
console.log(styles.BTN); // ê°ì í´ìë classì ë문ì aliasmodule.parser
5.12.0+module.generatorì²ë¼ module.parser를 ì¬ì©íì¬ í ê³³ìì 모ë íìì ìµì
ì ì¤ì í ì ììµëë¤.
webpack.config.js
export default {
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": {
// ìì ëì¼
},
// ê·¸ì¸ ë¤ë¥¸ ìµì
ë¤â¦
},
},
};module.parser.css
CSS íìì ëí ìµì ì ì¤ì í©ëë¤.
export default {
module: {
parser: {
css: {
// ...
namedExports: true,
},
},
},
};module.parser.css.import
ì´ ìµì
ì CSS íì¼ìì @import at-rules를 ì²ë¦¬í ì ìëë¡ í©ëë¤. trueë¡ ì¤ì íë©´ @import ë¬¸ì´ ì²ë¦¬ëì´ ë¤ë¥¸ CSS íì¼ìì ì¤íì¼ì 모ëìì¼ë¡ í¬í¨í ì ììµëë¤.
-
Type:
boolean -
Available: 5.97.0+
-
Example:
export default { module: { parser: { css: { import: true, }, }, }, };/* reset-styles.css */ body { margin: 0; padding: 0; }/* styles.css */ @import "./reset-styles.css"; body { background-color: red; }
module.parser.css.url
ì´ ìµì
ì CSS íì¼ ë´ url(), image-set(), src(), image()ì ê°ì í¨ììì URL ì²ë¦¬ë¥¼ íì±í ëë ë¹íì±íí©ëë¤. íì±ííë©´ ì´ë¬í URLì WebPackìì íì¸ ë° ì²ë¦¬ë©ëë¤.
-
Type:
boolean -
Available: 5.97.0+
-
Example:
export default { module: { parser: { css: { url: true, }, }, }, };/* styles.css */ .background { background-image: url("./images/bg.jpg"); } .icon { content: image("./icons/star.svg"); }
module.parser.css.namedExports
ì´ ìµì
ì ì¬ì©íë©´ CSS ë´ë³´ë´ê¸°ì exportë¼ë ì´ë¦ì ES 모ëì ì¬ì©í ì ììµëë¤. trueë¡ ì¤ì íë©´ CSS 모ëì ì´ë¦ì´ ì§ì ë ë´ë³´ë´ê¸°ë¥¼ ì¬ì©íì¬ í´ëì¤ì ì¤íì¼ì ë´ë³´ë
ëë¤.
-
Type:
boolean -
Available: 5.90.0+
-
Example:
export default { 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 { footer, header } from "./styles.module.css";namedExports를 íì±ííë©´ JavaScript íë¡ì í¸ìì CSS를 ê´ë¦¬íë ë° ë 모ëíëê³ ì ì§ ê´ë¦¬ ê°ë¥í ì ê·¼ ë°©ìì ì±ííê³ ES 모ë 구문ì íì©íì¬ ë ëª
ííê³ ëª
ìì ì¸ ê°ì ¸ì¤ê¸°ë¥¼ ìíí ì ììµëë¤.
module.parser.css.pure
5.107.0+CSS Modulesì ëí´ ì격í pure mode를 íì±íí©ëë¤. 모ë selectorë ìµì íëì local class ëë id selector를 í¬í¨í´ì¼ íë©°, ê·¸ë ì§ ìì¼ë©´ webpackì´ build error를 ë°ììíµëë¤. ì´ë postcss-modules-local-by-defaultì pure modeì ëì¼í ëìì´ë©°, ì¤ìë¡ ìì±í global selector를 ì´ê¸°ì ë°ê²¬íë ë° ëìì´ ë©ëë¤.
- Type:
boolean - Default:
false - Available for:
css/moduleë°css/auto(css/globalìë ë ¸ì¶ëì§ ìì¼ë©°, ì¬ê¸°ìë global-by-defaultê° ìëë semanticì ëë¤.)
webpack.config.js
export default {
experiments: { css: true },
module: {
parser: {
"css/module": {
pure: true,
},
},
},
};íìí ëë ë ê°ì§ 주ìì¼ë¡ ì´ ê²ì¬ë¥¼ ë¹íì±íí ì ììµëë¤.
/* cssmodules-pure-ignore */를 rule ë°ë¡ ìì ëë©´ í´ë¹ rule íëì ëí´ìë§ ê²ì¬ê° ë¹íì±íë©ëë¤. ì´ ë¹íì±íë rule ë¨ìë¡ë§ ì ì©ëë©° íì í목ì¼ë¡ ì íëì§ ììµëë¤.
/* cssmodules-pure-ignore */
a {
/* ì´ ruleì ëí´ìë§ ê²ì¬ ë¹íì±í */
color: blue;
}/* cssmodules-pure-no-check */를 íì¼ ì ëì 주ì ìì(ì´ë¤ ruleë³´ë¤ë ì)ì ëë©´ íì¼ ì ì²´ì ëí ê²ì¬ê° ë¹íì±íë©ëë¤.
/* cssmodules-pure-no-check */
a {
/* ì¼ë°ì ì¼ë¡ pure modeììë ì¤í¨í©ëë¤ */
color: red;
}ì¼ë¶ 구문ì ì¤ê³ì ê²ì¬ ìì¸ì
ëë¤. local selector를 í¬í¨í ìì selector ë´ë¶ì nested rulesë pure-compliantë¡ ê°ì£¼ëê³ , &ë ë¶ëª¨ ruleì purity를 ë°ë¥´ë©°, @keyframesì @counter-styleì 본문ì ê²ì¬íì§ ììµëë¤.
module.parser.css.animation
5.104.0+CSS 모ëìì @keyframes ì ëë©ì´ì
ì´ë¦ ë³ê²½ 기ë¥ì íì±í ëë ë¹íì±íí©ëë¤.
- Type:
boolean - Default:
true
webpack.config.js
export default {
module: {
parser: {
css: {
animation: true, // @keyframes ì´ë¦ ë³ê²½ì íì±íí©ëë¤.
},
},
},
};module.parser.css.container
5.104.0+CSS 모ëìì @container ì´ë¦ ë³ê²½ì íì±í ëë ë¹íì±íí©ëë¤.
- Type:
boolean - Default:
true
webpack.config.js
export default {
module: {
parser: {
css: {
container: true, // @container ì´ë¦ ë³ê²½ì íì±íí©ëë¤.
},
},
},
};module.parser.css.customIdents
5.104.0+CSS 모ëìì ì¬ì©ì ì§ì ìë³ìì ì´ë¦ ë³ê²½ì íì±í ëë ë¹íì±íí©ëë¤.
- Type:
boolean - Default:
true
webpack.config.js
export default {
module: {
parser: {
css: {
customIdents: true, // ì¬ì©ì ì§ì ìë³ì ì´ë¦ ë³ê²½ íì±í
},
},
},
};module.parser.css.dashedIdents
5.104.0+CSS ì¬ì©ì ì§ì ìì±(ì: --my-variable)ê³¼ ê°ì íì´íì¼ë¡ 구ë¶ë ìë³ìì ì´ë¦ ë³ê²½ì íì±í ëë ë¹íì±íí©ëë¤.
- Type:
boolean - Default:
true
webpack.config.js
export default {
module: {
parser: {
css: {
dashedIdents: true, // ëìë¡ êµ¬ë¶ë ìë³ì ì´ë¦ ë³ê²½ì íì±íí©ëë¤.
},
},
},
};module.parser.css.function
5.104.0+CSS 모ëìì @function ì´ë¦ ë³ê²½ì íì±í ëë ë¹íì±íí©ëë¤.
- Type:
boolean - Default:
true
webpack.config.js
export default {
module: {
parser: {
css: {
function: true, // @function ì´ë¦ ë³ê²½ì íì±íí©ëë¤
},
},
},
};module.parser.css.grid
5.104.0+CSS 모ëìì 그리ë ìë³ì ì´ë¦ ë³ê²½ 기ë¥ì íì±í ëë ë¹íì±íí©ëë¤.
- Type:
boolean - Default:
true
webpack.config.js
export default {
module: {
parser: {
css: {
grid: true, // 그리ë ìë³ì ì´ë¦ ë³ê²½ íì±í
},
},
},
};module.parser.css.exportType
CSS ì½í ì¸ ë¥¼ ë´ë³´ë´ë ë°©ë²ì ì¤ì í©ëë¤.
-
Type:
boolean -
Available: 5.102.0+
-
Example:
export default { module: { parser: { css: { // ... exportType: "text", }, }, }, };
ê°ë¥í ì¤ì ê°: `'link' | 'text' | 'css-style-sheet'
link- CSS를 ìì²´ íì¼ë¡ ì¶ì¶íê³linkí그를 ì¬ì©íì¬ DOMì ì½ì í©ëë¤.text- CSS를 JS íì¼ì ì ì¥íê³ ê¸°ë³¸ ë´ë³´ë´ê¸°ë¥¼ ì¬ì©íì¬ ë°íí©ëë¤.css-style-sheet- 기본 ë´ë³´ë´ê¸°ë ìì± ê°ë¥í ì¤íì¼ìí¸(ì: CSSStyleSheet)ì ëë¤. ì¬ì©ì ì ì ììì Shadow DOMì ì ì©í©ëë¤.
module.parser.javascript
JavaScript íì를 ìí ìµì ì ì¤ì í ì ììµëë¤.
export default {
module: {
parser: {
javascript: {
// ...
commonjsMagicComments: true,
},
},
},
};Rule.parserìì ì´ë¬í ìµì
ì ì¤ì íê³ í¹ì 모ëì ëìì¼ë¡ ì§ì í ì ììµëë¤.
module.parser.javascript.anonymousDefaultExportName
5.107.0+anonymous default-export function ë° classì ëí´ webpackì´ .nameì "default"ë¡ ì¤ì í ì§ ì ì´íë©°, ì´ë native ESMì ES specê³¼ ì¼ì¹í©ëë¤. ì´ ìµì
ì íì±ííë©´ webpackì exportì Object.defineProperty(...)를 í¸ì¶í´ .name ê°ì ì¤ì íë ìì runtime helper(__webpack_require__.dn)를 주ì
í©ëë¤.
- Type:
boolean - Default: ì í리ì¼ì´ì
ììë
true, ë¼ì´ë¸ë¬ë¦¬ììëfalse(output.libraryê° ì¤ì ë ê²½ì°)
ì í리ì¼ì´ì
ì 기본ì ì¼ë¡ spec-compliant ìí를 ì ì§í©ëë¤. ë°ë©´ ë¼ì´ë¸ë¬ë¦¬ë .name === "default"ì ìì¡´íë ê²½ì°ê° ë물기 ë문ì, ë²ë¤ í¬ê¸°ë¥¼ ìê² ì ì§í기 ìí´ ì´ helper를 ìëµí©ëë¤.
기본ê°ì ëª ìì ì¼ë¡ ë®ì´ì°ë ¤ë©´ ë¤ìê³¼ ê°ì´ ì¤ì í©ëë¤.
webpack.config.js
export default {
module: {
parser: {
javascript: {
anonymousDefaultExportName: false,
},
},
},
};module.parser.javascript.commonjsMagicComments
CommonJS를 ìí´ magic comments ì§ìì íì±íí ì ììµëë¤.
-
íì :
boolean -
ê°ë¥í ë²ì : 5.17.0+
-
ìì :
export default { module: { parser: { javascript: { commonjsMagicComments: true, }, }, }, };
webpackIgnore 주ìë§ ì§ìë©ëë¤.
const x = require(/* webpackIgnore: true */ "x");module.parser.javascript.dynamicImportFetchPriority
ëì import를 ìí´ ì ì fetchPriority를 ì§ì í©ëë¤.
-
íì :
'low' | 'high' | 'auto' | false -
ê°ë¥í ë²ì : 5.87.0+
-
ìì :
export default { module: { parser: { javascript: { dynamicImportFetchPriority: "high", }, }, }, };
module.parser.javascript.dynamicImportMode
ëì import를 ìí ì ì í리ë¡ë를 ì§ì í©ëë¤.
-
íì :
'eager' | 'weak' | 'lazy' | 'lazy-once' -
ê°ë¥í ë²ì : 5.73.0+
-
ìì :
export default { module: { parser: { javascript: { dynamicImportMode: "lazy", }, }, }, };
module.parser.javascript.dynamicImportPrefetch
ëì import를 ìí ì ì í리ë¡ë를 ì§ì í©ëë¤.
-
íì :
number | boolean -
ê°ë¥í ë²ì : 5.73.0+
-
ìì :
export default { module: { parser: { javascript: { dynamicImportPrefetch: false, }, }, }, };
module.parser.javascript.dynamicImportPreload
ëì import를 ìí ì ì í리ë¡ë를 ì§ì í©ëë¤.
-
íì :
number | boolean -
ê°ë¥í ë²ì : 5.73.0+
-
ìì :
export default { module: { parser: { javascript: { dynamicImportPreload: false, }, }, }, };
module.parser.javascript.exportsPresence
\"import ... from ...\" ì \"export ... from ...\"ìì ë´ë³´ë´ê¸° ì´ë¦ì´ ì못ë ê²½ì°ì ëìì ì§ì í©ëë¤.
-
íì :
'error' | 'warn' | 'auto' | false -
ê°ë¥í ë²ì : 5.62.0+
-
ìì :
export default { module: { parser: { javascript: { exportsPresence: "error", }, }, }, };
module.parser.javascript.importExportsPresence
\"import ... from ...\"ìì ë´ë³´ë´ê¸° ì´ë¦ì´ ì못ë ê²½ì°ì ëìì ì§ì í©ëë¤.
-
íì :
'error' | 'warn' | 'auto' | false -
ê°ë¥í ë²ì : 5.62.0+
-
ìì :
export default { module: { parser: { javascript: { importExportsPresence: "error", }, }, }, };
module.parser.javascript.importMeta
ë²ë¤ë§ ì¤ì webpackì´ import.meta ííìì íê°íë ë°©ìì ì ì´í©ëë¤.
- íì
:
boolean | 'preserve-unknown' - 기본ê°:
true - ê°ë¥í ë²ì : 5.68.0+
íì©ëë ê°:
-
true- webpackì ìë ¤ì§import.metaìì±(ì:import.meta.url,import.meta.webpackHot)ì íê°í©ëë¤. ìë ¤ì§ì§ ìì ìì±ì ëìì ë¤ë¥¸ 구ì±(ì:output.module)ì ë°ë¼ ë¬ë¼ì§ëë¤. -
false-import.metaíê°ë¥¼ 모ë ë¹íì±íí©ëë¤. webpackì ííìì ê·¸ëë¡ ì ì§í©ëë¤. -
'preserve-unknown'5.105.0+ - ìë ¤ì§ ìì±ì íìì ê°ì´ íê°íì§ë§, ë¹íì¤ ìì±ì ì ê±°íë ëì ì¶ë ¥ì ê·¸ëë¡ ì ì§í©ëë¤. -
ìì -
import.metaíê°ë¥¼ ìì í ë¹íì±íí©ëë¤.export default { module: { parser: { javascript: { importMeta: false, }, }, }, }; -
Example - preserve custom
import.metaproperties without enablingoutput.module:// webpack.config.js export default { module: { parser: { javascript: { importMeta: "preserve-unknown", }, }, }, };With this configuration, custom properties on
import.metaset by the build tool or runtime are preserved in the generated output:// import.meta.customPropì ì¸ë¶ìì ì¤ì ë©ëë¤(ì: build tool ëë runtime). if (import.meta.customProp) { console.log(import.meta.customProp); }
module.parser.javascript.importMetaContext
import.meta.webpackContext íê°ë¥¼ ì¬ì©íê±°ë ì¬ì©íì§ ìëë¡ ì¤ì í©ëë¤.
-
íì :
boolean -
ê°ë¥í ë²ì : 5.70.0+
-
ìì :
export default { module: { parser: { javascript: { importMetaContext: true, }, }, }, };
module.parser.javascript.overrideStrict
모ëì 'ì격' ëë 'ë¹ì격' 모ëë¡ ì¤ì í©ëë¤. ì격 모ëì ë¹ì격 모ë ê°ì ì¼ë¶ ëìì´ ë¤ë¥´ê¸° ë문ì ì´ë 모ëì ëìì ìí¥ì ë¯¸ì¹ ì ììµëë¤.
-
Type:
'strict' | 'non-strict' -
Available: 5.93.0+
-
Example:
export default { module: { parser: { javascript: { overrideStrict: "non-strict", }, }, }, };
module.parser.javascript.reexportExportsPresence
\"export ... from ...\"ìì ë´ë³´ë´ê¸° ì´ë¦ì´ ì못ë ê²½ì°ì ëìì ì§ì í©ëë¤. ì´ê²ì TypeScriptìì íì
ì ë¤ì ë´ë³´ë¼ë \"export ... from ...\"ìì \"export type ... from ...\"ì¼ë¡ ë§ì´ê·¸ë ì´ì
íë ëì ë¹íì±ííë ë° ì ì©í©ëë¤.
-
íì :
'error' | 'warn' | 'auto' | false -
ê°ë¥í ë²ì : 5.62.0+
-
ìì :
export default { module: { parser: { javascript: { reexportExportsPresence: "error", }, }, }, };
module.parser.javascript.url
new URL() 구문 íì±ì íì±íí©ëë¤.
-
íì :
boolean = true|'relative' -
ìì :
export default { 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" />- ì´ê²ì ê¸°ì¤ URLì´ ìë²ìì ìë ¤ì§ì§ ìì ë SSR(ìë² ì¬ì´ë ë ëë§)ì ì ì©íë©° ëª ë°ì´í¸ë¥¼ ì ì½í ì ììµëë¤. ëì¼íê² ì ì§í기 ìí´ì í´ë¼ì´ì¸í¸ ë¹ëììë ì¬ì©í´ì¼ í©ëë¤.
- ëí ìë² ì¸¡ ë ëë§ì´ ì¼ë°ì ì¼ë¡ íìí ì ì ì¬ì´í¸ ìì±ê¸°, mini-css-plugin ë° html-plugin ë±ì ìí´ìë íìí©ëë¤.
module.parser.javascript.parse
5.103.0+Webpackì ë´ì¥ íì ëì ì¬ì©ì ì§ì JavaScript íì± í¨ì를 ì¬ì©íì¸ì.
Webpackì AST ë¶ìì´ ì¬ë°ë¥´ê² ìëíëë¡ ast, comments, semicolons를 ë°ííì¸ì.
-
astë ESTreeì í¸íëì´ì¼ í©ëë¤. -
commentsë ESTree 주ì ë ¸ëì ë°°ì´ì ëë¤. -
semicolonsë íìê° ì¸ë¯¸ì½ë¡ ì ì½ì í ìì¹ì ì§í©ì ëë¤. -
Type:
(code: string, options: ParseOptions) => ParseResult -
ìì:
export default { module: { parser: { javascript: { parse: (code, options) => { const comments = []; const semicolons = new Set(); const onInsertedSemicolon = (pos) => semicolons.add(pos); const parseOptions = { ...options, module: options.sourceType === "module", loc: options.locations, onComment: options.comments ? comments : undefined, onInsertedSemicolon: options.semicolons ? onInsertedSemicolon : undefined, }; const ast = meriyah.parse(code, parseOptions); return { ast, comments, semicolons }; }, }, }, }, };
module.parser.json
JSON íìì ëí ìµì ì ì¤ì í©ëë¤.
export default {
module: {
parser: {
json: {
// options
},
},
},
};module.parser.json.exportsDepth
exportInfoë¡ íìë JSON ì¢
ìì±ì ê¹ì´ì
ëë¤.
module.parser.json.exportsDepthì 기본ê°ì modeì ë°ë¼ ë¬ë¼ì§ëë¤.
| 모ë | ê¸°ë³¸ê° |
|---|---|
"production" | Infinity |
"development" | 1 |
"none" | Infinity |
- Type:
number - Available: 5.98.0+
- Example:
export default {
module: {
parser: {
json: {
// ì를 ë¤ë©´, ë¤ì jsonì ê²½ì°ìë
// {
// "depth_1": {
// "depth_2": {
// "depth_3": "foo"
// }
// },
// "_depth_1": "bar"
// }
// `exportsDepth: 1`, `depth_2` ë° `depth_3`ì `exportInfo`ë¡ íëê·¸ê° ì§ì ëì§ ììµëë¤.
exportsDepth: 1,
},
},
},
};module.parser.json.namedExports
ê°ì²´ ì íì JSONì ëí´ ëª ëª ë ë´ë³´ë´ê¸°ë¥¼ íì©í©ëë¤.
- Type:
boolean - Available: 5.103.0+
- Example:
export default {
module: {
parser: {
json: {
// ìì:
// import { myField } from "./file.json";
//
// console.log(myField);
namedExports: true,
},
},
},
};module.parser.json.parse
ì½í ì¸ ë¥¼ íì±íê³ JSONì ë°ííë í¨ìì ëë¤.
- Type:
((input: string) => Buffer | JsonValue) - Example:
import json5 from "json5";
export default {
module: {
parser: {
json: {
parse: json5.parse,
},
},
},
};module.noParse
RegExp [RegExp] function(resource) string [string]
webpackì´ ì£¼ì´ì§ ì ê·ìê³¼ ì¼ì¹íë íì¼ì íì±íì§ ëª»íëë¡ í©ëë¤. ì ì¸ë íì¼ìë import, require, define ëë 기í import ë©ì»¤ëì¦ì í¸ì¶ì´ ìì´ì¼ í©ëë¤. ì´ë ê² íë©´ í° ë¼ì´ë¸ë¬ë¦¬ë¥¼ 무ìí ë ë¹ë ì±ë¥ì í¥ì ìí¬ ì ììµëë¤.
'noParse'ë 모ë 'import', 'require', 'define' ë±ì í¸ì¶ì´ ë°íììì ëë¬í ì ìë ê²½ì° íì¥ì ìëì ì¼ë¡ ë°©ì§íë ë°©ë²ì¼ë¡ë ì¬ì©í ì ììµëë¤.
ì를 ë¤ì´ 'ë¸ë¼ì°ì ' ëìì© íë¡ì í¸ë¥¼ ë¹ëíê³ ë¸ë¼ì°ì ì Node.js 모ëì ëí´ ì¬ì ë¹ëë íì¬ ë¼ì´ë¸ë¬ë¦¬ë¥¼ ì¬ì©í ë, ì를 ë¤ë©´ require('os')ì ê°ì Node.jsì ë´ì¥ 기ë¥ì´ íìí©ëë¤.
webpack.config.js
export default {
// ...
module: {
noParse: /jquery|lodash|src[\\/]vendor[\\/]somelib/,
},
};export default {
// ...
module: {
noParse: (content) =>
/jquery|lodash|src[\\/]vendor[\\/]somelib/.test(content),
},
};module.unsafeCache
boolean function (module)
모ë ìì²ì ëí í´ìì ìºìí©ëë¤. module.unsafeCacheì ëí ëª ê°ì§ 기본ê°ì´ ììµëë¤.
cacheê° ë¹íì±íëì´ ìë¤ë©´falsecacheê° íì±íëì´ ìê³ ëª¨ëì´ node 모ëìì ì¨ ê²ì¼ë¡ ë³´ì¸ë¤ë©´true, ê·¸ë ì§ ìë¤ë©´false
webpack.config.js
export default {
// ...
module: {
unsafeCache: false,
},
};module.rules
(Rule | undefined | null | false | "" | 0 | "...")[]
모ëì´ ìì± ë ë ìì²ê³¼ ì¼ì¹íë Ruleì ë°°ì´ì ëë¤. ì´ë¬í ê·ì¹ì 모ë ìì± ë°©ë²ì ìì í ì ììµëë¤. ë¡ë를 모ëì ì ì©ìí¤ê±°ë íì를 ìì í ì ììµëë¤.
Webpack 5.87.0ë¶í° false, undefined, null ë° 0ê³¼ ê°ì falsy ê°ì ì¬ì©íì¬ ì¡°ê±´ë¶ë¡ ê·ì¹ì ë¹íì±íí ì ììµëë¤.
Rule
object
Ruleì Conditions, Results ê·¸ë¦¬ê³ ì¤ì²©ë Rules ì¸ ë¶ë¶ì¼ë¡ ëë ì§ ì ììµëë¤.
Rule Conditions
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 resultsë Rule conditionì´ ì¼ì¹íë ê²½ì°ìë§ ì¬ì©ë©ëë¤.
Ruleìë ë ê°ì§ ì¶ë ¥ ê°ì´ ììµëë¤.
- ì ì©ë ë¡ë: resourceì ì ì©ë ë¡ëì ë°°ì´ì ëë¤.
- íì ìµì : 모ëì ëí íì를 ë§ëë ë° ì¬ì©í´ì¼íë ìµì ê°ì²´ì ëë¤.
loader, options, use íë¡í¼í°ë ë¡ëì ìí¥ì ì¤ëë¤.
query, loaders íë¡í¼í°ë í¸íì±ì ìí´ ì¡´ì¬í©ëë¤.
enforce íë¡í¼í°ë ì¼ë°, ì¬ì ëë ì¬í ë¡ëì¸ì§ì ë°ë¼ì ë¡ëì ë²ì£¼ì ìí¥ì ì¤ëë¤.
parser íë¡í¼í°ë íì ìµì
ì ìí¥ì ì¤ëë¤.
Nested rules
ì¤ì²©ë rulesì rules, oneOf íë¡í¼í°ìì ì§ì í ì ììµëë¤.
ì´ë¬í ruleì ìì Rule conditionì´ ì¼ì¹íë ê²½ì°ìë§ íê°ë©ëë¤. ê° ì¤ì²© ruleì ìì²´ì ì¼ë¡ ì¡°ê±´ì í¬í¨ í ì ììµëë¤.
íê°ì ììë ë¤ìê³¼ ê°ìµëë¤.
Rule.assert
ì¢
ìì±ì ê°ì ¸ì¤ê¸° ì´ì¤ì
ì ì¼ì¹ìí¤ê³ ì´ì¤ì
ì íì ë°ë¼ í¹ì ê·ì¹ì ì ì©í ì ìë ì¡°ê±´ì
ëë¤.
webpack.config.js
export default {
// ...
module: {
rules: [
{
// "assert { type: 'json' }" ì´ì¤ì
ì ì¬ì©íì¬ ê°ì ¸ì¤ê¸°ë¥¼ ì²ë¦¬í©ëë¤.
assert: { type: "json" },
loader: import.meta.resolve("./loader-assert.js"),
},
],
},
};index.js
import one from "./pkg-1.json" assert { type: "json" };ì´ ìììë Rule.assert를 ì¬ì©íì¬ assert { type: "json" }ì´ë¼ë ì´ì¤ì
ê³¼ í¨ê» ê°ì ¸ì¨ 모ë 모ëì loader-assert.js를 ì ì©íì¬ JSON íì¼ì´ ì¬ë°ë¥´ê² ì²ë¦¬ëëì§ íì¸í©ëë¤.
Rule.compiler
íì ì»´íì¼ë¬ ì´ë¦ì ì¼ì¹ìí¬ ì ìë ì¡°ê±´.
webpack.config.js
export default {
// ...
name: "compiler",
module: {
rules: [
{
test: /a\.js$/,
compiler: "compiler", // "ì»´íì¼ë¬" ì´ë¦ê³¼ ì¼ì¹íë©´ ë¡ëê° ì ì©ë©ëë¤.
use: "./loader",
},
{
test: /b\.js$/,
compiler: "other-compiler", // "ì»´íì¼ë¬" ì´ë¦ê³¼ ì¼ì¹íì§ ìì¼ë¯ë¡ ë¡ëê° ì ì©ëì§ ììµëë¤.
use: "./loader",
},
],
},
};Rule.enforce
string
ê°ë¥í ê°: 'pre' | 'post'
ë¡ëì ë²ì£¼ë¥¼ ì§ì í©ëë¤. ê°ì´ ìì¼ë©´ ì¼ë° ë¡ë를 ì미í©ëë¤.
ì¶ê°ì ì¼ë¡ import/requireì ì¸ë¼ì¸ì¼ë¡ ì ì©ë "ì¸ë¼ì¸ ë¡ë"ë ììµëë¤.
모ë ë¡ëê° ì°¨ë¡ë¡ íµê³¼íë ë ë¨ê³ê° ììµëë¤.
- Pitching ë¨ê³: ë¡ëì pitch ë©ìëë
post, inline, normal, preììë¡ í¸ì¶ë©ëë¤. ìì¸í ë´ì©ì Pitching Loader를 ì°¸ê³ íì¸ì. - Normal ë¨ê³: ë¡ëì normal ë©ìëë
pre, normal, inline, postììë¡ í¸ì¶ë©ëë¤. 모ëì ìì¤ ì½ëìì ë³íì´ ì´ ë¨ê³ìì ë°ìí©ëë¤.
모ë ì¼ë° ë¡ëë ìì²ì !를 ì ëì¬ë¡ ì¶ê°íì¬ ìëµ(ì¬ì ì) í ì ììµëë¤.
모ë ì¼ë° ë° ì¬ì ë¡ëë ìì²ì -!를 ì ëì¬ë¡ ì¶ê°íì¬ ìëµ(ì¬ì ì) í ì ììµëë¤.
모ë ì¼ë°, ì¬í ë° ì¬ì ë¡ëë ìì²ì !!를 ì ëì¬ë¡ ì¶ê°íì¬ ìëµ(ì¬ì ì) í ì ììµëë¤.
// ì¼ë° ë¡ë ë¹íì±í
import { a } from "!./file1.js";// ì¬ì , ì¼ë° ë¡ë ë¹íì±í
import { b } from "-!./file2.js";// 모ë ë¡ë ë¹íì±í
import { c } from "!!./file3.js";ì¸ë¼ì¸ ë¡ëì ! ì ëì¬ë ë¹íì¤ì´ë¯ë¡ ì¬ì©í´ìë ìë©ëë¤. ì´ê²ë¤ì ë¡ëê° ìì±í ì½ëìì ì¬ì©í ì ììµëë¤.
Rule.exclude
ì¡°ê±´ê³¼ ì¼ì¹íë 모ë 모ëì ì ì¸í©ëë¤. Rule.exclude ìµì
ì ì¬ì©íë©´ Rule.resource ìµì
ì ì¬ì©í ì ììµëë¤. ìì¸í ë´ì©ì Rule.resource ë° Condition.exclude를 ì°¸ê³ íì¸ì.
Rule.include
ì¡°ê±´ê³¼ ì¼ì¹íë 모ë 모ëì í¬í¨í©ëë¤. Rule.include ìµì
ì ì¬ì©íë©´ Rule.resource ìµì
ì ì¬ì©í ì ììµëë¤. ìì¸í ë´ì©ì Rule.resource ë° Condition.include를 ì°¸ê³ íì¸ì.
Rule.issuer
ìì²í 모ëê³¼ ë¹êµí Conditionì
ëë¤. ìëì ìì ìì, a.jsì issuerë index.js íì¼ì ê²½ë¡ì
ëë¤.
index.js
import A from "./a.js";ì´ ìµì ì í¹ì 모ë ëë 모ë ì¸í¸ì ëíëìì ë¡ë를 ì ì©íë ë° ì¬ì©í ì ììµëë¤.
Rule.issuerLayer
issuerì ê³ì¸µë³ë¡ íí°ë§íê³ ì¼ì¹ìí¬ ì ììµëë¤.
webpack.config.js
export default {
// ...
module: {
rules: [
{
issuerLayer: "other-layer",
},
],
},
};Rule.layer
string
모ëì´ ë°°ì¹ëì´ì¼ íë ê³ì¸µì ì§ì í©ëë¤. 모ë 그룹ì ë¶í ì²í¬, íµê³ ëë ìí¸ë¦¬ ìµì ìì ì¬ì©í ì ìë íëì ë ì´ì´ë¡ íµí©ë ì ììµëë¤.
webpack.config.js
export default {
// ...
module: {
rules: [
{
test: /module-layer-change/,
layer: "layer",
},
],
},
};Rule.extractSourceMap
boolean = false
íì¼ìì 기존 ìì¤ ë§µ ë°ì´í°ë¥¼ ì¶ì¶í©ëë¤(//# sourceMappingURL 주ììì). ì´ë íì¬ ë¼ì´ë¸ë¬ë¦¬ì ìì¤ ë§µì ë³´ì¡´íë ë° ì ì©í©ëë¤.
webpack.config.js
export default {
// ...
module: {
rules: [
{
test: /\.m?js$/,
extractSourceMap: true,
},
],
},
};Rule.loader
Rule.loaderë Rule.use: [ { loader } ]ì ë¨ì¶ì´ì
ëë¤. ìì¸í ë´ì©ì Rule.useì UseEntry.loader를 ì°¸ê³ íì¸ì.
Rule.loaders
Rule.loadersë Rule.useì ë³ì¹ì
ëë¤. ìì¸í ë´ì©ì Rule.use를 ì°¸ê³ íì¸ì.
Rule.mimetype
mimetypeì ì¬ì©íì¬ ì¤ì ê·ì¹ì ë°ì´í° URIì ì¼ì¹ìí¬ ì ììµëë¤.
webpack.config.js
export default {
// ...
module: {
rules: [
{
mimetype: "application/json",
type: "json",
},
],
},
};application/json, text/javascript, application/javascript, application/node ë° application/wasmì ì´ë¯¸ 기본ì ì¸ mimetypeì¼ë¡ í¬í¨ëì´ ììµëë¤.
Rule.oneOf
Ruleì´ ì¼ì¹í ë 첫 ë²ì§¸ ì¼ì¹íë Ruleë§ ì¬ì©ëë Rulesì ë°°ì´ì
ëë¤.
webpack.config.js
export default {
// ...
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.optionsê³¼ Rule.queryë Rule.use: [ { options } ]ì ë¨ì¶ì´ì
ëë¤. ìì¸í ë´ì©ì Rule.useì UseEntry.optionsì ì°¸ê³ íì¸ì.
Rule.parser
íì ìµì ì´ ìë ê°ì²´ì ëë¤. ì ì©ë 모ë íì ìµì ì´ ë³í©ë©ëë¤.
íìë ì´ë¬í ìµì ì ê²ì¬íê³ ê·¸ì ë°ë¼ ìì²´ì ì¼ë¡ ë¹íì±ííê±°ë ì¬êµ¬ì±í ì ììµëë¤. ëë¶ë¶ì 기본 íë¬ê·¸ì¸ì ê°ì ë¤ìê³¼ ê°ì´ í´ìí©ëë¤.
- ìµì
ì
falseë¡ ì¤ì íë©´ íìê° ë¹íì±íë©ëë¤. - ìµì
ì
trueë¡ ì¤ì íê±°ëundefinedë¡ ëë©´ íìê° íì±íë©ëë¤.
ê·¸ë¬ë, íì íë¬ê·¸ì¸ì boolean ì´ìì ê°ì ë°ìë¤ì¼ ì ììµëë¤. ì를 ë¤ë©´, ë´ë¶ì NodeStuffPluginì true ëì ì ê°ì²´ë¥¼ ë°ì í¹ì Ruleì ëí ìµì
ì ì¶ê°í ì ììµëë¤.
ìì (기본 íë¬ê·¸ì¸ì íì ìµì ):
import path from "node:path";
import { fileURLToPath } from "node:url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export default {
// ...
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.* ë¹íì±í
commonjsMagicComments: false, // CommonJS를 ìí magic comments ì§ì ë¹íì±í
node: {}, // 모ë ìì¤ìì [node](/configuration/node) ê³ì¸µ ì¬êµ¬ì±
// ëë
// node: false, // __dirname, __filename ë±ì ë¹íì±íí©ëë¤.
worker: ["default from web-worker", "..."], // javascript íì¼ì ëí WebWorker ì²ë¦¬ë¥¼ 커ì¤í°ë§ì´ì¦í©ëë¤. "..."ë 기본ê°ì ëíë
ëë¤.
},
},
],
},
};Rule.typeì´ assetì´ë©´ Rules.parser ìµì
ì íì¼ ë´ì©ì Base64ë¡ ì¸ì½ë©í ì§ ëë ë³ëì íì¼ë¡ ì¶ë ¥ ëë í°ë¦¬ì ë´ë³´ë¼ ì§ ì¬ë¶ë¥¼ ëíë´ë ì¡°ê±´ì ì¤ëª
íë ê°ì²´ ëë í¨ìì¼ ì ììµëë¤.
Rule.typeì´ asset ëë asset/inlineì¸ ê²½ì° Rule.generatorìµì
ì 모ë ìì¤ì ì¸ì½ë©ì ì¤ëª
íë ê°ì²´ì´ê±°ë ì¬ì©ì ì§ì ìê³ ë¦¬ì¦ì¼ë¡ 모ëì ìì¤ë¥¼ ì¸ì½ë©íë í¨ìì¼ ì ììµëë¤.
ì¶ê°ì ì¸ ì ë³´ë ì¬ì© ì¬ë¡ë¥¼ ìí´ ì ì 모ë ê°ì´ë를 ì°¸ê³ íì¸ì.
Rule.parser.dataUrlCondition
object = { maxSize number = 8096 } function (source, { filename, module }) => boolean
모ë ìì¤ í¬ê¸°ê° maxSizeë³´ë¤ ìì¼ë©´ 모ëì´ Base64 ì¸ì½ë© 문ìì´ë¡ ë²ë¤ì ì½ì
ëê³ , ê·¸ë ì§ ìì¼ë©´ 모ë íì¼ì´ ì¶ë ¥ ëë í°ë¦¬ë¡ ë´ë³´ë´ì§ëë¤.
webpack.config.js
export default {
// ...
module: {
rules: [
{
// ...
parser: {
dataUrlCondition: {
maxSize: 4 * 1024,
},
},
},
],
},
};í¨ì를 dataUrlConditionì ê°ì¼ë¡ ì¤ì í ê²½ì°ìë true를 ë°ííë©´ webpackì´ ëª¨ëì Base64 ì¸ì½ë© 문ìì´ë¡ ë²ë¤ì ì½ì
íëë¡ ì§ìí©ëë¤. ê·¸ë ì§ ìì¼ë©´ 모ë íì¼ì´ ì¶ë ¥ ëë í°ë¦¬ë¡ ë´ë³´ë´ì§ëë¤.
webpack.config.js
export default {
// ...
module: {
rules: [
{
// ...
parser: {
dataUrlCondition: (source, { filename, module }) => {
const content = source.toString();
return content.includes("some marker");
},
},
},
],
},
};Rule.generator
Rule.generator.dataUrl
object = { encoding string = 'base64' | false, mimetype string = undefined | false } function (content, { filename, module }) => string
Rule.generator.dataUrlì´ ê°ì²´ë¡ ì¬ì©ëë©´ ëê°ì íë¡í¼í°ë¥¼ ì¤ì í ì ììµëë¤.
- encoding:
'base64'ë¡ ì¤ì íë©´ 모ë ìì¤ë Base64 ìê³ ë¦¬ì¦ì ì¬ì©íì¬ ì¸ì½ë©ë©ëë¤.encodingì falseë¡ ì¤ì íë©´ ì¸ì½ë©ì´ ë¹íì±íë©ëë¤. - mimetype: ë°ì´í° URIì MIME ì íì ëë¤. 기본ì ì¼ë¡ 모ë 리ìì¤ íì¥ìì íì¸í©ëë¤.
webpack.config.js
export default {
// ...
module: {
rules: [
{
// ...
generator: {
dataUrl: {
encoding: "base64",
mimetype: "mimetype/png",
},
},
},
],
},
};í¨ìë¡ ì¬ì©íë©´ 모ë 모ëì ëí´ ì¤íëë©° ë°ì´í° URI 문ìì´ì ë°íí´ì¼ í©ëë¤.
export default {
// ...
module: {
rules: [
{
// ...
generator: {
dataUrl: (content) => {
const svgToMiniDataURI = require("mini-svg-data-uri");
if (typeof content !== "string") {
content = content.toString();
}
return svgToMiniDataURI(content);
},
},
},
],
},
};Rule.generator.emit
ì ì 모ëìì ì ì ì°ê¸°ë¥¼ íì§ ìë ê²½ì°, ìë² ì¬ì´ë ëëë§ìì ì¬ì©í ì ììµëë¤.
-
íì :
boolean = true -
ê°ë¥í ë²ì : 5.25.0+
-
ìì :
export default { // ⦠module: { rules: [ { test: /\.png$/i, type: "asset/resource", generator: { emit: false, }, }, ], }, };
Rule.generator.filename
output.assetModuleFilenameê³¼ ëì¼íì§ë§ í¹ì ê·ì¹ì ì¬ì©ë©ëë¤. output.assetModuleFilenameì ì¬ì ìíê³ asset ë° asset/resource 모ë ì íììë§ ìëí©ëë¤.
webpack.config.js
export default {
// ...
output: {
assetModuleFilename: "images/[hash][ext][query]",
},
module: {
rules: [
{
test: /\.png$/,
type: "asset/resource",
},
{
test: /\.html$/,
type: "asset/resource",
generator: {
filename: "static/[hash][ext]",
},
},
],
},
};Rule.generator.publicPath
í¹ì ì ì
모ëì ëí´ publicPath를 ì¬ì©ì ì§ì í©ëë¤.
- íì
:
string | ((pathData: PathData, assetInfo?: AssetInfo) => string) - ê°ë¥í ë²ì : 5.28.0+
export default {
// ...
output: {
publicPath: "static/",
},
module: {
rules: [
{
test: /\.png$/i,
type: "asset/resource",
generator: {
publicPath: "assets/",
},
},
],
},
};Rule.generator.outputPath
'output.path'를 기ì¤ì¼ë¡ ì§ì ë í´ëì ì ì ì ë´ë³´ë ëë¤. ì¬ì©ì ì§ì 'publicPath'ê° í´ë 구조ì ì¼ì¹íëë¡ ì§ì ë ê²½ì°ìë§ íìí©ëë¤.
- íì
:
string | ((pathData: PathData, assetInfo?: AssetInfo) => string) - ê°ë¥í ë²ì : 5.67.0+
export default {
// ...
output: {
publicPath: "static/",
},
module: {
rules: [
{
test: /\.png$/i,
type: "asset/resource",
generator: {
publicPath: "https://cdn/assets/",
outputPath: "cdn-assets/",
},
},
],
},
};Rule.resource
리ìì¤ì ì¼ì¹íë Conditionì
ëë¤. ìì¸í ë´ì©ì ê·ì¹ ì¡°ê±´ì ì°¸ê³ íì¸ì.
Rule.resourceQuery
리ìì¤ ì¿¼ë¦¬ì ì¼ì¹íë Conditionì
ëë¤. ì´ ìµì
ì ìì² ë¬¸ìì´ì 쿼리 ì¹ì
ì ëí´ í
ì¤í¸íë ê²½ì° ì¬ì©ë©ëë¤(ì¦, 물ìíë¶í°). import Foo from './foo.css?inline'ì ì¬ì©íë ê²½ì° ë¤ì ì¡°ê±´ì´ ì¼ì¹í©ëë¤.
webpack.config.js
export default {
// ...
module: {
rules: [
{
test: /\.css$/,
resourceQuery: /inline/,
type: "asset/inline",
},
],
},
};Rule.parser.parse
function(input) => string | object
Rule.typeì´ 'json'ì¼ë¡ ì¤ì ë ê²½ì° Rules.parser.parseìµì
ì 모ëì ìì¤ë¥¼ 구문 ë¶ìíê³ ì´ë¥¼ JavaScript ê°ì²´ë¡ ë³ííë 커ì¤í
ë¡ì§ì 구ííë í¨ìì¼ ì ììµëë¤. í¹ì ë¡ëìì´ toml, yaml ë° ê¸°í JSONì´ ìë íì¼ì JSONì¼ë¡ ê°ì ¸ ì¤ë ê²ì´ ì ì©í ì ììµëë¤.
webpack.config.js
import toml from "toml";
export default {
// ...
module: {
rules: [
{
test: /\.toml/,
type: "json",
parser: {
parse: toml.parse,
},
},
],
},
};Rule.rules
Ruleì´ ì¼ì¹ í ëë ì¬ì©ëë Rulesì ë°°ì´ì
ëë¤.
Rule.scheme
ì¬ì©ë ì¤í¤ë§(ì: data, http)ì ì¼ì¹ìí¤ì¸ì.
- Type:
string | RegExp | ((value: string) => boolean) | RuleSetLogicalConditions | RuleSetCondition[] - Available: 5.38.0+
webpack.config.js
export default {
module: {
rules: [
{
scheme: "data",
type: "asset/resource",
},
],
},
};Rule.sideEffects
bool
모ëì ì´ë¤ ë¶ë¶ì ë¶ìì©ì´ ìëì§ íìíì¸ì. ìì¸í ë´ì©ì Tree Shakingì ì°¸ê³ íì¸ì.
Rule.test
í
ì¤í¸ë¥¼ íµê³¼íë 모ë 모ëì í¬í¨í©ëë¤. Rule.test ìµì
ì ì ê³µíë©´ Rule.resourceë ì ê³µ í ì ììµëë¤. ìì¸í ë´ì©ì Rule.resource ë° Condition를 ì°¸ê³ íì¸ì.
Rule.type
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
export default {
// ...
module: {
rules: [
// ...
{
test: /\.json$/,
type: "javascript/auto",
loader: "custom-json-loader",
},
],
},
};
asset*ì íì ëí ìì¸í ë´ì©ì ì ì 모ë ê°ì´ë를 ì°¸ê³ íì¸ì.
css/auto
5.87.0+css/auto 모ë ì íì ì¬ì© ì¬ë¡ë ì¬ê¸°ë¥¼ ì°¸ê³ íì¸ì. css/auto를 ì¬ì©íë ¤ë©´ experiments.css를 íì±íí´ì¼ í©ëë¤.
export default {
target: "web",
mode: "development",
experiments: {
css: true,
},
module: {
rules: [
{
test: /\.less$/,
use: "less-loader",
type: "css/auto",
},
],
},
};Rule.use
[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
export default {
// ...
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
export default {
// ...
module: {
rules: [
{
use: (info) => [
{
loader: "custom-svg-loader",
},
{
loader: "svgo-loader",
options: {
plugins: [
{
cleanupIDs: {
prefix: basename(info.resource),
},
},
],
},
},
],
},
],
},
};ìì¸í ì ë³´ë UseEntry를 ì°¸ê³ íì¸ì.
Rule.resolve
모ë ê³ì¸µìì í´ìì ëí ì¤ì ì í ì ììµëë¤. í´ì¤ ì¤ì íì´ì§ìì ê°ë¥í 모ë ìµì ì ì°¸ê³ íì¸ì. ì ì©ë 모ë í´ì ìµì ì ìì ê³ì¸µì í´ì ìµì ê³¼ ë³í©ë©ëë¤.
ì를 ë¤ë©´, 모ë ê³ì¸µ í´ìì ë³´ì¬ì£¼ê¸° ìí´ ./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
export default {
resolve: {
alias: {
footer: "./footer/default.js",
},
},
};ì´ ì¤ì ì¼ë¡ ë²ë¤ì ìì±íë©´ console.log(footer)ë 'default footer'를 ì¶ë ¥í©ëë¤. .jsíì¼ì ëí Rule.resolve를 ì¤ì íê³ footer ë³ì¹ì overridden.jsë¡ ì¤ì í´ë³´ê² ìµëë¤.
webpack.js.org
export default {
resolve: {
alias: {
footer: "./footer/default.js",
},
},
module: {
rules: [
{
resolve: {
alias: {
footer: "./footer/overridden.js",
},
},
},
],
},
};ë³ê²½ë ì¤ì ì¼ë¡ ë²ë¤ì ìì±íë©´ console.log(footer)ë 'overridden footer'를 ì¶ë ¥í©ëë¤.
resolve.fullySpecified
boolean = true
íì±íëë©´ .mjs íì¼ ëë ë¤ë¥¸ .js íì¼ìì 모ëì importí ë ê°ì¥ ê°ê¹ì´ ìì package.jsoníì¼ì "type"íëê° "module"ì ê°ì¼ë¡ ê°ì§ê³ ìë ê²½ì° íì¼ íì¥ì를 ì ê³µí´ì¼í©ëë¤. ê·¸ë ì§ ìì¼ë©´ webpackì´ Module not found ì¤ë¥ì í¨ê» ì»´íì¼ì ì¤í¨í©ëë¤. ê·¸ë¦¬ê³ webpackì resolve.mainFilesì ì ìë íì¼ ì´ë¦ì¼ë¡ ëë í°ë¦¬ë¥¼ íì¸íì§ ìì¼ë¯ë¡ íì¼ ì´ë¦ì ì§ì ì§ì í´ì¼í©ëë¤.
webpack.config.js
export default {
// ...
module: {
rules: [
{
test: /\.m?js$/,
resolve: {
fullySpecified: false, // ë¹íì±í
},
},
],
},
};Rule.with
v5.92.0+with í¤ìëë¡ ì ê³µë í¹ì ì¡°ê±´ì ë°ë¼ ê°ì ¸ì¤ê¸°ë¥¼ ì¼ì¹ìí¬ ì ìë ì¡°ê±´ì íµí´ ì½í
ì¸ ì íì ë°ë¼ ë¤ë¥¸ ê·ì¹ì ì ì©í ì ììµëë¤.
webpack.config.js
export default {
// ...
module: {
rules: [
{
// "with { type: 'json' }" ì¡°ê±´ì¼ë¡ ê°ì ¸ì¤ê¸°ë¥¼ ì²ë¦¬í©ëë¤.
with: { type: "json" },
loader: import.meta.resolve("./loader-assert.js"),
},
],
},
};index.js
import one from "./pkg-1.json" with { type: "json" };ì´ ììì Rule.withë with { type: "json" } ì¡°ê±´ì¼ë¡ ê°ì ¸ì¨ 모ë 모ëì loader-assert.js를 ì ì©íë ë° ì¬ì©ë©ëë¤.
Condition
Conditionì ìë í목ì¤ì íëê° ë©ëë¤.
- 문ìì´: ì ë ¥ì ì¼ì¹ìí¤ë ¤ë©´ ì ê³µë 문ìì´ë¡ ììí´ì¼ í©ëë¤. ì를 ë¤ë©´, ì ë ëë í°ë¦¬ ê²½ë¡ ëë íì¼ì ì ë ê²½ë¡ì ëë¤.
- ì ê·ííì: ì ë ¥ì ê²ì¬í©ëë¤.
- í¨ì: ì ë ¥ê³¼ í¨ê» í¸ì¶ëë©° ì¼ì¹íë ¤ë©´ 참과 ê°ì ê°ì ë°íí´ì¼ í©ëë¤.
- Condition ë°°ì´: Condition ì¤ íë ì´ìì´ ì¼ì¹í´ì¼ í©ëë¤.
- ê°ì²´: 모ë íë¡í¼í°ê° ì¼ì¹í´ì¼ í©ëë¤. ê° ìì±ìë ì ì ë ëìì´ ììµëë¤.
{ and: [Condition] }: 모ë Conditionì´ ì¼ì¹í´ì¼ í©ëë¤.
{ or: [Condition] }: ì´ë¤ Conditionì´ë ì¼ì¹íë©´ ë©ëë¤.
{ not: [Condition] }: 모ë Conditionì´ ì¼ì¹íë©´ ì ë©ëë¤.
Example:
import path from "node:path";
import { fileURLToPath } from "node:url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export default {
// ...
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/"),
],
},
],
},
};UseEntry
object function(info)
object
문ìì´ì¸ loader íë¡í¼í°ê° ìì´ì¼ í©ëë¤. ë¡ë í´ì ìµì
(resolveLoader)ì ì¬ì©íì¬ ì¤ì contextì ìëì ì¼ë¡ í´ìë©ëë¤.
options íë¡í¼í°ë 문ìì´ì´ë ê°ì²´ê° ë ì ììµëë¤. ì´ ê°ì ë¡ëì ì ë¬ëë©° ë¡ë ìµì
ì¼ë¡ í´ìëì´ì¼ í©ëë¤.
í¸íì±ì ìí´ options íë¡í¼í°ì ë³ì¹ì¸ query ìì±ë ê°ë¥í©ëë¤. options íë¡í¼í°ë¥¼ ì¬ì©íë ê²ì ê¶ì¥í©ëë¤.
webpackì ìµì
ì í¬í¨í 모ë ë¡ëì 리ìì¤ìì ê³ ì í 모ë ìë³ì를 ìì±í´ì¼í©ëë¤. ìµì
ê°ì²´ì JSON.stringifyë¡ ì´ë¥¼ ìëí©ëë¤. 99.9%ì ê²½ì°ì 문ì ê° ìì§ë§ 리ìì¤ì ë¤ë¥¸ ìµì
ì´ ìë ëì¼í ë¡ë를 ì ì©íê³ ìµì
ì ëì¼í 문ìì´ ê°ì´ ìë ê²½ì° ê³ ì íì§ ìì ì ììµëë¤.
ìí JSON ê°ì ìµì
ê°ì²´ë¥¼ 문ìì´í í ì ìë ê²½ì°ìë ì¤ë¨ë©ëë¤. ì´ë¥¼ í´ê²°í기 ìí´ ê³ ì ìë³ìë¡ ì¬ì©ëë ìµì
ê°ì²´ìì ident ìì±ì ê°ì§ ì ììµëë¤.
webpack.config.js
export default {
// ...
module: {
rules: [
{
loader: "css-loader",
options: {
modules: true,
},
},
],
},
};function(info)
UseEntryë ë¡ëëë 모ëì ëíë´ë ê°ì²´ë¥¼ ì¸ìë¡ ë°ë í¨ìì¼ ìë ìì¼ë©° í¨ìê° ìë UseEntry ê°ì²´ë¥¼ ë°íí´ì¼ í©ëë¤.
info ê°ì²´ íë¼ë¯¸í°ìë ë¤ìê³¼ ê°ì íëê° ììµëë¤.
compiler: íì¬ webpack ì»´íì¼ë¬ (ì ìëì§ ìì ì ìì)issuer: ë¡ë ì¤ì¸ 모ëì ê°ì ¸ì¤ë 모ëì ê²½ë¡realResource: íì ë¡ëëë 모ëì ê²½ë¡resource: ë¡ëëë 모ëì ê²½ë¡. ìì² ë¬¸ìì´ì!=!를 íµí´ 리ìì¤ ì´ë¦ì ë®ì´ ì°ë ê²½ì°ë¥¼ ì ì¸íê³ ë ì¼ë°ì ì¼ë¡realResourceì ê°ìµëë¤.
webpack.config.js
export default {
// ...
module: {
rules: [
{
test: /\.svg$/,
type: "asset",
use: (info) => ({
loader: "svgo-loader",
options: {
plugins: [
{
cleanupIDs: { prefix: basename(info.resource) },
},
],
},
}),
},
],
},
};Module Contexts
ì´ ìµì ì ëì ì¢ ìì±ì´ ë°ìí ë ìì±ëë 컨í ì¤í¸ì 기본 ì¤ì ì ì¤ëª í©ëë¤.
unknown ëì ì¢
ìì± ì ìì: require.
expr ëì ì¢
ìì± ì ìì: require(expr).
wrapped ëì ì¢
ìì± ì ìì: require('./templates/' + expr).
ë¤ìì 기본ê°ì¼ë¡ ì¬ì© ê°ë¥í ìµì ì ëë¤.
webpack.config.js
export default {
// ...
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: /\\.\\*/)



