Запуск предварительной загрузки после полной загрузки страницы

Мой сценарий:

  • пользователь посещает domain.com (домашнюю страницу)
  • Страница domain.com/products содержит большую библиотеку изображений и достаточно большие библиотеки CSS и JS.
  • когда пользователь посещает domain.com и домашняя страница полностью загружена, мы начинаем предварительно извлекать ресурсы и, если возможно, по крайней мере некоторый % изображений из архив.

В настоящее время на некоторых страницах JS «съедает» довольно много ресурсов, поэтому запуск предварительной выборки в некоторых случаях во время загрузки страницы не лучший выход, так как это вызовет небольшую задержку при взаимодействии пользователя с JS. создал события и элементы.

Мои вопросы:

  1. Возможно ли (будет ли это работать) инициировать добавление <link rel="prefetch" href="image.png"> или файла CSS к <head>, чтобы он мог предварительно выбирать данные с другой страницы после полной загрузки текущей страницы?
  2. Должен ли я сделать это аналогично рендерингу дополнительной таблицы стилей с использованием JS, где я добавляю новый тег в <head> в качестве файла таблицы стилей, чтобы он мог затем отображать ... или есть другой способ?

person richardev    schedule 20.05.2018    source источник
comment
к сожалению, вам пришлось открыть вознаграждение за это, но Web Workers был создан для фоновых задач, таких как добавление новых таблиц стилей или тегов в полностью загруженный документ, тогда, конечно. Это так же просто, как это. Естественно, вам придется выполнять другую логику и манипуляции с DOM для обновления и т. д., но это всего лишь вопрос поиска решений, специфичных для вашего проекта. На эту тему есть много руководств/примеров.   -  person soulshined    schedule 22.05.2018
comment
@soulshined Меня действительно не волнует награда. Я просто должен понять это. Да, я читал подобные документы об этом раньше, но это не совсем то, что я искал. Мне не нужно предварительно загружать, мне нужно предварительно загружать, поэтому он, возможно, остается в браузере пользователя, и когда мы загружаем следующую страницу (поскольку ресурсы были загружены ранее), она загружается страница намного быстрее и не вызывает никаких небольших задержек. В любом случае, спасибо за ответ. Я буду продолжать исследования.   -  person richardev    schedule 22.05.2018
comment
Я не правильно понимаю, что ты пытаешься сказать! Вы пытаетесь загрузить внешние таблицы стилей, js и изображения после загрузки страницы?   -  person AA Shakil    schedule 22.05.2018
comment
@AAShakil Пользователь открывает domain.com. Поскольку он не открывал другие страницы и не загружал ресурсы, ему придется загружать большое количество ресурсов при посещении следующей страницы, поэтому мне нужно как-то предварительно загрузить их на текущей странице после того, как текущая страница была загружена - так что я должен вызвать его после загрузки страницы.   -  person richardev    schedule 22.05.2018
comment
Теперь я понял @RicardsMucelans. Существуют руководства/ обсуждения по этому вопросу, и некоторые действительно хороший сообщения в блоге, а также. Но предостережение: если бы я был мобильным пользователем, который потратил кучу данных на предварительную загрузку веб-страницы, которая мне даже не нужна или которую я не посещаю, мне было бы грустно, когда придет мой счет, особенно если он такой большой, как вы говорите. это. Но это ни здесь, ни там. Проверьте эти ссылки для некоторых пробегов   -  person soulshined    schedule 22.05.2018
comment
@soulshined да prefetch! хаха. О мобильных пользователях - вот почему мне нужно иметь возможность запускать его в определенном месте и после загрузки страницы, чтобы я мог контролировать предварительную выборку данных для мобильных устройств. Не у всех безлимитный тарифный план, ха-ха.   -  person richardev    schedule 22.05.2018
comment
Если вы беспокоитесь о мобильных пользователях, я думаю, можно с уверенностью предположить, что вы беспокоитесь обо всех пользователях? В этом случае обязательно проверьте совместимость и другой   -  person soulshined    schedule 22.05.2018


Ответы (5)


Вы можете использовать Хранилище кэша для предварительной выборки (предкэширования) ресурсов. Я работаю над проектом с открытым исходным кодом, в котором используется этот подход. Однако для обслуживания предварительно кэшированных ресурсов вам понадобится сервисный работник. . Логика поиска ассетов в моем проекте выглядит так: это.

Демонстрация этого проекта находится здесь. Кроме того, я написал статью, в которой объясняются технические детали проекта. .

Активы получают предварительную выборку после загрузки библиотеки, поэтому я не жду полной загрузки страницы. Возможно, мне следует использовать requestIdleCallback, чтобы дождаться, пока браузер праздный.

Надеюсь, это вдохновит вас.

person Dmitriy Nesteryuk    schedule 24.05.2018
comment
Спасибо @Dmitriy Nesteryuk. Это действительно отличное решение для моего сценария. Мне нравится подход, когда следующая возможная страница должна быть загружена заранее. Я обязательно попробую это в своем следующем проекте. Но мне все еще интересно, можно ли prefetch запускать вручную позже после предварительной загрузки страницы - это основная причина, по которой я разместил здесь сообщение о награде. - person richardev; 28.05.2018

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

document.addEventListener("DOMContentLoaded", function(event) { 
      var script = document.createElement("link");
      script.rel = "stylesheet";
      script.href= "stylesOfAnotherPage2.css";

      document.getElementsByTagName("body")[0].appendChild(script);//or head
});

