Недавно я работал над некоторыми работами по оптимизации веб-сайта, и я начал использовать разбиение кода в веб-пакете, используя следующую инструкцию импорта:
import(/* webpackChunkName: 'pageB-chunk' */ './pageB')
Что правильно создает pageB-chunk.js , теперь, скажем, я хочу предварительно извлечь этот чанк в pageA, я могу сделать это, добавив этот оператор в pageA:
import(/* webpackChunkName: 'pageB-chunk' */ /* webpackPrefetch: true */ './pageB')
Что приведет к
<link rel="prefetch" href="pageB-chunk.js">
будучи добавленным к заголовку HTML, браузер будет предварительно выбирать его, пока все хорошо.
Проблема в том, что оператор импорта, который я здесь использую, не только предварительно выбирает файл js, но и оценивает файл js, означает, что код этого файла js анализируется и компилируется в байт-коды, выполняется код верхнего уровня этого JS.
Это очень трудоемкая операция на мобильном устройстве, и я хочу ее оптимизировать, я хочу только часть предварительной выборки , я не хочу часть оценки и выполнения , потому что позже, когда произойдет какое-то взаимодействие с пользователем, я инициирую синтаксический анализ и оценить себя
↑↑↑↑↑↑↑↑ Я хочу только запустить первые два шага, фотографии приходят с https://calendar.perfplanet.com/2011/lazy-evaluation-of-commonjs-modules/ ↑↑↑↑↑↑↑ ↑↑
Конечно, я могу сделать это, добавив ссылку на предварительную выборку самостоятельно, но это означает, что мне нужно знать, какой URL-адрес я должен добавить в ссылку предварительной выборки, веб-пакет определенно знает этот URL-адрес, как я могу получить его из веб-пакета?
У webpack есть какой-нибудь легкий способ достигнуть этого?
источник
if (false) import(…)
Я сомневаюсь, что веб-пакет делает анализ мертвого кода?import
должен идти динамический код.Ответы:
ОБНОВИТЬ
Вы можете использовать preload-webpack-plugin с html-webpack-plugin, он позволит вам определить, что предварительно загружать в конфигурацию, и автоматически вставит теги для предварительной загрузки вашего чанка.
обратите внимание, что если вы используете webpack v4, вам нужно установить этот плагин, используя
preload-webpack-plugin@next
пример
ОБНОВЛЕНИЕ 2
если вы не хотите предварительно загружать весь асинхронный блок, но только один раз, вы можете сделать это тоже
либо вы можете использовать babel плагин migcoder или
preload-webpack-plugin
какСначала вы должны назвать этот асинхронный блок с помощью
webpack magic comment
примераа затем в конфигурации плагина использовать это имя как
Прежде всего давайте посмотрим поведение браузера, когда мы указываем
script
тег илиlink
тег для загрузки скриптаscript
тегом, он загружает его, анализирует и немедленно выполняет егоasync
и до события.defer
DOMContentLoaded
link
)теперь есть и другой, не рекомендуемый хаккейный способ: вы отправляете весь свой сценарий и
string
илиcomment
(потому что время оценки комментария или строки практически ничтожно), и когда вам нужно выполнить то, что вы можете использовать,Function() constructor
илиeval
оба не рекомендуетсяРаботники сервиса другого подхода : (это сохранит ваше кеш-событие после перезагрузки страницы или пользователь перейдет в автономный режим после загрузки кеша)
В современном браузере вы можете использовать
service worker
для извлечения и кэширования ресурсов (JavaScript, изображения, CSS, что угодно), и когда основной поток запрашивает этот ресурс, вы можете перехватить этот запрос и вернуть ресурс из кэша таким образом, что вы не анализируете и не анализируете скрипт, когда вы загружаете его в кеш, подробнее о сервисных работниках здесьпример
как вы можете видеть, это не зависит от веб-пакета , это выходит за рамки веб-пакета, однако с помощью веб-пакета вы можете разделить свой пакет, что поможет лучше использовать работника сервиса
источник
Обновления: я включаю все вещи в пакет npm, зацените! https://www.npmjs.com/package/webpack-prefetcher
После нескольких дней исследований я в итоге написал плагин для настройки babel ...
Короче, плагин работает так:
Prefetcher - это вспомогательный класс, который содержит манифест вывода webpack и может помочь нам вставить ссылку prefetch:
Пример использования:
Подробности этого плагина можно найти здесь:
Prefetch - взять управление из веб-пакета
Опять же, это действительно хакерский способ, и мне не нравится, если вы хотите, чтобы команда webpack реализовала это, пожалуйста, проголосуйте здесь:
Особенность: предварительный выбор динамического импорта по требованию
источник
Предполагая, что я понял, чего вы пытаетесь достичь, вы хотите проанализировать и выполнить модуль после определенного события (например, нажмите на кнопку). Вы можете просто поместить оператор импорта в это событие:
источник