Webpack 4 рдФрд░ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдЖрдЬ рдореИрдВ рдЖрдкрдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХреЛрдб рдХреЗ рдкреГрдердХреНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╣реА рд╡реЗрдмрдкреИрдХ 4 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛, рд╕рд╛рде рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рд╕рдорд╛рдзрд╛рди рдЬреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╡реЗрдмрдкреИрдХ 4 рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рддреЗрдЬреА рд╕реЗ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЕрдкрдиреЗ рдореВрд▓ рд╡реЗрдмрдкреИрдХ рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рд╕рдмрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░реВрдВрдЧрд╛, рдЬрд┐рд╕реЗ рдЖрдк рдмрд╛рдж рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдЕрд╕реЗрдВрдмрд▓реА рдЖрдкрдХреЛ рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреА, рдФрд░ рдпрд╣ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рддреЗрдЬрд╝реА рд╕реЗ рд▓рд┐рдЦрдиреЗ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рддреЗрдЬрд╝реА рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рднреА рдорджрдж рдХрд░ рд╕рдХрддреА рд╣реИред

рдЗрд╕ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреА рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛ webpack.config.js рдХреЗ рдЙрдкрдпреЛрдЧ, рдкрдврд╝рдиреЗ рдФрд░ рд╕рдлрд╛рдИ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ рдХреЛрдб рдХрд╛ рд╕рд╣реА рдкреГрдердХреНрдХрд░рдг рд╣реИред рджреЗрд╡ рдФрд░ рдареЗрд╕ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдореЙрдбреНрдпреВрд▓ рдФрд░ рдкреНрд▓рдЧрдЗрдиреНрд╕ (рд╕рд╛рде рд╣реА рдореБрдЦреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдкреГрдердХреНрдХрд░рдг рдХреЗ рд▓рд┐рдП) рдПрдХ рдЕрд▓рдЧ рд╡реЗрдмрдкреИрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдореБрдЦреНрдп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?


рдореЙрдбреНрдпреВрд▓, рдкреНрд▓рдЧ-рдЗрди, рдЖрджрд┐ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдзреАрд░реЗ-рдзреАрд░реЗ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде, рдЬреЛ рдЖрдкрдХреА рдЕрд╕реЗрдВрдмрд▓реА рд╡реЗрдмрдкреИрдХ рдкрд░ рдмрдирд╛рддрд╛ рд╣реИ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд▓реАрдкреНрд╕ рдФрд░ рд╕реАрдорд╛ рд╕реЗ рдмрдврд╝рддреА рд╣реИред рд╕рдордп рдХреЗ рд╕рд╛рде, рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдмрджрд▓рдирд╛, рдЕрдЧрд░ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдХреБрдЫ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдХреЛрдб рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдЧрдарди рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП?


рд╣рдо рд╡реЗрдмрдкреИрдХ-рдорд░реНрдЬ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рд╣рдо рд╡реЗрдмрдкреИрдХ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, webpack / pug.js, webpack / scss.js рдФрд░ рдЙрдирд╕реЗ рдпреЗ рдХрд╛рд░реНрдп рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВред

Pug.js рдлрд╝рд╛рдЗрд▓

module.exports = function() { return { module: { rules: [ { test: /\.pug$/, loader: 'pug-loader', options: { pretty: true, }, }, ], }, }; }; 

Webpack.config.js рдлрд╝рд╛рдЗрд▓ ред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреА рдорджрдж рд╕реЗ рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрддреЗ рд╣реИрдВред

 const merge = require('webpack-merge'); const pug = require('./webpack/pug'); const common = merge([ { entry: { 'index': PATHS.source + '/pages/index/index.js', 'blog': PATHS.source + '/pages/blog/blog.js', }, output: { path: PATHS.build, filename: './js/[name].js', }, plugins: [тАж], optimization: { тАж }, }, pug(), ]); 

рдЕрдм, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдирдпрд╛ рдХрд╛рд░реНрдп рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдирдпрд╛ рдореЙрдбреНрдпреВрд▓, рдкреНрд▓рдЧ-рдЗрди, рд▓реЛрдбрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рд╣реЛрдЯрд▓ рдореЙрдбреНрдпреВрд▓ (рдлрд╝рд╛рдЗрд▓) рдореЗрдВ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╡реЗрдмрдкреИрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдореБрдЦреНрдп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗред

рдЙрддреНрдкрд╛рджрди рдФрд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕


