рдЕрдкрдиреЗ рд╡реЗрдмрдкреИрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 4 рдЯрд┐рдкреНрд╕

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!

рд╡реЗрдмрдкреИрдХ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди, рдореИрдВрдиреЗ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдпреБрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдЪрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред рдЪрд▓реЛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдУ!

рдлреНрд░рдВрдЯ-рдПрдВрдб рдХреИрдЯ рдиреЗ рд╡реЗрдмрдкреИрдХ рджреЗрдЦрд╛ рдФрд░ рдХрд╣рд╛ 'рдмреЗрд▓рд┐рд╕рд┐рдореЛ'



1. рд░реАрдЬреЗрдирд░реЗрдЯрд░-рд░рдирдЯрд╛рдЗрдо рдХреЗ рдмрдЬрд╛рдп рдлрд╛рд╕реНрдЯ-рдПрд╕рд┐рдВрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдЖрдорддреМрд░ рдкрд░, рдбреЗрд╡рд▓рдкрд░ рд╕рднреА рдЖрдзреБрдирд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ ES5 рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП @ babel / preset-env рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рдкреВрд░реНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреЗ рд╕рд╛рде, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:
рд╕реНрд░реЛрдд рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдлрд╝рдВрдХреНрд╢рди -> рдЬрдирд░реЗрдЯрд░ -> рдкреБрдирд░реНрдпреЛрдЬреА-рд░рдирдЯрд╛рдЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди

рдЙрджрд╛рд╣рд░рдг
1. рдореВрд▓ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдорд╛рд░реЛрд╣

const test = async () => { await fetch('/test-api/', { method: 'GET' }); } 

2. рдЬрдирдХ

 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } const test = (() => { var _ref = _asyncToGenerator(function* () { yield fetch('/test-api/', { method: 'GET' }); }); return function test() { return _ref.apply(this, arguments); }; })(); 

3. рдкреБрдирд░реНрдпреЛрдЬреА-рд░рдирдЯрд╛рдЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди

 'use strict'; function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var test = function () { var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return fetch('/test-api/', { method: 'GET' }); case 2: case 'end': return _context.stop(); } } }, _callee, undefined); })); return function test() { return _ref.apply(this, arguments); }; }(); 


рдлрд╛рд╕реНрдЯ-рдПрд╕рд┐рдВрдХреНрд╕ рдХреЗ рд╕рд╛рде, рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЛ рд╕рд░рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рд╕реНрд░реЛрдд рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдорд╛рд░реЛрд╣ -> рд╡рд╛рджреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдорд╛рд░реЛрд╣

рдЙрджрд╛рд╣рд░рдг
1. рдореВрд▓ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдорд╛рд░реЛрд╣

 const test = async () => { await fetch('/test-api/', { method: 'GET' }); } 

2. рд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдорд╛рд░реЛрд╣

 var test = function test() { return new Promise(function ($return, $error) { return Promise.resolve(fetch('/test-api/', { method: 'GET' })).then(function ($await_1) { try { return $return(); } catch ($boundEx) { return $error($boundEx); } }, $error); }); }; 


рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдкреБрдирд░реНрдпреЛрдЬреА-рд░рдирдЯрд╛рдЗрдо рдирд╣реАрдВ рд╣реИ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрд╡рд░рдг рд╣реИрдВред

рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рддреЗрдЬрд╝-рдПрд╕реНрдХрд┐рдВрдЯ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

1. рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ

 npm i fast-async 

2. рдХреЛрд▓рд╛рд╣рд▓ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдЕрджреНрдпрддрди рдХрд░реЗрдВ

 // .babelrc.js module.exports = { "presets": [ ["@babel/preset-env", { /* ... */ "exclude": ["transform-async-to-generator", "transform-regenerator"] }] ], /* ... */ "plugins": [ ["module:fast-async", { "spec": true }], /* ... */ ] } 