Когда вы загружаете страницу 1, stylesOfAnotherPage2.css кэшируется, поэтому при вызове страницы 2 stylesOfAnotherPage2.css уже кэшируется, если страница 2 вызывает один и тот же файл.

person Emeeus    schedule 29.05.2018
comment
да. Это подход, с которым я сейчас работаю. Спасибо за код, хотя @Emeeus. - person richardev; 30.05.2018

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

Подсказки по предварительной загрузке

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

<link rel="prefetch alternate stylesheet" title="Designed for Mozilla" href="mozspecific.css">
<link rel="next" href="2.html">

Кроме того, вы можете прочитать эту тему: Предварительная загрузка, предварительная выборка и приоритеты в Chrome Здесь вы можете прочитать о различных состояниях и приоритетах выполнения, времени загрузки и предварительной загрузки, а также несколько советов по их улучшению.

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

person MrMins    schedule 29.05.2018
comment
спасибо за исходники. @Dmitriy Nesteryuk уже указывал на кэширование, а затем на предварительную выборку с использованием своей библиотеки. Оба ваших решения и объяснения - отличное решение для моего сценария. Но главный вопрос, на который я не могу найти ответа, заключается в том, можно ли вручную добавить и активировать prefetch после полной загрузки страницы!? В любом случае для следующего проекта я определенно использую обе ваши рекомендации. - person richardev; 30.05.2018

preload CSS и JS с использованием https://developer.mozilla.org/en-US/docs/Web/HTML/Preloading_content может подойти и хорошо поддерживается в большинстве современных браузеров: https://caniuse.com/#search=preload

Вероятно, есть лучшие решения, такие как предложенное @soulshined, но еще один грубый способ сделать это — другая страница содержит etags или заголовки управления кешем — использовать AJAX для отправки запросов к ресурсам, которые вы ожидаете загрузить. Это приведет к тому, что браузер запросит эти ресурсы и предварительно заполнит кеш пользовательского агента, чтобы, когда пользователь запрашивает этот ресурс на другой странице, было более высокое изменение, кеш содержал бы ресурсы, и он загружался бы быстрее, чем если бы ему приходилось извлекать все в первый раз.

person David    schedule 22.05.2018
comment
Вы имеете в виду затем загрузить их в фоновом режиме, верно (речь о решении Ajax)? Говоря о preload - опять же, это не то, что мне нужно - мне нужно prefetch в этом сценарии, так как суть всего этого чтобы сократить время загрузки следующей страницы и общее время загрузки страниц. Найденный источник: предварительная загрузка и предварительная выборка - person richardev; 22.05.2018
comment
возможно, я не понимаю, что вы имеете в виду. Если страница A отправляет AJAX-запросы к ресурсам, которые, как вы знаете, находятся на странице B (которые являются кэшируемыми ресурсами). Если/когда пользователь, наконец, попытается загрузить страницу B после страницы A, то эти ресурсы, вероятно, будут в кеше пользовательского агента, что означает, что страница B будет загружаться быстрее, чем если бы эти ресурсы не были предварительно загружены каким-либо образом на странице A. - person David; 22.05.2018
comment
Кажется, я неправильно вас понял. Да, именно этого я и пытаюсь добиться. Вариант prefetch в этом случае будет намного проще и проще в использовании. Я думаю, что решение Ajax будет моим последним вариантом, который я попробую. В любом случае спасибо @David Goate - person richardev; 22.05.2018
comment
Тогда эта ссылка не поможет? developer.mozilla.org/en-US/docs/Web/HTTP/ Link_prefetching_FAQ Я имею в виду, что на странице A вы не можете ссылаться на различные ресурсы, которые, как вы знаете, находятся на странице B, такие как HTML, JS, CSS, изображения, и, следовательно, если пользователь щелкнет ссылку на страницу B, вы' я знаю, что он, возможно, будет предварительно обработан и готов к работе, что приведет к более быстрой загрузке страницы B, потому что пользователь сначала посетил страницу A, - person David; 22.05.2018
comment
Конечно, @soulshined справедливо заметил, что с точки зрения пользовательского опыта мобильные пользователи особенно могут быть немного расстроены использованием полосы пропускания. - person David; 22.05.2018
comment
Я понимаю это, но как насчет запуска события предварительной выборки после загрузки? Контролировать, когда он будет предварительно выбран? Выше я упоминал об этом, что мы хотим как можно меньше заботиться о предварительной выборке мобильных устройств, плюс я только что прочитал, что опция «ссылка» — лучший способ, так как браузер пользователей зарегистрирует событие и будет знать, что делать. , но запрос фона Ajax не будет. Наконец-то у меня есть немного света по этому поводу, но вопрос о его запуске все еще остается. Longstoryshort - в этом случае следует использовать prefetch, а не решение Ajax или preload. - person richardev; 22.05.2018
comment
Давайте продолжим обсуждение в чате. - person richardev; 22.05.2018
comment
Привет, @ricardsMucelans. Я пытался связаться по ссылке в приватном чате. Вы добились какого-либо прогресса? - person David; 24.05.2018
comment
Я отправил тебе сообщение позже в тот же день. - person richardev; 28.05.2018

Для предварительной выборки ресурсов существуют некоторые методы предварительной выборки, такие как предварительная выборка DNS, предварительное подключение, предварительная визуализация и предварительная выборка. В соответствии с требованием, вы можете использовать их надлежащим образом. Каждый метод имеет свое назначение это было бы полезно знать каждый конкретно.

person Balu    schedule 29.05.2018