4 Совета По Оптимизации Вашего Веб-Приложения

Всем привет! За время работы с вебпаком у меня накопилось пару интересных советов, которые помогут подготовить идеально оптимизированное приложение.

Давайте начнем!

4 совета по оптимизации вашего веб-приложения



1. Используйте fast-async вместо среды выполнения регенератора.

Обычно разработчики используют @babel/preset-env преобразовать весь современный синтаксис в ES5. С этой предустановкой конвейер преобразования асинхронной функции выглядит следующим образом: Исходная асинхронная функция -> Генератор -> Функция , с использованием время выполнения регенератора Пример 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); }); };

Благодаря этому теперь у нас нет regenerator-runtime на клиенте и ненужных трансформационных оберток.

Чтобы добавить fast-async в свой проект, вам необходимо: 1. Установите его

npm i fast-async

2. Обновите конфигурацию Babel

// .

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+.

Тогда все лишние накладные расходы можно устранить, включив свободные преобразования для Preset-env:

// .

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

*/ "loose": true, }] ], /* .

*/ }

Пример того, как это работает, можно найти здесь .

В моем проекте это уменьшило размер пакета на 3,8%.



3. Настройте минификацию js и css вручную.

Настройки минификаторов по умолчанию содержат только те преобразования, которые не могут ничего сломать программисту.

Но мы любим создавать себе проблемы, правда? Попробуйте прочитать настройки js минификатор и ваш минификатор CSS (я использую 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 }, }, }), ], }, }; /* .

*/

В результате размер js-файлов уменьшился на 1,5%, а css — на 2%.

Может быть, ты можешь лучше? UPD 11.01.2019 : UglifyJsPlugin устарел, в настоящее время используется веб-пакет TerserWebpackПлагин .

Используй это.



4. Используйте нулевой загрузчик, чтобы удалить ненужные зависимости.

От разработчиков gsap Получилась отличная библиотека для создания анимации.

Но в связи с тем, что он датирован 2008 годом, некоторые особенности в нем остались.

А именно Вот этот .

Благодаря этому TweenMax поставляется с 5 плагинами и easyPack, использовать которые совершенно необязательно.

Я заметил у себя три дополнительных плагина и вырезал их с помощью нулевой загрузчик :

// 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 кб превращаются в 86. Та-да! Null-loader также можно использовать для удаления ненужных полифилов, которые нам заботливо предоставили авторы библиотеки.

Теги: #Разработка веб-сайтов #JavaScript #Оптимизация клиента #webpack #оптимизация сайта #gsap #webpack 4 #fast-async #null-loader

Вместе с данным постом часто просматривают: