рдореЙрдбрд░реНрди рдмрд┐рд▓реНрдб рдмрдирд╛рдирд╛

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░!

рдкреНрд░рддреНрдпреЗрдХ рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЕрдм рдЖрдкрдХреЛ ES6 рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

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

рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдПрдХ рдХрд╣рд╛рдиреА рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдореИрдВ рдкреБрд░рд╛рдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдФрд░ рдореЗрд░реА рдирд╕реЛрдВ рдХреЗ рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рдХреЗ рдмрд┐рдирд╛ рдЖрд╡реЗрджрди рдХреЗ рдЖрдХрд╛рд░ рдХреЛ 11% рддрдХ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред



ES6 рдореЙрдбреНрдпреВрд▓ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ


ES6 рдореЙрдбреНрдпреВрд▓ рд╕рднреА рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдФрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдореЙрдбреНрдпреВрд▓рд░ рд╕рд┐рд╕реНрдЯрдо рд╣реИ:

/* someFile.js */ import { someFunc } from 'path/to/helpers.js' 

 /* helpers.js */ export function someFunc() { /* ... */ } 

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

 <!--        ES6 Modules --> <script type="module" src="/path/to/someFile.js"></script> 

рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреИрдЧ рдХреЗ рд▓рд┐рдП рдирд╛рдорд╛рдВрдХрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рднреА рд╣реЛрддреА рд╣реИред ES6 рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдкреБрд░рд╛рдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЗрд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВрдЧреЗред

 <!--       --> <script nomodule src="/path/to/someFileFallback.js"></script> 

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

 <script type="module" src="/path/to/someFile.js"></script> <script nomodule src="/path/to/someFileFallback.js"></script> 

рдХреНрдпреЛрдВ рдЬрд░реВрд░реА рд╣реИ?


рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП:

  • рдкреЙрд▓реАрдлрд┐рд▓реНрд╕ рдЬреЛрдбрд╝реЗрдВред
  • рдПрдХ рдкреБрд░рд╛рдиреЗ рд╕реЗ рдЖрдзреБрдирд┐рдХ рдХреЛрдб рдЯреНрд░рд╛рдВрд╕рдЬреЗрдВрдб рдХрд░реЗрдВред

рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ, рдореИрдВ рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рдХрднреА-рдХрднреА IE 10 рднреАред рдЗрд╕рд▓рд┐рдП, рдкреЙрд▓реАрдлрд╝рд╛рдЗрд▓реНрд╕ рдХреА рдореЗрд░реА рд╕реВрдЪреА рдореЗрдВ рдРрд╕реА рдмреБрдирд┐рдпрд╛рджреА рдЪреАрдЬреЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреИрд╕реЗ es6.promise, es6.object.values, рдЖрджрд┐ред рд▓реЗрдХрд┐рди ES6 рдореЙрдбреНрдпреВрд▓ рд╡рд╛рд▓реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рднреА ES6 рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рд╡рд╛рд╖реНрдкреЛрддреНрд╕рд░реНрдЬрди рдлрд╝рд╛рдЗрд▓ рдЖрдХрд╛рд░ рдкрд░ рдПрдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдирд┐рд╢рд╛рди рднреА рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ: рдмреЗрдмрд▓ / рдкреНрд░реАрд╕реЗрдЯ-рдПрдирд╡реА рд╕рдмрд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 25 рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛрдб рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, ES6 рдореЙрдбреНрдпреВрд▓ рд╕рдорд░реНрдерди рд╡рд╛рд▓реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдХреА рд╕рдВрдЦреНрдпрд╛ 9 рддрдХ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред

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

рдкреЙрд▓реАрдлрд╝рд╛рдЗрд▓реНрд╕ рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВ


рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдореЙрдбрд░реНрди рдмрд┐рд▓реНрдб рддреИрдпрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдореИрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХреИрд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВред



рдЖрдорддреМрд░ рдкрд░, рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрд░-рдЬреЗрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВред

рдмреЗрд╢рдХ, рдЖрдк рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд╕рднреА 88 Kbytes polyfiles рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╡реЗ рдЬреЛ рдЖрдкрдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ babel / preset-env рдФрд░ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЙрдкрд▓рдмреНрдз рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрд░-рдЬреЗрдПрд╕ рдХреЗ рдЖрдпрд╛рдд рдХреЛ рдЖрдкрдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд╛рд▓реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЖрдпрд╛рдд рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

 /* .babelrc.js */ module.exports = { presets: [ ['@babel/preset-env', { useBuiltIns: 'entry', /* ... */ }] ], /* ... */ }; 

 /*   */ import 'core-js'; 

 /*   */ import "core-js/modules/es6.array.copy-within"; import "core-js/modules/es6.array.fill"; import "core-js/modules/es6.array.find"; /*   -  */ 

рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рд╣рдореЗрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдмрд╣реБрдд рдкреБрд░рд╛рдиреА рдкреЙрд▓реАрдлрд┐рд▓реНрд╕ рдХреЗ рдХреЗрд╡рд▓ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓рд╛ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдЯрд╛рдЗрдкреЗрдб рдПрд░реЗ, рд╡реАрдХрдПрдк рдФрд░ рдЕрдиреНрдп рдЕрдЬреАрдм рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, useBuiltIns рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ, рдмреИрдмреЗрд▓ / рдкреНрд░реАрд╕реЗрдЯ-рдПрдирд╡ рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдЧрд╛ рдЬреЛ рдЪрдпрдирд┐рдд рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рдкреЙрд▓реАрдлрд╝рд╛рдЗрд▓реНрд╕ рдЬреЛрдбрд╝реЗрдВ:

 /* .babelrc.js */ module.exports = { presets: [ ['@babel/preset-env', { useBuiltIns: 'usage', /* ... */ }] ], /* ... */ }; 

 /*   */ function sortStrings(strings) { return strings.sort(); } function createResolvedPromise() { return Promise.resolve(); } 

 /*   */ import "core-js/modules/es6.array.sort"; import "core-js/modules/es6.promise"; function sortStrings(strings) { return strings.sort(); } function createResolvedPromise() { return Promise.resolve(); } 

рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдмреИрдмреЗрд▓ / рдкреНрд░реАрд╕реЗрдЯ-рдПрдирд╡ рдиреЗ рд╕реЙрд░реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрд▓реАрдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝рд╛ред рдЖрдк рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ - рдпрд╣ рдПрдХ рд╕рд░рдгреА рдпрд╛ рдПрдХ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд╕реЙрд░реНрдЯ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдмреИрдмреЗрд▓ / рдкреНрд░реАрд╕реЗрдЯ-рдПрдирд╡ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдкреЙрд▓реАрдлрд╛рдЗрд▓ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред

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

 /* .babelrc.js */ module.exports = { presets: [ ['@babel/preset-env', { useBuiltIns: 'usage', //   ,  ,     debug: true, //      exclude: ['es6.regexp.to-string', 'es6.number.constructor'], /* ... */ }] ], /* ... */ }; 

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

рдореЙрдбрд░реНрди рдмрд┐рд▓реНрдб рдмрдирд╛рдПрдВ


рдЪрд▓рд┐рдП рдореЙрдбрд░реНрди рдмрд┐рд▓реНрдб рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реВрдЪреА рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬреЛ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИ:

 /* .browserslistrc */ > 0.5% IE 10 

рдмрд┐рд▓реНрдб рдХреЗ рджреМрд░рд╛рди BROWSERS_ENV рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдорд╛рдиреЛрдВ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдлрд╝реЙрд▓рдмреИрдХ рдмрд┐рд▓реНрдб рдХреЗ рд▓рд┐рдП) рдФрд░ рдЖрдзреБрдирд┐рдХ (рдореЙрдбрд░реНрди рдмрд┐рд▓реНрдб рдХреЗ рд▓рд┐рдП):

 /* package.json */ { "scripts": { /* ... */ "build": "NODE_ENV=production webpack /.../", "build:fallback": "BROWSERS_ENV=fallback npm run build", "build:modern": "BROWSERS_ENV=modern npm run build" }, /* ... */ } 

рдЕрдм babel / preset-env рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрджрд▓реЗрдВред рдкреВрд░реНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рд▓рдХреНрд╖реНрдп рд╣реИред рдЙрд╕рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рд╣реИ - рдПрд╕рдореЛрдбреНрдпреВрд▓реНрд╕ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдмреИрдмрд▓ / рдкреНрд░реАрд╕реЗрдЯ-рдПрдирд╡реА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрди рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░реЗрдЧрд╛ рдЬреЛ рдИрдПрд╕ 6 рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред

 /* .babelrc.js */ const isModern = process.env.BROWSERS_ENV === 'modern'; module.exports = { presets: [ ['@babel/preset-env', { useBuiltIns: 'usage', //  Modern Build     ES6 modules, //   Fallback Build     .browsersrc targets: isModern ? { esmodules: true } : undefined, /* ... */ }] ], /* ... */ ], }; 

рдмрд╛рдмреЗрд▓ / рдкреНрд░реАрд╕реЗрдЯ-рдПрдирд╡реА рдЖрдЧреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛: рдпрд╣ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдкреЙрд▓реАрдлрд╛рдЗрд▓реНрд╕ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдЧрд╛ред

рдЕрдм рд╣рдо рдЖрдзреБрдирд┐рдХ рдпрд╛ рдкреБрд░рд╛рдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░реНрд╕ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реЛрд▓ рд╕реЗ рд╕рд┐рд░реНрдл рдПрдХ рдХрдорд╛рдВрдб рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ!

рдмрд┐рдВрдж рдореЙрдбрд░реНрди рдФрд░ рдлреЙрд▓рдмреИрдХ рдмрд┐рд▓реНрдб


рдЕрдВрддрд┐рдо рдЪрд░рдг рдореЗрдВ рдореЙрдбрд░реНрди рдФрд░ рдлрд╛рд▓рдмреИрдХ рдмрд┐рд▓реНрдбреНрд╕ рдХреЛ рдПрдХ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реИред

рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ:

 //     dist/ //  html- index.html //   Modern Build' modern/ ... //   Fallback Build' fallback/ ... 

Index.html рдореЗрдВ рджреЛрдиреЛрдВ рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдВрдХ рд╣реЛрдВрдЧреЗ:

 /* index.html */ <html> <head> <!-- ... --> </head> <body> <!-- ... --> <script type="module" src="/modern/js/app.540601d23b6d03413d5b.js"></script> <script nomodule src="/fallback/js/app.4d03e1af64f68111703e.js"></script> </body> </html> 

рдЗрд╕ рдЪрд░рдг рдХреЛ рддреАрди рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  1. рдмрд┐рд▓реНрдб рдореЙрдбрд░реНрди рдПрдВрдб рдлреЙрд▓рдмреИрдХ рдмрд┐рд▓реНрдб рдбрд┐рдлрд░реЗрдВрдЯ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрдЬрд╝ рдореЗрдВред
  2. рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд░рд╛рд╕реНрддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред
  3. рд╕рднреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде index.html рдмрдирд╛рдирд╛ред

рдЪрд▓реЛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдУ!

рдмрд┐рд▓реНрдб рдореЙрдбрд░реНрди рдПрдВрдб рдлреЙрд▓рдмреИрдХ рдмрд┐рд▓реНрдб рдбрд┐рдлрд░реЗрдВрдЯ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрдЬрд╝ рдореЗрдВ


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдХрджрдо рдЙрдард╛рдПрдВ - рд╣рдо рдбрд┐рд╕реНрдЯрд░реНрдм рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЗ рдЕрдВрджрд░ рдореЙрдбрд░реНрди рдФрд░ рдлреЙрд▓рдмреИрдХ рдмрд┐рд▓реНрдб рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВрдЧреЗред

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

рдлрд╝рд╛рдЗрд▓ рдкрде рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдп рдмрдирд╛рдПрдБ:

 /* getFilePath.js */ /*   ,       */ const path = require('path'); const isModern = process.env.BROWSERS_ENV === 'modern'; const prefix = isModern ? 'modern' : 'fallback'; module.exports = relativePath => ( path.join(prefix, relativePath) ); 

 /* webpack.prod.config.js */ const getFilePath = require('path/to/getFilePath'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); module.exports = { mode: 'production', output: { path: 'dist', filename: getFilePath('js/[name].[contenthash].js'), }, plugins: [ new MiniCssExtractPlugin({ filename: getFilePath('css/[name].[contenthash].css'), }), /* ... */ ], /* ... */ } 

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЙрдбрд░реНрди рдФрд░ рдлреЙрд▓рдмреИрдХ рдмрд┐рд▓реНрдб рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдЗрдХрдЯреНрдард╛ рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реБрдЖред

рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд░рд╛рд╕реНрддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛


рдПрдХрддреНрд░рд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡реЗрдмрдкреИрдХ-рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ-рдкреНрд▓рдЧрдЗрди рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рдЕрдВрдд рдореЗрдВ, рд╡рд╣ рдкрдереЛрдВ рдкрд░ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдореЗрдирд┐рдлрд╝реЗрд╕реНрдЯред Json рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝ рджреЗрдЧрд╛:

 /* webpack.prod.config.js */ const getFilePath = require('path/to/getFilePath'); const WebpackManifestPlugin = require('webpack-manifest-plugin'); module.exports = { mode: 'production', plugins: [ new WebpackManifestPlugin({ fileName: getFilePath('manifest.json'), }), /* ... */ ], /* ... */ } 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХрддреНрд░рд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ:

 /* manifest.json */ { "app.js": "/fallback/js/app.4d03e1af64f68111703e.js", /* ... */ } 

рд╕рднреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде index.html рдмрдирд╛рдирд╛


рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рд╣реИ index.html рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдЙрд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкрде рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ред

Html рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдореЙрдбрд░реНрди рдмрд┐рд▓реНрдб рдХреЗ рджреМрд░рд╛рди html-webpack-plugin рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдБрдЧрд╛ред Html-webpack-plugin рдЖрдзреБрдирд┐рдХ рдлрд╛рдЗрд▓реНрд╕ рдореЗрдВ рд╣реА рдкрде рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдЧрд╛, рдФрд░ рдореИрдВ рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдлрд╝реЙрд▓рдмреИрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрде рдкреНрд░рд╛рдкреНрдд рдХрд░реВрдБрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЫреЛрдЯреЗ рд╡реЗрдмрдкреИрдХ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ HTML рдореЗрдВ рдкреЗрд╕реНрдЯ рдХрд░реВрдБрдЧрд╛:

 /* webpack.prod.config.js */ const HtmlWebpackPlugin = require('html-webpack-plugin'); const ModernBuildPlugin = require('path/to/ModernBuildPlugin'); module.exports = { mode: 'production', plugins: [ ...(isModern ? [ //  html-  Modern Build new HtmlWebpackPlugin({ filename: 'index.html', }), new ModernBuildPlugin(), ] : []), /* ... */ ], /* ... */ } 

 /* ModernBuildPlugin.js */ // Safari 10.1    nomodule. //      Safari   . //    : // https://gist.github.com/samthor/64b114e4a4f539915a95b91ffd340acc const safariFix = '!function(){var e=document,t=e.createE/* ...   ... */'; class ModernBuildPlugin { apply(compiler) { const pluginName = 'modern-build-plugin'; //    Fallback Build const fallbackManifest = require('path/to/dist/fallback/manifest.json'); compiler.hooks.compilation.tap(pluginName, (compilation) => { //    html-webpack-plugin, //      HTML compilation.hooks.htmlWebpackPluginAlterAssetTags.tapAsync(pluginName, (data, cb) => { //  type="module"  modern- data.body.forEach((tag) => { if (tag.tagName === 'script' && tag.attributes) { tag.attributes.type = 'module'; } }); //    Safari data.body.push({ tagName: 'script', closeTag: true, innerHTML: safariFix, }); //  fallback-   nomodule const legacyAsset = { tagName: 'script', closeTag: true, attributes: { src: fallbackManifest['app.js'], nomodule: true, defer: true, }, }; data.body.push(legacyAsset); cb(); }); }); } } module.exports = ModernBuildPlugin; 

рдЕрджреНрдпрддрди рдкреИрдХреЗрдЬред

 /* package.json */ { "scripts": { /* ... */ "build:full": "npm run build:fallback && npm run build:modern" }, /* ... */ } 

Npm рд░рди рдмрд┐рд▓реНрдб: рдлреБрд▓ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдореЙрдбрд░реНрди рдФрд░ рдлреЙрд▓рдмреИрдХ рдмрд┐рд▓реНрдб рдХреЗ рд╕рд╛рде рдПрдХ html рдлрд╛рдЗрд▓ рдмрдирд╛рдПрдВрдЧреЗред рдХреЛрдИ рднреА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЕрдм рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред

рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЖрдзреБрдирд┐рдХ рдирд┐рд░реНрдорд╛рдг рдЬреЛрдбрд╝реЗрдВ


рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░ рдореЗрд░реЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдкрдиреА рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯ рдХрд░рдирд╛ рдореБрдЭреЗ рдПрдХ рдШрдВрдЯреЗ рд╕реЗ рднреА рдХрдо рд╕рдордп рд▓рдЧрд╛, рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЖрдХрд╛рд░ 11% рдХрдо рд╣реЛ рдЧрдпрд╛ред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╢рд╛рдирджрд╛рд░ рдкрд░рд┐рдгрд╛рдоред

рд▓реЗрдЦ рдХреЛ рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛


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


All Articles