рдореЗрд░реЗ рд▓рд┐рдП, рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдиреЗ js рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЖрдХрд╛рд░ 3.2% рдШрдЯрд╛ рджрд┐рдпрд╛ред рдПрдХ рддрд┐рдкрд╣рд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЕрдЪреНрдЫрд╛ :)

2. рдвреАрд▓реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рд╡рд┐рд╢реЗрд╖ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдмрд┐рдирд╛, @ babel / preset-env рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рдВрднрд╡ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред

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

 // .babelrc.js module.exports = { "presets": [ ["@babel/preset-env", { /* ... */ "loose": true, }] ], /* ... */ } 

рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ ред

рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдЗрд╕ рдмрдВрдбрд▓ рдХрд╛ рдЖрдХрд╛рд░ 3.8% рдХрдо рд╣реЛ рдЧрдпрд╛ред

3. рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдЬреЗрдПрд╕ рдФрд░ рд╕реАрдПрд╕рдПрд╕ рдорд┐рдирд┐рдлрд┐рдХреЗрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ


рдордВрддреНрд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдХреЗрд╡рд▓ рд╡реЗ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рддреЛрдбрд╝рд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ред рд▓реЗрдХрд┐рди рд╣рдо рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдкреНрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ?
рдЬреЗрдПрд╕ рдорд┐рдирд┐рдлрд╛рдпрд░ рдФрд░ рдЕрдкрдиреЗ рд╕реАрдПрд╕рдПрд╕ рдорд┐рдирд┐рдлрд╛рдпрд░ (рдореИрдВ cssnano рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ) рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрдврд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред

рдбреЙрдХреНрд╕ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдпрд╣ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд┐рдпрд╛:

 // webpack.config.js const webpackConfig = { /* ... */ optimization: { minimizer: [ new UglifyJsPlugin({ uglifyOptions: { compress: { unsafe: true, inline: true, passes: 2, keep_fargs: false, }, output: { beautify: false, }, mangle: true, }, }), new OptimizeCSSPlugin({ cssProcessorOptions: { "preset": "advanced", "safe": true, "map": { "inline": false }, }, }), ], }, }; /* ... */ 

рдирддреАрдЬрддрди, рдЬреЗрдПрд╕ рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдЖрдХрд╛рд░ 1.5%, рдФрд░ рд╕реАрдПрд╕рдПрд╕ - 2% рдХрдо рд╣реЛ рдЧрдпрд╛ред

рд╢рд╛рдпрдж рдЖрдк рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

UPD 01/11/2019: UglifyJsPlugin рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡реЗрдмрдкреИрдХ рдЕрдм TerserWebpackPlugin рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

4. рдЕрдирд╛рд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд▓-рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


Gsap рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдкрд╛рд╕ рдПрдирд┐рдореЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрд╣рддрд░реАрди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред рд▓реЗрдХрд┐рди 2008 рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЗрд╕рдореЗрдВ рдмрдиреА рд░рд╣реАрдВред

рдЕрд░реНрдерд╛рддреН , рдпрд╣ рдПрдХ ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЯреНрд╡реАрдирдореИрдХреНрд╕ 5 рдкреНрд▓рдЧрдЗрдиреНрд╕ рдФрд░ рдИрдЬрд╝реАрдкреИрдХ рдЦреАрдВрдЪрддрд╛ рд╣реИ, рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИрдВред

рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЕрдВрджрд░ рддреАрди рдирд┐рд░рд░реНрдердХ рдкреНрд▓рдЧ рджреЗрдЦреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдирд▓-рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рдЯ рджрд┐рдпрд╛:

 // webpack.config.js const ignoredGSAPFiles = ['BezierPlugin', 'DirectionalRotationPlugin', 'RoundPropsPlugin']; const webpackConfig = { /* ... */ module: { rules: [ /* ... */ { test: /\.js$/, include: ignoredGSAPFiles.map(fileName => resolve('node_modules/gsap/' + fileName)), loader: 'null-loader', }, ] }, }; /* ... */ 

рдФрд░ 106 kb 86 рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ред рд╣рд╛рдБ!

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

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


All Articles