рдЕрдм, рдпрджрд┐ рд╣рдо рдЗрд╕ рдЕрд▓рдЧрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рддреЛ рд╣рдо рдЕрдкрдиреЗ рдЕрд▓рдЧрд╛рд╡ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдВрдЧреЗ, рдФрд░ рдЗрди рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╡реЗрдмрдкреИрдХ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рд╕реЗ рдЗрд╕ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрдд рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛, рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рднреА рд╣рдо рдЗрд╕реЗ рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рдкрд╛рдПрдВрдЧреЗред рдпрд╛ рд╡рд░реНрддрдорд╛рди рдПрдХ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ред рд╡реЗрдмрдкреИрдХ 4 рдореЗрдВ рдиреЛрдб (рд╡реЗрдмрдкреИрдХ рдХреЗ рд▓рд┐рдП) рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

 module.exports = function(env, argv) { if (argv.mode === 'production') { return merge([ common, extractCSS(), favicon(), ]); } if (argv.mode === 'development') { return merge([ common, devserver(), sass(), css(), sourceMap(), ]); } 

рд╕рд╛рдорд╛рдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ, рд╣рдо рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдареЗрд╕ рдФрд░ рд╡рд┐рдХрд╛рд╕ рджреЛрдиреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╢рд░реНрддреЛрдВ рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рдЙрди рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред

рдЕрдм рдореИрдВ webpack 3 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ webpack 4 рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛


  • рдПрдХ рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, webpack 4 рдХреЛ webpack.config.js рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЕрдм рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ (index.js) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
  • рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╡реЗрдмрдкреИрдХ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдХ рдЕрд▓рдЧ рдкреИрдХреЗрдЬ рдореЗрдВ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рд╡реЗрдмрдкреИрдХ-рдХреНрд▓реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  • рд╡реЗрдмрдкреИрдХ 4 рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ (рдЕрдиреНрдпрдерд╛ рдпрд╣ рдЪреЗрддрд╛рд╡рдиреА рд╣реЛрдЧреА) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдореЛрдб (рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рддрд░реАрдХрд╛) - рдореЛрдб рдЙрддреНрдкрд╛рджрди рдпрд╛ - рдореЛрдб рд╡рд┐рдХрд╛рд╕, рдХреБрдВрдЬреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╡реЗрдмрдкреИрдХ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдмрджрд▓рддрд╛ рд╣реИред рд╡рд┐рдХрд╛рд╕ рдореЛрдб рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдмрд┐рд▓реНрдб рдХреЛ рдЧрддрд┐ рджреЗрдирд╛ рд╣реИред рдЙрддреНрдкрд╛рджрди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╕рдм рдХреБрдЫ рдХреЛрдб рдХреЗ рдЕрдВрддрд┐рдо рд╕рдВрд╢реЛрдзрди рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рд╣реИред
  • рд╕рд╛рдорд╛рдиреНрдп.js рдФрд░ common.css рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, CommonsChunkPlugin рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд▓рд┐рдЯрдХреЙрдиреНрдЪ рдЕрдм рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ рдФрд░ рдирд┐рдореНрди рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

      optimization: { splitChunks: { cacheGroups: { 'common': { minChunks: 2, chunks: 'all', name: 'common', priority: 10, enforce: true, }, }, }, }, 

    рд╡реЗрдмрдкреИрдХ 3 рдореЗрдВ - рдпрд╣ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдореЗрдВ рдРрд╕рд╛ рд╣реЛрдЧрд╛:

     new webpack.optimize.CommonsChunkPlugin({ name: 'common ', }) 

    рддрджрдиреБрд╕рд╛рд░, HtmlWebpackPlugin рдореЗрдВ рд╡рд┐рдЦрдВрдбреВ рдореЗрдВ рд╣рдо рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ (рдпрд╣рд╛рдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд┐рдирд╛)ред

     plugins: [ new HtmlWebpackPlugin({ filename: 'index.html', chunks: ['index', 'common'], template: PATHS.source + '/pages/index/index.pug', }), ], 

  • рдЕрдЧрд▓рд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ, рд╕реЛрд░реНрд╕рдкрд╛рдЗрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдм рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рд╡реЗрдмрдкреИрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ sourceMap.js рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рджреЗрд╡ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ):

     module.exports = function() { return { devtool: 'eval-sourcemap', }; }; 

рдЕрдм рдкреНрд▓рдЧрдЗрдиреНрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг : [рдирдпрд╛ webpack.optimize.UglifyJsPlugin ({})] рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рд╕рд╛рде, рдореИрдВ рдЕрдкрдиреА рдХрд╣рд╛рдиреА рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЕрдкрдиреА рдореВрд▓ рд╕рднрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рд╡реЗрдмрдкреИрдХ 4 рдХрд╛ рд▓рд┐рдВрдХ , рдЬреЛ рд╢рд╛рдпрдж рдЖрдкрдХреЗ рдХрд╛рдо рдФрд░ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдЖрдкрдХреА рдорджрдж рдХрд░реЗрдЧрд╛ред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

Source: https://habr.com/ru/post/hi422697/


All Articles