Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Задание №6: Оптимизация загрузки js на dev.to
Проблема: большой суммарный размер загружаемых на главной странице скриптов.
Цель: по размеру скриптов уложиться в бюджет в 460000 байт. Соотв., метрикой будет
transfer sizeдля всегоjavascriptна странице.Мониторинг и защита результата
Мониторинг метрики делаем с помощью сервиса sitespeed.io, развернутого в docker'е.
Для метрики задаём бюджет:
Для удобства опции вынесла в json-файл конфигурации, а саму команду в завернула в
binstub:На старте команда валится со значением метрики 1 036 964
Анализ проблемы
Точки роста ищем с помощью плагина
webpack-bundle-analyzer.Находка №1
Отчёт, построенный до всех оптимизаций, показывает, что самый большой по размеру файл скриптов –
vendor.js, а он состоит по большей части из библиотекиmoment.js.На самом деле, не так страшна сама библиотека, сколько файлы локализации, которые подключаются по умолчанию все. В нашем проекте интернационализация вообще не предусмотрена, поэтому смело можем выкинуть ненужное.
Решается добавлением плагина
webpack.IgnorePluginс соответствующими правилами в конфигурациюwebpack.Из нового отчёта
webpack-bundle-analyzerвидно, чтоmoment.jsпохудел до 147Kb (против 544Kb на старте) :Проверка sitespeed.io пока не проходит.
Находка №2
Сама по себе библиотека
moment.jsне используется в коде проекта, она идёт как зависимость библиотекиChart.js. В свою очередьChart.jsпосле предыдущей оптимизации вышла в лидеры по размеру внутри файлаvendor.js.Chart.jsимпортируется в единственный модульapp/javascript/packs/proCharts.js, который, в свою очередь, подключается только на одной странице – дэшборде пользователей со статусом PRO. Т.е. большинству пользователей не нужен. А тем, кому нужен, – не на главной)Возможное решение – исключить
chart.jsиmoment.jsиз файлаvendor.js, перегруппировавchunks(изменив конфигwebpack.optimize.CommonsChunkPlugin).На отчёте видно, что
Chart.jsиmoment.jsобъединились в один чанк с использующим их модулем, и он у нас будет подключаться только в одинpartial, а размерvendor.jsстал ещё меньше:Результат
Теперь в бюджет укладываемся:

Coverage report в Chrome Devtools показывает, что
vendor.jsтеперь содержит только 13% неиспользуемого кода (против 72% на старте):Ссылка на сравнение отчётов sitespeed.io до и после оптимизации:
https://compare.sitespeed.io/?gist=0aac59baf60a91bf3265d81fbb567a1e