рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕
рдпрд╣ рдХреЛрдИ рд░рд╣рд╕реНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗрдмрдкреИрдХ 4 рдХреА рд░рд┐рд▓реАрдЬ рдХреЗ рд╕рд╛рде, рдХреЛрдб рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рд░рдгрдиреАрддрд┐ рдмрд╣реБрдд рдмрджрд▓ рдЧрдИ рд╣реИред рдпрд╣ рдХрд╣рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдлрд┐рд░ рд╕реЗ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдкреБрд░рд╛рдиреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдиреЗ рдЕрднреА рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдФрд░ рдирдпрд╛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдЬреЛ рд▓реЛрдЧ рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП webpack.optimize.CommonsChunkPlugin рдкреНрд▓рдЧрдЗрди рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реИред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
module.exports = {
рд╡рд╣ рдЬрд╛рджреВ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╛рдиреА рдЕрдм рд╣рдо рд╡реЗрдмрдкреИрдХ рдХреЛ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдардЧ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╣ рдЦреБрдж рд╕рдм рдХреБрдЫ рдХрд░реЗрдЧрд╛, рдФрд░ рд╣рдорд╕реЗ рднреА рдмреЗрд╣рддрд░ред
рдФрд░ рдЖрдирдВрдж рдЖрдПрдЧрд╛ред рдПрдХ рдЪреБрдЯрдХреБрд▓рд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ ...
рдмреБрдирд┐рдпрд╛рджреА рддреИрдпрд╛рд░реА
рдпрд╣рд╛рдБ рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
module.exports = { mode: 'development', entry: { index: './src/index.js', another: './src/another-module.js' }, output: { filename: '[name].bundle.js', path: path.resolve(__dirname, 'dist') }, optimization: { splitChunks: { chunks: 'all' } } };
рдЕрд╕реЗрдВрдмрд▓реА рдХрд╛ рдкрд░рд┐рдгрд╛рдо 3 рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрдЧрд╛: other.bundle.js, index.bundle.js, рд╡реЗрдВрдбрд░ ~ рдПрдХ рдФрд░ ~ index.bundle.js
Hash: ac2ac6042ebb4f20ee54 Version: webpack 4.7.0 Time: 316ms Asset Size Chunks Chunk Names another.bundle.js 5.95 KiB another [emitted] another index.bundle.js 5.89 KiB index [emitted] index vendors~another~index.bundle.js 547 KiB vendors~another~index [emitted] vendors~another~index Entrypoint index = vendors~another~index.bundle.js index.bundle.js Entrypoint another = vendors~another~index.bundle.js another.bundle.js [./node_modules/webpack/buildin/global.js] (webpack)/buildin/global.js 489 bytes {vendors~another~index} [built] [./node_modules/webpack/buildin/module.js] (webpack)/buildin/module.js 497 bytes {vendors~another~index} [built] [./src/another-module.js] 88 bytes {another} [built] [./src/index.js] 86 bytes {index} [built] + 1 hidden module
рдЕрдм, рд╣рдорд╛рд░реЗ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рд╡рд┐рдХреНрд░реЗрддрд╛рдУрдВ рдХреЛ ~ рдПрдХ рдФрд░ ~ index.bundle.js рдФрд░ index.bundle.js, рдФрд░ рджреВрд╕рд░реЗ рд╡рд┐рдХреНрд░реЗрддрд╛рдУрдВ ~ рджреВрд╕рд░реЗ ~ index.bundle.js рдФрд░ рдПрдХ рдЕрдиреНрдп рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред bundle.jsред
рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ?
рд╕рдорд╕реНрдпрд╛ рдирд╛рдо рд╡рд┐рдХреНрд░реЗрддрд╛рдУрдВ ~ рдПрдХ рдФрд░ ~ рд╕реВрдЪрдХрд╛рдВрдХ .bundle.js рд╣реИред рдЬрдм рддрдХ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреАрди рд╕реЗ рдХрдо рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИрдВ, рддрдм рддрдХ рдХреБрдЫ рднреА рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рддрд░реНрдХрд╕рдВрдЧрдд рд▓рдЧрддрд╛ рд╣реИ - рдмрдВрдбрд▓ рдореЗрдВ рдПрдирдкреАрдПрдо рдореЙрдбреНрдпреВрд▓ рд╣реЛрддреЗ рд╣реИрдВ (рд╡реЗ рднреА рд╡рд┐рдХреНрд░реЗрддрд╛ рд╣реИрдВ) рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдФрд░ рдЕрдиреНрдп рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдореЙрдбреНрдпреВрд▓ред рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдкрд░ рд╣рдо 2 рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреАрди рдпрд╛ рдЕрдзрд┐рдХ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИрдВ, рддреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирдП рдмрдВрдбрд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рд╡реЗ рдЪрдВрдХ рд╣реИрдВ) рдФрд░ рд╣рдо рдЕрдм рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдпрд╛ рдирд╛рдо рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рд╕рдм рдХреБрдЫ рдФрд░ рднреА рдордЬреЗрджрд╛рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЕрдЧрд░ рд╣рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рднреА рд╕реАрдПрд╕рдПрд╕ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред рдФрд░ рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд░реЗрдВ?
рд╡реЗрдмрдкреИрдХ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕реА рдХреЛрдИ рднреА рдлрд╛рдЗрд▓ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛ рдХрд┐ рдЗрд╕ рдпрд╛ рдЙрд╕ рдкреЗрдЬ рдкрд░ рдХреМрди рд╕реЗ рдмрдВрдбрд▓ рд╣реИрдВред рдФрд░ рдХрд┐рд╕ рдХреНрд░рдо рдореЗрдВред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд╣рдо рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
Entrypoint index = vendors~another~index.bundle.js index.bundle.js Entrypoint another = vendors~another~index.bundle.js another.bundle.js
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд▓рдЧрднрдЧ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рдпрд╛рдиреА webpack рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рдмрдВрдбрд▓реЛрдВ рдХреА рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЦреБрдж рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╣рдорд╛рд░реЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред
рдШреЛрд╖рдгрд╛ рдкрддреНрд░ рдпрд╣рд╛рдВ рд╣рдорд╛рд░реА рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рдБ, рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ (рд╡рд┐рдХреНрд░реЗрддрд╛рдУрдВ ~ рдПрдХ рдФрд░ ~ index.bundle.js) рдмрдВрдбрд▓ рд╣реИред рд╣рдореЗрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдХрд╣рд╛рдВ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХреА рдЬрд░реВрд░рдд рдХрд┐рд╕рдХреЛ рд╣реИред рдпрд╛рдиреА рдкреНрд░рдХрдЯ рдмреЗрдХрд╛рд░ рд╣реИред
рддрдм рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдЪреВрдВрдХрд┐ рд╡реЗрдмрдкреИрдХ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдЬрд╛рдирддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕рдВрднрд╡рддрдГ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдХреЛрдИ рддреИрдпрд╛рд░ рдирд╣реАрдВ рдорд┐рд▓рд╛ рдФрд░ рдореИрдВрдиреЗ рдЦреБрдж рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдФрд░, рдмрд╕ рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдпрд╣ рд▓реЗрдЦ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВред
import * as webpack from "webpack"; export interface IChunkDescription { readonly id: string | number; readonly name: string; readonly files: string[]; } export interface IEntrypointsPluginOptions { readonly filename: string; readonly replacer?: (key: string, value: any) => any; readonly space?: string | number; readonly filter?: (chunk: IChunkDescription) => boolean; } export default class EntrypointsPlugin { private readonly options: IEntrypointsPluginOptions; public constructor(options: IEntrypointsPluginOptions) { this.options = Object.assign<IEntrypointsPluginOptions, IEntrypointsPluginOptions>({ filename: "entrypoints.json", replacer: null, space: null, filter: null }, options); } public apply(compiler: webpack.Compiler): void { compiler.hooks.emit.tap("entrypoints", (compilation: webpack.compilation.Compilation) => { let data = {}; let entrypoints = {}; const filter = this.options.filter; const publicPath = compilation.compiler.options.output.publicPath; for (let [key, value] of compilation.entrypoints.entries()) { const chunks: IChunkDescription[] = value.chunks.map(data => { const chunk: IChunkDescription = { id: data.id, name: data.name, files: data.files }; return filter == null || filter(chunk) ? chunk : null; }); const files = ([] as string[]).concat(...chunks.filter(c => c != null) .map(c => c.files.map(f => publicPath + f))); const js = files.filter(f => /.js/.test(f) && !/.js.map/.test(f)); const css = files.filter(f => /.css/.test(f) && !/.css.map/.test(f)); let entrypoint = {}; if (js.length) entrypoint["js"] = js; if (css.length) entrypoint["css"] = css; data[key] = entrypoint; } const json = JSON.stringify(data, this.options.replacer, this.options.space); compilation.assets[this.options.filename] = { source: () => json, size: () => json.length }; }); } }
Webpack.configред (Ts | js) рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдПрдХ рдирдпрд╛ рдкреНрд▓рдЧрдЗрди рдЬреЛрдбрд╝реЗрдВ:
plugins: [ new EntrypointsPlugin({ filename: "entrypoints.json", space: 2 }) ]
рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ entrypoint.json рдлрд╝рд╛рдЗрд▓ рд╣реЛрдЧреА:
{ "index": { "js": ["vendors~another~index.bundle.js", "index.bundle.js"] }, "another": { "js": ["vendors~another~index.bundle.js", "another.bundle.js"] } }
рдпрджрд┐ рдЕрд░реНрдХ-рд╕реАрдПрд╕рдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЬреЗрдПрд╕ рдЕрдиреБрднрд╛рдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕реАрдПрд╕рдПрд╕ рднреА рд╣реЛрдЧрд╛ред
рдПрдЪрдЯреАрдПрдордПрд▓ рдкреЗрдЬ рдмрдирд╛рддреЗ рд╕рдордп рдЕрдВрддрд┐рдо рдЪреАрдЬ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрдиреА рд░рд╣рддреА рд╣реИ, рд╡рд╣ рд╣реИ рдПрдВрдЯреНрд░реАрдкреНрд╡рд╛рдЗрдВрдЯ.рдЬреЙрд╕рди рдлрд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдирд╛, рд╡рд╛рдВрдЫрд┐рдд рдПрдВрдЯреНрд░реА рдкреНрд╡рд╛рдЗрдВрдЯ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛, рдЬреЗрдПрд╕ рдФрд░ рд╕реАрдПрд╕рдПрд╕ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╕реВрдЪрд┐рдпреЛрдВ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ред
рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ
рдХреБрдЫ рдЗрд╕ рддрд░рд╣ред