Как оптимизировать время сборки веб-пакета с помощью инструмента prefetchPlugin & analysis?

96

Прошлое исследование:

Как говорится в wiki webpack, можно использовать инструмент анализа для оптимизации производительности сборки:

из: https://github.com/webpack/docs/wiki/build-performance#hints-from-build-stats

Подсказки от статистики сборки

Существует инструмент анализа, который визуализирует вашу сборку, а также дает некоторые подсказки, как можно оптимизировать размер сборки и производительность сборки .

Вы можете создать требуемый файл JSON, запустив webpack --profile --json> stats.json.


Я сгенерировал файл статистики ( доступен здесь ), загрузил его в инструмент анализа webpack,
и на вкладке « Подсказки » я сказал использовать prefetchPlugin:

из: http://webpack.github.io/analyse/#hints

Длинные цепочки сборки модулей

Используйте предварительную выборку для повышения производительности сборки. Предварительно извлеките модуль из середины цепочки .


Я покопался в сети наизнанку, чтобы найти единственную документацию, доступную на prefechPlugin:

из: https://webpack.js.org/plugins/prefetch-plugin/

PrefetchPlugin

new webpack.PrefetchPlugin([context], request)

Запрос на обычный модуль, который решается и строится еще до того, как к нему поступит запрос. Это может повысить производительность. Попробуйте сначала профилировать сборку, чтобы определить разумные точки предварительной выборки .



Мои вопросы:

  • Как правильно использовать prefetchPlugin?
  • Какой рабочий процесс лучше всего использовать с инструментом анализа?
  • Как узнать, работает ли prefetchPlugin? как я могу это измерить?
  • Что означает предварительная загрузка модуля из середины цепочки ?

Я действительно ценю несколько примеров

Пожалуйста, помогите мне сделать этот вопрос ценным ресурсом для следующего разработчика, который захочет использовать prefechPlugin и инструменты Analyze. Спасибо.

Асаф Кац
источник
1
Как мы должны использовать инструмент анализатора статистики? Когда я нажимаю кнопку «Загрузить», ничего не происходит и нет кнопки отправки. Только «пример использования»
TetraDev 07
В выводе консоли Uncaught SyntaxError: Unexpected token r in JSON at position 0отображается сообщение при загрузке любого stats.json
TetraDev
1
@TetraDev это означает, что у вас есть ошибка в вашем файле JSON. Попробуйте открыть его в текстовом редакторе и посмотрите, есть ли что-то, что не похоже на действительный JSON. (У меня такая же проблема с выводом отладки из Webpack в первой строке).
maufl
В документах есть > stats.jsonнесколько лишних строк вверху, которые нарушают работу парсера
Alex Riina

Ответы:

35

Да, документации плагина предварительной выборки практически не существует. После того, как я понял это для себя, он довольно прост в использовании и не требует особой гибкости. По сути, он принимает два аргумента: контекст (необязательно) и путь модуля (относительно контекста). Контекст в вашем случае /absolute/path/to/your/project/node_modules/react-transform-har/предполагает, что тильда на вашем скриншоте относится к разрешениюnode_modules node_module webpack .

Фактический модуль предварительной выборки в идеале должен иметь не более трех глубинных зависимостей. Итак, в вашем случае isFunction.jsэто модуль с длинной цепочкой сборки, и в идеале он должен быть предварительно загружен вgetNative.js

Однако я подозреваю, что в вашей конфигурации есть что-то странное, потому что зависимости вашей цепочки сборки ссылаются на зависимости модулей, которые должны автоматически оптимизироваться с помощью webpack. Я не уверен, как вы это получили, но в нашем случае мы не видим никаких предупреждений о длинных цепочках сборки в node_modules. Большинство наших длинных цепочек сборки связаны с глубоко вложенными компонентами реакции, которые требуют scss. то есть:

введите описание изображения здесь

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

plugins: [
    new webpack.PrefetchPlugin('/web/', 'app/modules/HeaderNav.jsx'),
    new webpack.PrefetchPlugin('/web/', 'app/pages/FrontPage.jsx')
];

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

4м1р
источник
Я пытаюсь получить некоторые из своих сборок, и даже после объяснения я все еще не понимаю, как использовать этот инструмент. Можете ли вы подробнее рассказать, что именно означает «контекст» и каким должен быть каждый из параметров в предварительной выборке? Я не уверен, что именно делается в плагине
ThrowsException
Давно не пользовался, но, наверное, все тот же. У плагина должно быть только два аргумента. app/components/module.jsx'app''components/module.jsx'
Во-
1
Хорошо, у меня есть еще один шанс. Я пробовал по крайней мере два десятка вариантов PrefetchPlugin, и, похоже, ничто не могло удалить его из моей длинной цепочки сборки. У меня та же проблема, что и у плаката, когда у меня есть модуль узла, который на самом деле находится в моей длинной цепочке сборки, и я пытаюсь выполнить предварительную загрузку. Я не знаю, может быть, webpack не знает, как справиться с этой ситуацией.
ThrowsException
Я использовал плагин предварительной выборки, чтобы значительно повысить производительность моего проекта, в котором используется handlebars.js. Вот синтаксис, который у меня сработал:new webpack.PrefetchPlugin(__dirname + "/node_modules", "handlebars/runtime.js"),
Андре
Кроме того, если то, что вы хотите предварительно выбрать, не является пакетом (т.е. не входит node_modules), вы можете просто передать строку запроса . Обратите внимание, что первый аргумент context не является обязательным.
натчикета 03
2

Середина вашей цепочки, вероятно, есть, react-transform-hmr/index.jsпоскольку она начинается примерно на полпути. Вы можете попробовать PrefetchPlugin('react-transform-hmr/index')перезапустить свой профиль, чтобы увидеть, помогает ли это ускорить общее время построения.

Аарон Дженсен
источник
только хуже .. с 2351 мс до 2361 мс, также выдает ошибкуEntry module not found: Error: Cannot resolve module 'react-transform-hmr/index' in /Users/asafkatz/Development/my-react-builerplate
Асаф Кац
4
ну разница в 10мс не хуже, разница статистически незначима. Я бы поиграл с разными вещами react-transform-hmrи react-transform-hmr/index.jsт. Д.
Аарон Дженсен