Як оптимізувати час побудови веб-пакета за допомогою інструменту prefetchPlugin & аналізу?


96

Попереднє дослідження:

Як говорить вікі 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. Дякую.


Як ми повинні використовувати інструмент аналізатора статистики? Коли я натискаю кнопку завантаження, нічого не відбувається, і немає кнопки надсилання. Тільки "приклад використання"
TetraDev

Вихід консолі повідомляє 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як на WebPack в резолюції node_module .

Фактичний модуль попередньої вибірки в ідеалі повинен мати глибину не більше трьох залежностей модуля. Отже, у вашому випадку isFunction.jsце модуль з довгим ланцюжком збірки, і в ідеалі його слід попередньо завантажитиgetNative.js

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

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

Незалежно від цього, ви захочете додати новий плагін для кожного із попереджень, наприклад:

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

Другий аргумент повинен бути рядком відносного розташування модуля. Сподіваюся, це має сенс.


Я намагаюся знизити деякі мої збірки, і навіть після пояснення я все ще дуже бентежусь, як користуватися цим інструментом. Чи можете ви розширити інформацію про те, що саме означає "контекст" і яким повинен бути кожен із параметрів у попередній вибірці? Я не впевнений, що саме робиться в плагіні
ThrowsException

Давно не використовував цього, але, мабуть, все одно. До плагіна має бути лише два аргументи. Перший, context, який є контекстом модуля, так, наприклад app/components/module.jsx, буде, 'app'і я думаю, що другий повинен бути відносним розташуванням, тобто'components/module.jsx'
4m1r

1
Гаразд, хворий, ще раз пропустіть. Я спробував принаймні два десятки механізмів PrefetchPlugin, і, здається, ніщо не видаляє його з мого довгого ланцюжка збірки. У мене така ж проблема, як у плаката, де у мене є модуль вузла, який насправді знаходиться в моєму довгому ланцюжку побудови, і я намагаюся його попередньо отримати. Я не знаю, чи, можливо, webpack не знає, як вирішити цю ситуацію.
ThrowsException

Я використовував плагін prefetch для значного підвищення продуктивності мого проекту, який використовує handlebars.js. Ось синтаксис, який спрацював для мене:new webpack.PrefetchPlugin(__dirname + "/node_modules", "handlebars/runtime.js"),
Андре

Крім того, якщо річ, яку ви хочете попередньо отримати, не є пакетом (тобто не входить node_modules), ви можете просто передати рядок запиту . Зверніть увагу, що перший аргумент, контекст , є необов’язковим.
natchiketa

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т.д.
Aaron Jensen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.