Printable
Migrate
ì´ ì¹ì ììë ì´ì ë²ì ì webpackìì ìµì ë²ì ì¼ë¡ ë§ì´ê·¸ë ì´ì íë ë°©ë²ì ì ê³µí©ëë¤.
To v5 from v4
ì´ ê°ì´ëë webpackì ì§ì ì¬ì©í ë webpack 5ë¡ ë§ì´ê·¸ë ì´ì íë ë° ëìì´ ëë ê²ì 목íë¡ í©ëë¤. webpackì ì¤íí기 ìí´ ë ëì ìì¤ì ë구를 ì¬ì©íë ê²½ì° ê·¸ ë구ì ë§ì´ê·¸ë ì´ì ì§ì¹¨ì ì°¸ê³ íì¸ì.
Preparations
Webpack 5ë Node.js 10.13.0 (LTS) ì´ìì ë²ì ì´ íìí©ëë¤. ë°ë¼ì ì¬ì í ì´ì ë²ì ì ì¤í ì¤ì¸ ê²½ì° Node.js를 ì ê·¸ë ì´ëí´ì¼ í©ëë¤.
Upgrade webpack 4 and its plugins/loaders
-
webpack4ì ì¬ì© ê°ë¥í ìµì ë²ì ì¼ë¡ ì ê·¸ë ì´ëíì¸ì.-
webpack >= 4를 ì¬ì©íë ê²½ì° ìµì webpack 4 ë²ì ì¼ë¡ ì ê·¸ë ì´ëí ë ì¶ê° ì§ì¹¨ì´ íìíì§ ììµëë¤.
-
webpack ë²ì 4 미ë§ì ì¬ì©íë ê²½ì° webpack 4 ë§ì´ê·¸ë ì´ì ê°ì´ë를 ì°¸ê³ íì¸ì.
-
-
webpack-cliì ì¬ì©íë¤ë©´ ì¬ì© ê°ë¥í ìµì ë²ì ì¼ë¡ ì ê·¸ë ì´ëíì¸ì. -
ì¬ì©í 모ë íë¬ê·¸ì¸ê³¼ ë¡ë를 ì¬ì© ê°ë¥í ìµì ë²ì ì¼ë¡ ì ê·¸ë ì´ëíì¸ì.
Codemods
webpack v4ìì v5ë¡ ì ê·¸ë ì´ëíë ê²ì ì§ìí기 ìí´ Codemodë ëë¶ë¶ì ë§ì´ê·¸ë ì´ì íë¡ì¸ì¤ë¥¼ ìëííë ë° ëìì´ ëë ì¤í ìì¤ ì»¤ë®¤ëí° codemod를 ì ê³µí©ëë¤.
ì´ê²ë¤ì ê³µì webpack codemodsê° ìëë©°, ë§ì´ê·¸ë ì´ì ì ê°ìííë ê²ì 목íë¡ íì§ë§ 모ë ê²½ì°ë¥¼ í¬ê´íì§ë ìì ì ììµëë¤. ì ê·¸ë ì´ë를 ìì í ìë£íë ¤ë©´ ì¶ê° ìë ë¨ê³ë¥¼ ìíí´ì¼ í ìë ììµëë¤.
webpack v5 ë§ì´ê·¸ë ì´ì codemods를 ì¤íí©ëë¤.
npx codemod@latest webpack/v5/migration-recipeì´ë ê² íë©´ Codemod ë ì§ì¤í¸ë¦¬ìì ë¤ì codemodê° ì¤íë©ëë¤.
webpack/v5/set-target-to-false-and-update-pluginswebpack/v5/migrate-library-target-to-library-objectwebpack/v5/json-imports-to-default-imports
ì´ë¬í ê° codemodë webpack v5 ë§ì´ê·¸ë ì´ì ê°ì´ëì ëì´ë ë³ê²½ ì¬íì ìëíí©ëë¤. ì¬ì© ê°ë¥í webpack v5 codemodì ì ì²´ 목ë¡ì Codemod ë ì§ì¤í¸ë¦¬ë¥¼ ì°¸ê³ íì¸ì.
Make sure your build has no errors or warnings
webpack, webpack-cli, íë¬ê·¸ì¸ ê·¸ë¦¬ê³ ë¡ë를 ì
ê·¸ë ì´ëíë©´ì ìë¡ì´ ì¤ë¥ì ê²½ê³ ê° ìì ì ììµëë¤. ë¹ë ì¤ ì¬ì© ì¤ë¨ ê²½ê³ ë¥¼ 주ìíì¸ì.
ì´ ë°©ë²ì¼ë¡ webpackì í¸ì¶íì¬ ì´ë¤ íë¬ê·¸ì¸ê³¼ ë¡ëê° ì±
ìì´ ìëì§ íì
í기 ìí´ ì¬ì© ì¤ë¨ ê²½ê³ ì ëí ì¤í ì¶ì ì ì»ì ì ììµëë¤.
node --trace-deprecation node_modules/webpack/bin/webpack.jswebpack 5ë ì´ì ë ì¬ì©ëì§ ìë 기ë¥ì 모ë ì ê±°íë¯ë¡ ê³ì ì§ííë ¤ë©´ ë¹ë ì¤ì webpack ì¬ì© ì¤ë¨ ê²½ê³ ê° ìëì§ íì¸íì¸ì.
Make sure to use mode
mode를 production ëë developì¼ë¡ ì¤ì íì¬ í´ë¹ 기본ê°ì´ ì¤ì ëì´ ìëì§ íì¸íì¸ì.
Update outdated options
ë¤ì ìµì ì ì ë²ì ì¼ë¡ ì ë°ì´í¸í©ëë¤. (ì¬ì©ëë ê²½ì°)
optimization.hashedModuleIds: trueâoptimization.moduleIds: 'hashed'optimization.namedChunks: trueâoptimization.chunkIds: 'named'optimization.namedModules: trueâoptimization.moduleIds: 'named'NamedModulesPluginâoptimization.moduleIds: 'named'NamedChunksPluginâoptimization.chunkIds: 'named'HashedModuleIdsPluginâoptimization.moduleIds: 'hashed'optimization.noEmitOnErrors: falseâoptimization.emitOnErrors: trueoptimization.occurrenceOrder: trueâoptimization: { chunkIds: 'total-size', moduleIds: 'size' }optimization.splitChunks.cacheGroups.vendorsâoptimization.splitChunks.cacheGroups.defaultVendorsoptimization.splitChunks.cacheGroups.test(module, chunks)âoptimization.splitChunks.cacheGroups.test(module, { chunkGraph, moduleGraph })Compilation.entriesâCompilation.entryDependenciesserveâDevServer를 ìí´serveê° ì ê±°ëììµëë¤.Rule.query(v3ë¶í° ì¬ì© ì¤ë¨ë¨) âRule.options/UseEntry.optionsRule.loadersâRule.use
Test webpack 5 compatibility
webpack 4 ì¤ì ìì ë¤ì ìµì ì ì¤ì íê³ ë¹ëê° ì¬ì í ì¬ë°ë¥´ê² ìëíëì§ íì¸íì¸ì.
export default {
// ...
node: {
Buffer: false,
process: false,
},
};webpack 5ì ì¤ì ì ì ê·¸ë ì´ëí ë ì´ ìµì ì ë¤ì ì ê±°í´ì¼ í©ëë¤.
Upgrade webpack to 5
ì´ì webpackì ë²ì 5ë¡ ì ê·¸ë ì´ëí´ ë´ ìë¤.
-
npm:
npm install webpack@latest -
Yarn:
yarn add webpack@latest -
pnpm:
pnpm add webpack@latest
ë§ì½ "Webpack 4 ë° íë¬ê·¸ì¸/ë¡ë ì ê·¸ë ì´ë" ë¨ê³ìì ì¼ë¶ íë¬ê·¸ì¸/ë¡ë를 ìµì ë²ì ì¼ë¡ ì ê·¸ë ì´ëíì§ ëª»íë¤ë©´, ì§ê¸ì´ë¼ë ì ê·¸ë ì´ëíë ê²ì ìì§ ë§ì¸ì.
Clean up configuration
-
webpack ì¤ì ìì
optimization.moduleIdsë°optimization.chunkIdsì 거를 ê³ ë ¤íì¸ì. 기본ê°ìproduction모ëìì ì¥ê¸° ìºì±ì ì§ìíê³development모ëìì ëë²ê¹ ì ì§ìí기 ë문ì ë ëì ì ììµëë¤. -
webpack ì¤ì ìì
[hash]placeholder를 ì¬ì©í ë[contenthash]ë¡ ë³ê²½íë ê²ì´ ì¢ìµëë¤. ëì¼íì§ë ìì§ë§, ë í¨ê³¼ì ì¸ ê²ì¼ë¡ ì ì¦ëììµëë¤. -
Yarnì PnP ë°
pnp-webpack-pluginì ì¬ì©íë ê²½ì° ì¢ì ììì´ ììµëë¤. ì´ì 기본ì ì¼ë¡ ì§ìë©ëë¤. ì¤ì ìì ì ê±°í´ì¼ í©ëë¤. -
ì ê· ííìê³¼ í¨ê»
IgnorePluginì ì¸ìë¡ ì¬ì©íë ê²½ì° ì´ì optionsobject를 ì¬ì©í©ëë¤.new IgnorePlugin({ resourceRegExp: /regExp/ }). -
node.fs: 'empty'ì ê°ì ê²ì ì¬ì©íë ê²½ì°resolve.fallback.fs: falseë¡ êµì²´íì¸ì. -
webpack Node.js APIìì
watch: true를 ì¬ì©íë ê²½ì° ì ê±°íì¸ì. í¸ì¶íë ì»´íì¼ë¬ ë©ìëê° ëíë´ë ëë¡ ì¤ì í íìê° ììµëë¤.watch()ì ê²½ì°trueëërun()ì ê²½ì°falseì ëë¤. -
raw-loader,url-loaderëëfile-loader를 ì¬ì©íì¬ ì ì ë¤ì load í기 ìí´ ì ìërulesê° ìë ê²½ì° ê°ê¹ì´ ì¥ëì ì¬ì©ëì§ ìì ê²ì´ë¯ë¡ Asset Modules ì ëì ì¬ì©íì¸ì. -
targetì´ í¨ìë¡ ì¤ì ëì´ ìì¼ë©´falseë¡ ì ë°ì´í¸íê³pluginsoption ë´ìì í´ë¹ í¨ì를 ì ì©íì¸ì. ìë ì를 ì°¸ê³ íì¸ì.// for webpack 4 { target: WebExtensionTarget(nodeConfig) } // for webpack 5 { target: false, plugins: [ WebExtensionTarget(nodeConfig) ] }Note: Codemod for this change:
npx codemod webpack/v5/set-target-to-false-and-update-plugins(ì¬ê¸°ìì registry를 íì¸íì¸ì.)
-
output.library ëë output.libraryTargetì´ ì ìë ê²½ì° ìì± ì´ë¦ì ë³ê²½í©ëë¤ (output.libraryTarget -> output.library.type, output.library -> output.library.name). ì를 ë¤ë©´ ë¤ìê³¼ ê°ìµëë¤.
// for webpack 4 { output: { library: 'MyLibrary', libraryTarget: 'commonjs2' } } // for webpack 5 { output: { library: { name: 'MyLibrary', type: 'commonjs2' } } }Note: Codemod for this change:
npx codemod webpack/v5/migrate-library-target-to-library-object(ì¬ê¸°ìì registry를 íì¸íì¸ì.)
import를 íµí´ WebAssembly를 ì¬ì©íë ê²½ì° ë¤ì ë ë¨ê³ íë¡ì¸ì¤ë¥¼ ë°ë¼ì¼ í©ëë¤.
- webpack 4ììì ëì¼í ëìì ì»ì¼ë ¤ë©´
experiments.syncWebAssembly: true를 ì¤ì íì¬ ì´ì ë ì¬ì©ëì§ ìë ì¬ìì íì±íí©ëë¤. - webpack 5ë¡ ì±ê³µì ì¼ë¡ ë§ì´ê·¸ë ì´ì
í í WASM íµí©ì ìí ìµì ì¬ìì ì¬ì©íë ¤ë©´
experimentsê°ìexperiments: { asyncWebAssembly: true }ì¼ë¡ ë³ê²½í©ëë¤.
optimization.splitChunks 를 ì¬ê³ íì¸ì.
- ê¸°ë³¸ê° ëë
optimization.splitChunks: { chunks: 'all' }ì ì¬ì©íë ê²ì ê¶ì¥í©ëë¤. - ì¬ì©ì ì ì ì¤ì ì ì¬ì©í ë
name: false를 ìì íê³name: string | functionìidHint: string | functionë¡ êµì²´íì¸ì. Optimization.splitChunks.cacheGroups: { default: false, vendors: false }를 ì¤ì íì¬ ê¸°ë³¸ê°ì ë ì ìììµëë¤. ì´ê²ì ê¶ì¥íì§ ìì§ë§, webpack 5ìì ê°ì í¨ê³¼ë¥¼ ì»ê³ ì¶ë¤ë©´optimization.splitChunks.cacheGroups: { default: false, defaultVendors: false }를 ì¬ì©í ì ììµëë¤.
ê¸°ë³¸ê° ì 거를 ê³ ë ¤íì¸ì.
entry: './src/index.js'ë ìëµí ì ììµëë¤. ì´ê²ì´ 기본ê°ì ëë¤.output.path: path.resolve(__dirname, 'dist')ë ìëµí ì ììµëë¤. ì´ê²ì´ 기본ê°ì ëë¤.output.filename: '[name].js'ë ìëµí ì ììµëë¤. ì´ê²ì´ 기본ê°ì ëë¤.
Need to support an older browser like IE 11?
-
íë¡ì í¸ì ëí´ browserslist를 íì±íí ê²½ì° webpack 5ë
browserslistì¤ì ì ì¬ì¬ì©íì¬ ë°íì ì½ëì ëí´ ë´ë³´ë¼ ì½ë ì¤íì¼ì ê²°ì í©ëë¤.íì¤í í ê²ë¤.
targetìbrowserslistì¼ë¡ ì¤ì íê±°ë webpackì´ ìëì¼ë¡browserslistì ì¤ì íëë¡targetì ì ê±°í©ëë¤.IE 11ì browserslist ì¤ì ì ì¶ê°í©ëë¤.
-
browserslistê° ìì¼ë©´ webpackì ë°íì ì½ëë ES2015 구문(ì: íì´í í¨ì)ì ì¬ì©íì¬ ë ìì ë²ë¤ì ë¹ëí©ëë¤. ë°ë¼ì ES2015 구문ì ì§ìíì§ ìë ë¸ë¼ì°ì (ì: IE11)ì ES5 구문ì ì¬ì©íë ¤ë©´target: ['web', 'es5']를 ì¤ì í´ì¼ í©ëë¤. -
Node.jsì ê²½ì° ë¹ëìë
targetoptionì ì§ìëë Node.js ë²ì ì´ í¬í¨ëë©° webpackì ì§ìëë 구문ì ìëì¼ë¡ íì í©ëë¤. ì를 ë¤ì´target: 'node8.6'ì ê°ì´ ì¬ì©í©ëë¤.
Cleanup the code
Using /* webpackChunkName: '...' */
ì¬ì© ìë를 ì´í´í´ì¼ í©ëë¤.
- ì¬ê¸°ì chunk's nameì public ì©ì ëë¤.
- ì¤ì§ ê°ë°ì ìí ì´ë¦ì´ ìëëë¤.
- Webpackì ì´ë¥¼ ì¬ì©íì¬ production ë° development 모ëìì íì¼ ì´ë¦ì ì§ì í©ëë¤.
- Webpack 5ë
webpackChunkNameì ì¬ì©íì§ ìë ê²½ì°ìëdevelopment모ëìì ì ì©í íì¼ ì´ë¦ì ìëì¼ë¡ í ë¹í©ëë¤.
Using named exports from JSON modules
ì´ê²ì ì ì¬ììì ì§ìëì§ ìì¼ë©° ê²½ê³ ê° íìë©ëë¤.
import { version } from "./package.json";
console.log(version);ì ì½ë ëì ìë ì½ë를 ì¬ì©íì¸ì.
import pkg from "./package.json";
console.log(pkg.version);Note: Codemod for this change:
npx codemod webpack/v5/json-imports-to-default-imports(ìì¸í ë´ì©ì ë ì§ì¤í¸ë¦¬ ë§í¬ë¥¼ ì°¸ê³ íì¸ì.)
Cleanup the build code
const compiler = webpack(...);ì ì¬ì©í ë ì»´íì¼ë¬ë¥¼ ì¬ì©í íìë ë°ëì ì»´íì¼ë¬ë¥¼ ë«ìì¼ í©ëë¤.compiler.close(callback);.- ì´ê²ì ìëì¼ë¡ ë«íë
webpack(..., callback)ìììë ì ì©ëì§ ììµëë¤. - ì¬ì©ìê° íë¡ì¸ì¤ë¥¼ ì¢ ë£í ëê¹ì§ ê°ì 모ëìì webpackì ì¬ì©íë ê²½ì° ì í ì¬íì ëë¤. ì´ë° ì¢ ë¥ì ìì ìë ê°ì 모ëì ì í´ ë¨ê³ê° ì¬ì©ë©ëë¤.
- ì´ê²ì ìëì¼ë¡ ë«íë
Run a single build and follow advice
ë¹ë ì¤ë¥/ê²½ê³ ë¥¼ 주ì ê¹ê² ì½ì´ë³´ì¸ì. í´ë¹íë ì¡°ì¸ì´ ìë ê²½ì° issue를 ìì±í´ 주ìë©´ í´ê²°í´ ëë¦¬ê² ìµëë¤.
ìµìí ë 벨 3 ëë 4를 í ëê¹ì§ ë¤ì ë¨ê³ë¥¼ ë°ë³µí©ëë¤.
-
Level 1: Schema validation fails.
Configuration optionsê° ë³ê²½ëììµëë¤.
BREAKING CHANGE:ë©ëª¨ ëë ëì ì¬ì©í´ì¼ íë ìµì ì ëí íí¸ì ì í¨ì± ê²ì¬ ì¤ë¥ê° ìì´ì¼ í©ëë¤. -
Level 2: Webpack exits with an error.
ì¤ë¥ ë©ìì§ë ë³ê²½í´ì¼ í ì¬íì ìë ¤ì¼ í©ëë¤.
-
Level 3: Build Errors.
ì¤ë¥ ë©ìì§ìë
BREAKING CHANGE:ë©ëª¨ê° ìì´ì¼ í©ëë¤. -
Level 4: Build Warnings.
ê²½ê³ ë©ìì§ë 무ìì ê°ì í ì ìëì§ ìë ¤ì¼ í©ëë¤.
-
Level 5: Runtime Errors.
ì´ê²ì ê¹ë¤ë¡ìµëë¤. 문ì 를 ì°¾ì¼ë ¤ë©´ ëë²ê·¸í´ì¼ í ê²ì ëë¤. ì¼ë°ì ì¸ ì¡°ì¸ì ì¬ê¸°ìì ì´ë µìµëë¤. ê·¸ë¬ë ë°íì ì¤ë¥ì ê´ë ¨íì¬ ìëì ëª ê°ì§ ì¼ë°ì ì¸ ì¡°ì¸ì ëì´í©ëë¤.
processë ì ìëì§ ìììµëë¤.- webpack 5ë ë ì´ Node.js ë³ìì ëí í´ë¦¬íì í¬í¨íì§ ììµëë¤. íë¡ í¸ìë ì½ëìì ì¬ì©íì§ ë§ì¸ì.
- ë¸ë¼ì°ì ì¬ì©ì ì§ìíê³ ì¶ì¼ì ê°ì? íê²½ì ë°ë¼ ë¤ë¥¸ ì½ë를 ì¬ì©íë ¤ë©´
exportëëimportspackage.json íë를 ì¬ì©íì¸ì.- ëí ì´ì ë²ë¤ë¬ë¥¼ ì§ìíë ¤ë©´
browseríë를 ì¬ì©í©ëë¤. - ëì:
typeof processê²ì¬ë¡ ì½ë ë¸ë¡ì ëí í©ëë¤. ì´ë ë²ë¤ í¬ê¸°ì ë¶ì ì ì¸ ìí¥ì 미칩ëë¤.
- ëí ì´ì ë²ë¤ë¬ë¥¼ ì§ìíë ¤ë©´
process.env.VARIABLEê³¼ í¨ê» íê²½ ë³ì를 ì¬ì©íê³ ì¶ì¼ì ê°ì? ì¤ì ìì ì´ë¬í ë³ì를 ì ìíë ¤ë©´DefinePluginëëEnvironmentPluginì ì¬ì©í´ì¼ í©ëë¤.- ê·¸ê² ëì
VARIABLEì¬ì©ì ê³ ë ¤íê³typeof VARIABLE !== 'undefined'ë íì¸íì¸ì.process.envë Node.jsì ë°ë¼ ë¤ë¥´ë©° íë¡ í¸ìë ì½ëììë í¼í´ì¼ í©ëë¤.
- ê·¸ê² ëì
autoê° í¬í¨ë URLì ê°ë¦¬í¤ë 404 ì¤ë¥- 모ë ìíê³ ë구ê°
output.publicPath: "auto"를 íµí ìë¡ì´ 기본 ìëpublicPathì ëí´ ì¤ë¹ë ê²ì ìëëë¤- ëì ê³ ì ê°
output.publicPath: ""를 ì¬ì©íì¸ì.
- ëì ê³ ì ê°
- 모ë ìíê³ ë구ê°
- ì ìëì§ ìì ìì±ì ì½ì ì ììµëë¤('call' ì½ê¸°)
- ë°íì ì¤ì ì´ ì¤ë¥ê° ë°ìíë©´ ModuleConcatenationPluginê³¼ ê´ë ¨ì´ ìì ì ììµëë¤. í´ë¹ íë¬ê·¸ì¸ì ì¬ì© ì¤ì¸ì§ íì¸íê³ , ì¤ì íì¼ì
pluginsì¹ì ì íë¬ê·¸ì¸ì í¬í¨ìì¼°ì¼ë©° í´ë¹ ì¤ì ì´production모ëë¡ ì¤ì ëì´ ìëì§ íì¸íì¸ì. íë¬ê·¸ì¸ 목ë¡ìì í´ë¹ íë¬ê·¸ì¸(ì:new webpack.optimize.ModuleConcatenationPlugin())ì ì ê±°íì¸ì. webpack 5ììë í´ë¹ íë¬ê·¸ì¸ì´ íë¡ëì 모ëìì 기본ì ì¼ë¡ íì±íëì´ ìì¼ë©°, ë ë² í¬í¨ë ì ììµëë¤. - ì¼ë°ì ì¼ë¡ ê° íë¬ê·¸ì¸ì ë¹íì±ííê³ ë¹ë를 í ì¤í¸íë ê²ì 문ì ì ìì¸ì íì íë ì¢ì ë°©ë²ì ëë¤.
- ìì¸í ë´ì©ì ì´ ë¬¸ì 를 ì°¸ê³ íì¸ì.
- ë°íì ì¤ì ì´ ì¤ë¥ê° ë°ìíë©´ ModuleConcatenationPluginê³¼ ê´ë ¨ì´ ìì ì ììµëë¤. í´ë¹ íë¬ê·¸ì¸ì ì¬ì© ì¤ì¸ì§ íì¸íê³ , ì¤ì íì¼ì
-
Level 6: Deprecation Warnings.
ì¬ì© ì¤ë¨ ê²½ê³ ê° ë§ì ì ììµëë¤. ì´ê²ì ì§ì ì ì¸ ë¬¸ì ê° ìëëë¤. íë¬ê·¸ì¸ì íµì¬ ë³ê²½ ì¬íì ë°ë¼ì¡ì ìê°ì´ íìí©ëë¤. ì´ë¬í ì§ì ì¤ë¨ì íë¬ê·¸ì¸ì ë³´ê³ íì¸ì. ì´ë¬í ì§ì ì¤ë¨ì ê²½ê³ ì¼ ë¿ì´ë©° ë¹ëë ì¬ì í ì½ê°ì ë¨ì (ì: ì±ë¥ ì í)ì¼ë¡ë§ ìëí©ëë¤.
--no-deprecationíëê·¸ì í¨ê» node를 ì¤ííì¬ ì¬ì© ì¤ë¨ ê²½ê³ ë¥¼ ì¨ê¸¸ ì ììµëë¤(ì:node --no-deprecation node_modules/webpack/bin/webpack.js). ì´ê²ì ì¼ìì ì¸ í´ê²° ë°©ë²ì¼ ë¿ì ëë¤.- íë¬ê·¸ì¸ ë° ë¡ë 기ì¬ìë ì¬ì© ì¤ë¨ ë©ìì§ì ì¡°ì¸ì ë°ë¼ ì½ë를 ê°ì í ì ììµëë¤.
-
Level 7: Performance issues.
ì¼ë°ì ì¼ë¡ webpack 5ììë ì±ë¥ì´ í¥ìëì§ë§, ì±ë¥ì´ ëë¹ ì§ë ê²½ì°ë ììµëë¤.
ê·¸ë¦¬ê³ ìí©ì ê°ì í기 ìí´ ë¤ìê³¼ ê°ì´ í ì ììµëë¤.
- ìê°ì´ ì´ëìì ììëìëì§ ì¤ëª
í©ëë¤.
--profile --progressë ì´ì ê°ë¨í ì±ë¥ íë¡íì íìí©ëë¤.node --inspect-brk node_modules/webpack/bin/webpack.js+chrome://inspect/edge://inspect(íë¡íì¼ë¬ í ì°¸ê³ ).- ì´ë¬í íë¡íì íì¼ì ì ì¥íê³ ì´ìì ì ê³µí ì ììµëë¤.
- ì´ë¤ ê²½ì°ìë ë ëì ì¤í ì¶ì ì ìí´
--no-turbo-inliningíë그를 ì¬ì©í´ ë³´ì¸ì.
- ì¦ë¶ ë¹ëìì 모ëì ë¹ëíë ìê°ì webpack 4ììì ê°ì´ ìì íì§ ìì ìºì±ì¼ë¡ ëë리면 ê°ì ë ì ììµëë¤.
module.unsafeCache: true- ê·¸ë¬ë ì´ê²ì ì½ë 기ë°ì ì¼ë¶ ë³ê²½ ì¬íì ì²ë¦¬íë 기ë¥ì ìí¥ì ë¯¸ì¹ ì ììµëë¤.
- Full build
- ì´ì ë ì¬ì©ëì§ ìë 기ë¥ì ëí ì´ì ë²ì ê³¼ì í¸íì± ê³ì¸µì ì¼ë°ì ì¼ë¡ ì 기ë¥ì ë¹í´ ì±ë¥ì´ ì íë©ëë¤.
- ê²½ê³ ë¥¼ ë§ì´ ìì±íë©´ 무ìíëë¼ë ë¹ë ì±ë¥ì ìí¥ì ì¤ ì ììµëë¤.
- Source Mapsë ë¹ì©ì´ ë§ì´ ëëë¤. 문ììì
devtoolìµì ì íì¸íì¬ ë¤ìí ìµì ì ë¹êµíì¸ì. - ë°ì´ë¬ì¤ ë°±ì ë³´í¸ë íì¼ ìì¤í ì¡ì¸ì¤ ì±ë¥ì ìí¥ì ì¤ ì ììµëë¤.
- ì구 ìºì±ì ë°ë³µì ì¸ ì ì²´ ë¹ë를 ê°ì íë ë° ëìì´ ë ì ììµëë¤.
- 모ë ì°í©ì ì¬ì©íë©´ ì í리ì¼ì´ì ì ì¬ë¬ ê°ì ìì ë¹ëë¡ ë¶í í ì ììµëë¤.
- ìê°ì´ ì´ëìì ììëìëì§ ì¤ëª
í©ëë¤.
Everything works?
webpack 5ë¡ ì±ê³µì ì¼ë¡ ë§ì´ê·¸ë ì´ì íë¤ê³ í¸ìí´ì£¼ì¸ì. Tweet it
It is not working?
issue를 ë§ë¤ê³ ë§ì´ê·¸ë ì´ì ì¤ì ë°ìí 문ì ì ëí´ ìë ¤ì£¼ì¸ì.
Something missing in this guide?
Pull Request를 ë§ë¤ì´ ì´ ê°ì´ë를 ì¬ì©íë ë¤ì ì¬ëì ëì주ì¸ì.
Changes to internals
ì í ì¶ê°, ì½ë 리í©í ë§ ë° ë©ìë ì´ë¦ ë³ê²½ê³¼ ê°ì webpack ë´ë¶ì ë³ê²½ ì¬íì ê´ì¬ ìë 모ë ì¬ëì ìí´ ì¬ê¸°ì ëì´ë©ëë¤. ê·¸ë¬ë ì¼ë°ì ì¸ ì¬ì© ì¬ë¡ ë§ì´ê·¸ë ì´ì ì ì¼ë¶ë¡ ìëí ê²ì ìëëë¤.
Module.nameForCondition,Module.updateCacheModuleë°Module.chunkConditionì ë ì´ì ì í ì¬íì´ ìëëë¤.
getOptions method for Loaders
Webpack 5ë ë¡ë 컨í
ì¤í¸ìì ì¬ì©í ì ìë ë´ì¥ this.getOptions ë©ìëì í¨ê» ì ê³µë©ëë¤. ì´ê²ì ì´ì ì ì í¸íë schema-utilsìì getOptions ë©ìë를 ì¬ì©íë ë¡ëì ëí 주ì ë³ê²½ ì¬íì
ëë¤.
this.getOptionsë webpack 5ë¶í° ì¬ì©í ì ììµëë¤.- JSON5 ëì 쿼리 문ìì´ë¡ JSONì ì§ìí©ëë¤.
?{arg:true}â?{"arg":true}. JSON5를 ì¬ì©íë ê²ì í´ë¹ ë¡ëì 문ììì ì´ì ë ì¬ì©ëì§ ìë ê²ì¼ë¡ ê°ì£¼íê³ ë¬¸ìíëì´ì¼ í©ëë¤. loader-utilsìë 쿼리 문ìì´ êµ¬ë¬¸ ë¶ìì ìí í¹ì ëìì´ ììµëë¤(true,falseë°nullìstringë¡ êµ¬ë¬¸ ë¶ìëì§ ìê³ ìì ê°ì¼ë¡ 구문 ë¶ìë¨). 기본querystring구문 ë¶ì(Node.jsì í¨ê» ì ê³µë¨) ì ì¬ì©íë ìë¡ì´ ë´ì¥this.getOptionsë©ìëì ê²½ì°ìë ê·¸ë ì§ ììµëë¤.this.getOptionsë©ìë를 ì¬ì©íì¬ ìµì ì ê°ì ¸ì¨ í ë¡ëì ì½ëìì ì´ë¬í ê²½ì°ì ëí ì¬ì©ì ì ì ëìì ì¶ê°íë ê²ì ì¬ì í ê°ë¥í©ëë¤.- ìë¡ì´
this.getOptionsë©ìëì ëí´ ì¤í¤ë§ ì¸ìë ì í ì¬íì´ì§ë§ ë¡ë ìµì ì ëí ì¤í¤ë§ ì í¨ì± ê²ì¬ë¥¼ ì¶ê°íë ê²ì´ ì¢ìµëë¤. ì¤í¤ë§ìtitleíëë ì í¨ì± ê²ì¬ ì¤ë¥ ë©ìì§ë¥¼ ì¬ì©ì ì ìíë ë° ì¬ì©í ì ììµëë¤. ì를 ë¤ë©´"title": "My Loader ooptions"ë ë¤ìê³¼ ê°ì ë°©ìì¼ë¡ ì¤ë¥ë¥¼ íìí©ëë¤.Invalid ooooptions object. My Loader has been initialised using an ooooptions object that does not match the API schema. - ooooptions.foo.bar.baz should be a string.
To v4 from v3
ì´ ê°ì´ëë ìµì¢ ì¬ì©ììê² ìí¥ì 주ë 주ì ë³ê²½ ì¬íë¤ì ë³´ì¬ì¤ëë¤. ë ìì¸í ì¬íì ë³ê²½ ì¬íì ì°¸ê³ íì¸ì.
Node.js v4
Node.js v4 ì´íì ë²ì ì ì¬ì©íê³ ìë¤ë©´, Node.js v6 ì´ìì¼ë¡ ì ê·¸ë ì´ëí íìê° ììµëë¤.
Node.jsì ë²ì ì ì ê·¸ë ì´ë í기 ìí ì§ì¹¨ ì¬íë¤ì ì´ê³³ìì ì°¾ìë³¼ ì ììµëë¤.
CLI
CLIë ë¶ë¦¬ë í¨í¤ì§(webpack-cli)ë¡ ì®ê²¼ìµëë¤. webpackì ì¬ì©í기 ì ì CLI를 ì¤ì¹í´ì¼í©ëë¤. 기본 ì¤ì ì ì°¸ê³ íì¸ì.
ì¤ì¹ ê°ì´ëë ì´ê³³ìì ì°¾ì ì ììµëë¤.
Update plugins
ëë¶ë¶ì 3rd party íë¬ê·¸ì¸ì webpack 4ì í¸íëë ìµì ë²ì ì¼ë¡ ì ë°ì´í¸ í´ì¼í©ëë¤. ì ìë ¤ì§ íë¬ê·¸ì¸ë¤ì ëí ë§í¬ë ì´ê³³ìì ì°¾ì ë³¼ ì ììµëë¤.
mode
ì¤ì ì ìë¡ì´ mode ìµì
ì ì¶ê°íì¸ì. ì¤ì íì
ì ë°ë¼ 'production', 'development' í¹ì 'none'ì¼ë¡ ì¤ì íì¸ì.
webpack.config.js
module.exports = {
// ...
+ mode: 'production',
}Deprecated/Removed plugins
ì´ë¬í íë¬ê·¸ì¸ì íë¡ëì 모ëìì 기본 ì ê³µëë¯ë¡ ì¤ì ìì ì ê±°í ì ììµëë¤.
webpack.config.js
module.exports = {
// ...
plugins: [
- new NoEmitOnErrorsPlugin(),
- new ModuleConcatenationPlugin(),
- new DefinePlugin({ "process.env.NODE_ENV": JSON.stringify("production") })
- new UglifyJsPlugin()
],
}ì´ë¬í íë¬ê·¸ì¸ì íë¡ëì 모ëìì 기본ì¼ë¡ ì ê³µë©ëë¤.
webpack.config.js
module.exports = {
// ...
plugins: [
- new NamedModulesPlugin()
],
}ì´ë¬í íë¬ê·¸ì¸ì ë ì´ì ì¬ì©ëì§ ìê³ , íì¬ë ìì ëììµëë¤.
webpack.config.js
module.exports = {
// ...
plugins: [
- new NoErrorsPlugin(),
- new NewWatchingPlugin()
],
}CommonsChunkPlugin
CommonsChunkPluginì ìì ëììµëë¤. ëì optimization.splitChunksì ì¬ì©í ì ììµëë¤.
ë ìì¸í ì¬íì optimization.splitChunks 문ììì ì°¾ì ì ììµëë¤. 기본 ì¤ì ì ì´ë¯¸ ì구ì¬íì 충족í ê²ì
ëë¤.
import() and CommonJS
non-ESMì ë¶ë¬ì¤ê¸° ìí´ import()ì ì¬ì©í ë, webpack 4ìì ê²°ê³¼ë ë°ëëë¤. ê·¸ëì module.exportsì ê°ì ì»ê¸° ìí´ default íë¡í¼í°ì ì ê·¼í íìê° ììµëë¤.
non-esm.js
module.exports = {
sayHello: () => {
console.log("hello world");
},
};example.js
function sayHello() {
import("./non-esm.js").then((module) => {
module.default.sayHello();
});
}json and loaders
.json íì¼ì ë³íí기 ìí´ ì¬ì©ì ì§ì ë¡ë를 ì¬ì©í ë, type 모ëì ë°ê¿ì¼ í©ëë¤.
webpack.config.js
module.exports = {
// ...
rules: [
{
test: /config\.json$/,
loader: 'special-loader',
+ type: 'javascript/auto',
options: {...}
}
]
};ìì§ë json-loader를 ì¬ì©íë¤ë©´, ì´ê²ì ì§ì¸ ì ììµëë¤.
webpack.config.js
module.exports = {
// ...
rules: [
{
- test: /\.json$/,
- loader: 'json-loader'
}
]
};module.loaders
module.loadersë webpack 2ë¶í° ì¬ì©íì§ ìì¼ë©°, íì¬ë module.rulesì ë°ë¼ ìì íìµëë¤.
To v2 or v3 from v1
- ë¤ì ì¹ì ììë webpack 1ìì 2ë¡ì 주ì ë³ê²½ ì¬íì ì¤ëª í©ëë¤.
resolve.root, resolve.fallback, resolve.modulesDirectories
ì ìµì
ë¤ì resolve.modules ë¡ ëì²´ëììµëë¤. ìì¸í ì¬ì©ë²ì resolvingì ì°¸ê³ íì¸ì.
resolve: {
- root: path.join(__dirname, "src")
+ modules: [
+ path.join(__dirname, "src"),
+ "node_modules"
+ ]
}resolve.extensions
ì´ ìµì
ì ë ì´ì ë¹ ë¬¸ìì´ì ì ë¬í íìê° ììµëë¤. ì´ ëìì resolve.enforceExtensionì¼ë¡ ì´ëëììµëë¤. ìì¸í ì¬ì©ë²ì resolving 를 ì°¸ê³ íì¸ì.
resolve.*
ì¬ê¸°ìì ì¬ë¬ APIê° ë³ê²½ëììµëë¤. íí ì¬ì©ëì§ ìì¼ë¯ë¡ ìì¸í ëì´íì§ ììµëë¤. ìì¸í ë´ì©ì resolvingì ì°¸ê³ íì¸ì.
module.loaders is now module.rules
ì´ì ì ë¡ëì¤ì ì ë¡ëì ê·¸ ì´ìì ì¤ì ì´ íê°ëë ê°ë ¥í ê·ì¹ ìì¤í
ì¼ë¡ ëì²´ ëììµëë¤.
í¸íì±ì ìí´ ì´ì ì module.loaders 구문ì ì¬ì í ì í¨íë©° ì´ì ì´ë¦ì 구문 ë¶ìë©ëë¤.
ë¤ì´ë° 컨벤ì
ë¤ì´ ì´í´í기 ì¬ìì¡ê³ module.rules를 ì¬ì©íëë¡ ì¤ì ì ì
ê·¸ë ì´ë í´ì¼íë ì¢ì ì´ì ì
ëë¤.
module: {
- loaders: [
+ rules: [
{
test: /\.css$/,
- loaders: [
- "style-loader",
- "css-loader?modules=true"
+ use: [
+ {
+ loader: "style-loader"
+ },
+ {
+ loader: "css-loader",
+ options: {
+ modules: true
+ }
+ }
]
},
{
test: /\.jsx$/,
loader: "babel-loader", // Do not use "use" here
options: {
// ...
}
}
]
}Chaining loaders
webpack 1ììì ê°ì´ ë¡ë를 ì°ê²°íì¬ ë¡ëìì ë¡ëë¡ ê²°ê³¼ë¥¼ ì ë¬í ì ììµëë¤.
rule.use 를 ì¬ì©íì¬, use 를 ë¡ë ë°°ì´ë¡ ì¤ì í ì ììµëë¤.
webpack 1ìì ë¡ëë ì¼ë°ì ì¼ë¡ !ë¡ ì°ê²°ëììµëë¤. ì´ ì¤íì¼ì ë ê±°ì ìµì
module.loaders 를 ì¬ì©íë ê²½ì°ìë§ ì§ìë©ëë¤.
module: {
- loaders: [{
+ rules: [{
test: /\.less$/,
- loader: "style-loader!css-loader!less-loader"
+ use: [
+ "style-loader",
+ "css-loader",
+ "less-loader"
+ ]
}]
}Automatic -loader module name extension removed
ë¡ë를 ì°¸ê³ í ë -loader íì¥ì를 ë ì´ì ìëµí ì ììµëë¤.
module: {
rules: [
{
use: [
- "style",
+ "style-loader",
- "css",
+ "css-loader",
- "less",
+ "less-loader",
]
}
]
}resolveLoader.moduleExtensions ì¤ì ìµì
ì ì¬ì©íì¬ ì´ì ëìì ê³ì ì íí ì ìì§ë§ ì´ë ê¶ì¥ëì§ ììµëë¤.
+ resolveLoader: {
+ moduleExtensions: ["-loader"]
+ }ì´ ë³ê²½ ì´ì ë #2986 ì ì°¸ê³ íì¸ì.
json-loader is not required anymore
JSON íì¼ì ëí´ ì¤ì ë ë¡ëê° ìì¼ë©´, webpackì ìëì¼ë¡ json-loaderë¡ JSON íì¼ì ë¡ëíë ¤ê³ ìëí©ëë¤.
module: {
rules: [
- {
- test: /\.json/,
- loader: "json-loader"
- }
]
}webpack, node.js ë° browserify ê°ì í경차ì´ë¥¼ ìì 기 ìí´ ê·¸ë ê² íê¸°ë¡ ê²°ì íìµëë¤.
Loaders in configuration resolve relative to context
webpack 1 ìì, ì¤ì ë ë¡ëê° ì¼ì¹íë íì¼ì 기ì¤ì¼ë¡ íì¸ëì´ì§ëë¤. íì§ë§, webpack 2 ììë, ì¤ì ë ë¡ëë context ìµì
ì 기ì¤ì¼ë¡ íì¸ë©ëë¤.
ì´ê²ì npm link 를 ì¬ì©íê±°ë ì¸ë¶ context 모ëì ì°¸ê³ í ë ë¡ëì ìí´ ë°ìíë ì¤ë³µ 모ë 문ì 를 í´ê²°í©ëë¤.
ì´ ë¬¸ì 를 í´ê²°í기 ìí´ ëª ê°ì§ íµì ì ê±°í ì ììµëë¤.
module: {
rules: [
{
// ...
- loader: require.resolve("my-loader")
+ loader: "my-loader"
}
]
},
resolveLoader: {
- root: path.resolve(__dirname, "node_modules")
}module.preLoaders and module.postLoaders were removed:
module: {
- preLoaders: [
+ rules: [
{
test: /\.js$/,
+ enforce: "pre",
loader: "eslint-loader"
}
]
}UglifyJsPlugin sourceMap
UglifyJsPlugin ì sourceMap ìµì
ì true ëì false ë¡ ê¸°ë³¸ ì¤ì ë©ëë¤. ì¦, ìµìíë ì½ëì ìì¤ë§µì ì¬ì©íê±°ë uglifyjs ê²½ê³ ì ëí ì¬ë°ë¥¸ ì¤ ë²í¸ë¥¼ ìíë ê²½ì° UglifyJsPluginìì sourceMap: true를 ì¤ì í´ì¼ í©ëë¤.
devtool: "source-map",
plugins: [
new UglifyJsPlugin({
+ sourceMap: true
})
]UglifyJsPlugin warnings
UglifyJsPluginì compress.warnings ìµì
ì ì´ì true ëì falseë¡ ê¸°ë³¸ ì¤ì ë©ëë¤.
ì¦, uglifyjs ê²½ê³ ë¥¼ ë³´ë ¤ë©´ compress.warnings를 trueë¡ ì¤ì í´ì¼ í©ëë¤.
devtool: "source-map",
plugins: [
new UglifyJsPlugin({
+ compress: {
+ warnings: true
+ }
})
]UglifyJsPlugin minimize loaders
UglifyJsPlugin ì ë ì´ì ë¡ë를 ìµìí 모ëë¡ ì ííì§ ììµëë¤. minimize: true ì¤ì ì ì¥ê¸°ì ì¼ë¡ ë¡ë ìµì
ì íµí´ ì ë¬ëì´ì¼ í©ëë¤. ê´ë ¨ ìµì
ì ë¡ë 문ì를 ì°¸ê³ íì¸ì.
ë¡ëì ìµìí 모ëë webpack 3 ì´ììì ì ê±°ë©ëë¤.
ì´ì ë¡ëìì í¸íì±ì ì ì§í기 ìí´ íë¬ê·¸ì¸ì íµí´ ë¡ë를 ìµìí 모ëë¡ ì íí ì ììµëë¤.
plugins: [
+ new webpack.LoaderOptionsPlugin({
+ minimize: true
+ })
]DedupePlugin has been removed
webpack.optimize.DedupePluginì ë ì´ì íìíì§ ììµëë¤. ì¤ì ìì ì ê±°íì¸ì.
BannerPlugin - breaking change
BannerPluginì ë ì´ì ë ê°ì 매ê°ë³ì를 íì©íì§ ìê³ ë¨ì¼ ìµì
ê°ì²´ë¥¼ íì©í©ëë¤.
plugins: [
- new webpack.BannerPlugin('Banner', {raw: true, entryOnly: true});
+ new webpack.BannerPlugin({banner: 'Banner', raw: true, entryOnly: true});
]OccurrenceOrderPlugin is now on by default
OccurrenceOrderPluginì ì´ì 기본ì ì¼ë¡ íì±íëë©° ì´ë¦ì´ ë³ê²½ëììµëë¤(webpack 1ì OccurenceOrderPlugin).
ë°ë¼ì ì¤ì ìì íë¬ê·¸ì¸ì ì ê±°í´ì¼ í©ëë¤.
plugins: [
// webpack 1
- new webpack.optimize.OccurenceOrderPlugin()
// webpack 2
- new webpack.optimize.OccurrenceOrderPlugin()
]ExtractTextWebpackPlugin - breaking change
ExtractTextPlugin ì´ webpack 2ì í¨ê» ìëíë ¤ë©´ ë²ì 2ê° íìí©ëë¤.
npm install --save-dev extract-text-webpack-plugin
ì´ íë¬ê·¸ì¸ì ì¤ì ë³ê²½ì ì£¼ë¡ êµ¬ë¬¸ì ëë¤.
ExtractTextPlugin.extract
module: {
rules: [
{
test: /.css$/,
- loader: ExtractTextPlugin.extract("style-loader", "css-loader", { publicPath: "/dist" })
+ use: ExtractTextPlugin.extract({
+ fallback: "style-loader",
+ use: "css-loader",
+ publicPath: "/dist"
+ })
}
]
}new ExtractTextPlugin({options})
plugins: [
- new ExtractTextPlugin("bundle.css", { allChunks: true, disable: false })
+ new ExtractTextPlugin({
+ filename: "bundle.css",
+ disable: false,
+ allChunks: true
+ })
]Full dynamic requires now fail by default
ííì(ì¦, require(expr))ë§ ìë ì¢
ìì±ì ì´ì ì ì²´ ëë í°ë¦¬ì 컨í
ì¤í¸ ëì ë¹ ì»¨í
ì¤í¸ë¥¼ ìì±í©ëë¤.
ì´ì ê°ì ì½ëë ES2015 모ëìì ìëíì§ ìì¼ë¯ë¡ 리í©í ë§í´ì¼ í©ëë¤.
ì´ê²ì´ ê°ë¥íì§ ìë¤ë©´ ContextReplacementPluginì ì¬ì©íì¬ ì»´íì¼ë¬ê° ì¬ë°ë¥¸ í´ê²°ì íëë¡ íí¸ë¥¼ ì¤ ì ììµëë¤.
Using custom arguments in CLI and configuration
CLI를 ë¨ì©íì¬ ë¤ìê³¼ ê°ì´ ì¤ì ì ì¬ì©ì ì§ì ì¸ì를 ì ë¬í ê²½ì°.
webpack --custom-stuff
// webpack.config.js
const customStuff = process.argv.includes("--custom-stuff");
/* ... */
module.exports = config;ì´ê²ì´ ë ì´ì íì©ëì§ ììì ì ì ììµëë¤. ì´ì CLIê° ë ì격í´ì¡ìµëë¤.
ëì ì¤ì ì ì¸ì를 ì ë¬í기 ìí ì¸í°íì´ì¤ê° ììµëë¤. ëì ì¬ì©í´ì¼ í©ëë¤. 미ëì ë구ë ì´ê²ì ìì¡´í ì ììµëë¤.
webpack --env.customStuff
module.exports = function (env) {
const { customStuff } = env;
/* ... */
return config;
};CLI를 ì°¸ê³ íì¸ì.
require.ensure and AMD require are asynchronous
ì´ë¬í í¨ìë ì´ì ì²í¬ê° ì´ë¯¸ ë¡ëë ê²½ì° ë기ìì¼ë¡ ì½ë°±ì í¸ì¶íë ëì íì ë¹ë기ìì ëë¤.
require.ensureë ì´ì ë¤ì´í°ë¸ Promiseì ìì¡´í©ëë¤. ê·¸ê²ë¤ì´ ìë íê²½ìì require.ensure를 ì¬ì©íë¤ë©´ í´ë¦¬íì´ íìí ê²ì
ëë¤.
Loader configuration is through options
webpack.config.jsìì ì¬ì©ì ì ì ìì±ì¼ë¡ ë¡ë를 ë ì´ì ì¤ì í ìììµëë¤. optionsì íµí´ ìíí´ì¼ í©ëë¤. ts ìì±ì´ ìë ë¤ì ì¤ì ì ë ì´ì webpack 2ìì ì í¨íì§ ììµëë¤.
module.exports = {
// ...
module: {
rules: [
{
test: /\.tsx?$/,
loader: "ts-loader",
},
],
},
// does not work with webpack 2
ts: { transpileOnly: false },
};What are options?
ì¢ì ì§ë¬¸ì
ëë¤. ìë°í ë§íë©´ 2ê°ì§ë¡ í´ì ê°ë¥íë©°, 모ë webpack ë¡ë를 ì¤ì íë ë°©ë²ì
ëë¤. ê³ ì ì ì¼ë¡ optionsì queryë¼ê³ íì¼ë©° ë¡ë ì´ë¦ì ì¶ê°í ì ìë 문ìì´ì´ììµëë¤. 쿼리 문ìì´ê³¼ ë§¤ì° ì ì¬íì§ë§ ì¤ì ë¡ë ë ê°ë ¥í 기ë¥ì
ëë¤.
module.exports = {
// ...
module: {
rules: [
{
test: /\.tsx?$/,
loader: `ts-loader?${JSON.stringify({ transpileOnly: false })}`,
},
],
},
};ê·¸ë¬ë ë¡ëì í¨ê» ì ê³µëë ë³ëë¡ ì§ì ë ê°ì²´ì¼ ìë ììµëë¤.
module.exports = {
// ...
module: {
rules: [
{
test: /\.tsx?$/,
loader: "ts-loader",
options: { transpileOnly: false },
},
],
},
};LoaderOptionsPlugin context
ì¼ë¶ ë¡ëë 컨í ì¤í¸ ì ë³´ê° íìíê³ ì¤ì ìì ì´ë¥¼ ì½ìµëë¤. ì´ê²ì ì¥ê¸°ì ì¼ë¡ ë¡ë ìµì ì íµí´ ì ë¬ëì´ì¼ í©ëë¤. ê´ë ¨ ìµì ì ë¡ë 문ì를 ì°¸ê³ íì¸ì.
ì´ì ë¡ëìì í¸íì±ì ì ì§í기 ìí´ íë¬ê·¸ì¸ì íµí´ ì´ ì 보를 ì ë¬í ì ììµëë¤.
plugins: [
+ new webpack.LoaderOptionsPlugin({
+ options: {
+ context: __dirname
+ }
+ })
]debug
debug ìµì
ì webpack 1ìì ë¡ë를 ëë²ê·¸ 모ëë¡ ì ííìµëë¤. ì´ê²ì ì¥ê¸°ì ì¼ë¡ ë¡ë ìµì
ì íµí´ ì ë¬ëì´ì¼ í©ëë¤. ê´ë ¨ ìµì
ì ë¡ë 문ì를 ì°¸ê³ íì¸ì.
ë¡ëì ëë²ê·¸ 모ëë webpack 3 ì´ììì ì ê±°ë©ëë¤.
ì´ì ë¡ëìì í¸íì±ì ì ì§í기 ìí´ íë¬ê·¸ì¸ì íµí´ ë¡ë를 ëë²ê·¸ 모ëë¡ ì íí ì ììµëë¤.
- debug: true,
plugins: [
+ new webpack.LoaderOptionsPlugin({
+ debug: true
+ })
]Code Splitting with ES2015
webpack 1ììë require.ensure() 를 ìì© íë¡ê·¸ë¨ì ì²í¬ë¥¼ ì§ì° ë¡ëíë ë°©ë²ì¼ë¡ ì¬ì©í ì ììµëë¤.
require.ensure([], (require) => {
const foo = require("./module");
});ES2015 ë¡ë ì¬ìì import()를 ë°íìì ëì ì¼ë¡ ES2015 모ëì ë¡ëíë ë°©ë²ì¼ë¡ ì ìí©ëë¤. Webpackì import()를 ë¶ë¦¬ì ì¼ë¡ ì²ë¦¬íê³ ìì²ë 모ëì ë³ëì ì²í¬ì ë£ìµëë¤. import()ë 모ë ì´ë¦ì ì¸ìë¡ ì·¨íê³ Promise를 ë°íí©ëë¤.
function onClick() {
import("./module")
.then((module) => module.default)
.catch((err) => {
console.log("Chunk loading failed");
});
}ì¢ì ìì: ì²í¬ ë¡ë ì¤í¨ë Promise 기ë°ì´ê¸° ë문ì ì´ì ì²ë¦¬í ì ììµëë¤.
Dynamic expressions
ë¶ë¶ ííìì import()ì ì ë¬í ì ììµëë¤. ì´ê²ì CommonJSì ííìê³¼ ì ì¬íê² ì²ë¦¬ë©ëë¤(webpackì ê°ë¥í 모ë íì¼ê³¼ í¨ê» contextì ìì±í©ëë¤).
import()ë ê°ë¥í ê° ëª¨ëì ëí´ ë³ëì ì²í¬ë¥¼ ìì±í©ëë¤.
function route(path, query) {
return import(`./routes/${path}/route`).then(
(route) => new route.Route(query),
);
}
// This creates a separate chunk for each possible routeMixing ES2015 with AMD and CommonJS
AMD ë° CommonJSì ê²½ì° ì¸ ê°ì§ 모ë ì íì 모ë ìì ë¡ê² í¼í©í ì ììµëë¤(ëì¼í íì¼ ë´ììë). ì´ ê²½ì° Webpackì babel ë° node-epsì ì ì¬íê² ëìí©ëë¤.
// CommonJS consuming ES2015 Module
const book = require("./book");
book.currentPage;
book.readPage();
book.default === "This is a book";// ES2015 Module consuming CommonJS
import fs from "node:fs"; // module.exports map to default
typeof fs.readFileSync === "function";// ES2015 Module consuming CommonJS
import { readFileSync } from "node:fs"; // named exports are read from returned object+
typeof readFileSync === "function";Webpackì´ ì¬ì©í ì ìëë¡ ì´ë¬í 모ë 기í¸ë¥¼ 구문 ë¶ìíì§ ìëë¡ Babelì ì§ìíë ê²ì´ ì¤ìí©ëë¤.
.babelrc ëë babel-loader ìµì
ìì ë¤ìì ì¤ì íë©´ ë©ëë¤.
.babelrc
{
"presets": [["es2015", { "modules": false }]]
}Hints
무ì¸ê°ë¥¼ ë°ê¿ íìë ìì§ë§ 기íì ëë¤.
Template strings
Webpackì ì´ì ííììì í í릿 문ìì´ì ì§ìí©ëë¤. ì´ë Webpack ì¤ì ìì ì¬ì©í ì ììì ì미í©ëë¤.
- require("./templates/" + name);
+ require(`./templates/${name}`);Configuration Promise
Webpackì ì´ì ì¤ì íì¼ìì Promise ë°íì ì§ìí©ëë¤. ì´ë ê² íë©´ ì¤ì íì¼ìì ë¹ë기 ì²ë¦¬ê° ê°ë¥í©ëë¤.
webpack.config.js
module.exports = function () {
return fetchLangs().then((lang) => ({
entry: "...",
// ...
plugins: [new DefinePlugin({ LANGUAGE: lang })],
}));
};Advanced loader matching
Webpackì ì´ì ë¡ëì ëí´ ì¼ì¹ìí¬ ë ë§ì í목ì ì§ìí©ëë¤.
module.exports = {
// ...
module: {
rules: [
{
resource: /filename/, // matches "/path/filename.js"
resourceQuery: /^\?querystring$/, // matches "?querystring"
issuer: /filename/, // matches "/path/something.js" if requested from "/path/filename.js"
},
],
},
};More CLI options
ì¬ì©í ì ìë ëª ê°ì§ ìë¡ì´ CLI ìµì ì´ ììµëë¤.
--define process.env.NODE_ENV="production" DefinePlugin를 ì°¸ê³ íì¸ì.
--display-depth ë ê° ëª¨ëì ì§ì
ì ê¹ì§ì 거리를 íìí©ëë¤.
--display-used-exports ë 모ëìì ì¬ì©ëë ë´ë³´ë´ê¸° ì 보를 íìí©ëë¤.
--display-max-modules ë ì¶ë ¥ì íìëë 모ëì ì를 ì¤ì í©ëë¤(기본ê°ì 15).
-pë ì´ì process.env.NODE_ENV를 "production"ì¼ë¡ ì ìí©ëë¤.
Loader changes
ë³ê²½ ì¬íì ë¡ë ìì±ììê²ë§ í´ë¹ë©ëë¤.
Cacheable
ì´ì 기본ì ì¼ë¡ ë¡ë를 ìºìí ì ììµëë¤. ë¡ëë ìºìí ì ìë ê²½ì° ìµí¸ììí´ì¼ í©ëë¤.
// Cacheable loader
module.exports = function(source) {
- this.cacheable();
return source;
} // Not cacheable loader
module.exports = function(source) {
+ this.cacheable(false);
return source;
}Complex options
webpack 1 ì ë¡ëì ëí´ JSON.stringify ê°ë¥ ìµì
ë§ ì§ìí©ëë¤.
webpack 2 ë ì´ì 모ë JS ê°ì²´ë¥¼ ë¡ë ìµì ì¼ë¡ ì§ìí©ëë¤.
webpack 2.2.1 ì´ì (ì¦, 2.0.0ìì 2.2.0ê¹ì§), ident를 ì¬ì©íë ë° íìí ë³µì¡í ìµì
ì ì¬ì©íì¬ options ê°ì²´ë¥¼ ì¬ì©íì¬ ë¤ë¥¸ ë¡ëìì ì°¸ê³ í ì ììµëë¤. ì´ë 2.2.1ìì ì ê±°ëìì¼ë¯ë¡ íì¬ ë§ì´ê·¸ë ì´ì
ììë ident í¤ë¥¼ ì¬ì©í íìê° ììµëë¤.
{
test: /\.ext/
use: {
loader: '...',
options: {
- ident: 'id',
fn: () => require('./foo.js')
}
}
}


