Чи працює попереднє завантаження посилань для піддоменів?


10

Я намагався використовувати щось подібне, щоб підвищити ефективність при натисканні з простої цільової сторінки на важку вагу для однієї сторінки:

<link rel="prefetch" href="https://example.com" as="document" />
<link rel="prefetch" href="https://example.com/app.js" as="script" />
<link rel="prefetch" href="https://example.com/app.css" as="style" />

Здається, немає помітного підвищення продуктивності, коли моя цільова сторінка знаходиться в субдомені. Скажімо, https://subdomain.example.com.

Коли я натискаю посилання, щоб відвідати https://example.com, на вкладці мережі Chrome все ще спостерігається велика затримка як app.jsі app.cssзавантажується:

Попередньо встановлені ресурси Час завантаження ресурсів за допомогою попереднього завантаження

Ось той самий ресурс, де попереднє завантаження вимкнено:

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

Це займає приблизно стільки ж часу.


Попросіть заголовки для одного з ресурсів, завантажених кешем попереднього вибору:

Загальне:

Request URL: https://example.com/css/app.bffe365a.css
Request Method: GET
Status Code: 200  (from prefetch cache)
Remote Address: 13.226.219.19:443
Referrer Policy: no-referrer-when-downgrade

Відповідь:

accept-ranges: bytes
cache-control: max-age=31536000
content-encoding: gzip
content-length: 39682
content-type: text/css
date: Mon, 06 Jan 2020 21:42:53 GMT
etag: "d6f5135674904979a2dfa9dab1d2c440"
last-modified: Mon, 06 Jan 2020 20:46:46 GMT
server: AmazonS3
status: 200
via: 1.1 example.cloudfront.net (CloudFront)
x-amz-cf-id: dO3yiCoPErExrE2BLYbUJaVye32FIJXXxMdI4neDGzGX9a6gcCDumg==
x-amz-cf-pop: LAX50-C1
x-amz-id-2: 1O0LmihxpHIywEaMQWX7G3FDAzxtH9tZq1T/jeVLMzifFSJSIIJSS6+175H61kKdAq6iEbwfs2I=
x-amz-request-id: AF35C178092B65D4
x-cache: Hit from cloudfront

Запит:

DNT: 1
Referer: https://example.com/auth/join
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36

Моє запитання: Якщо Chrome вказує, що кеш попереднього вибору використовується, чому тоді існує значний час завантаження вмісту?

Здається, що Chrome має різні типи кеш-пам'ять: кеш попереднього вибору, кеш диска та кеш пам'яті. Дисковий кеш і кеш пам’яті дуже швидкі (5мм і 0мс завантаження). Однак кеш попереднього вибору досить марний, часом завантаження 300 мс. Чи можу я отримати технічне пояснення, чому це відбувається? Це помилка з Chrome? Я перебуваю на Chrome 79.0.3945.117.


Prefetch використовується для прискорення майбутніх навігацій, дивіться коротке пояснення від ( web.dev/link-prefetch )
Мохаммед Ясір

Так, попередній вибір повинен прискорити майбутні навігації. Тоді чому це не пришвидшило це в моєму випадку? Дивіться графіки хронометражу.
Марос

Чи можете ви спробувати розмістити вміст піддомену в іншому домені та перевірити, чи не потребує завантаження це також час? Ви, здається, зрозуміли, що субдомен може бути проблемою, не показуючи його, показуючи, як працює субдомен (тобто інший домен). Якщо піддомен є проблемою, наступним кроком буде вивчення, чи є налаштування Chrome для налаштування, яке буде робити це, або
Мартін

Чи відображаються однакові часи завантаження як для субдомену, так і для інді-домену в інших браузерах з подібними наборами інструментів, такими як Firefox Inspector або Opera? Якщо така ж проблема з термінами виникає в інших веб-переглядачах, які використовують різні двигуни (я не впевнений, що робити і більше не робити), як ви посилаєтесь, це може бути помилка - я цілком можу вважати, що це може бути помилка Chrome якщо ці відмічені значення часу помітно відрізняються в інших браузерах.
Мартін

Відповіді:


0

Додавання <link rel=prefetch>на веб-сторінку повідомляє браузеру завантажувати цілі сторінки або деякі ресурси (наприклад, скрипти або файли CSS), які користувачеві можуть знадобитися в майбутньому. Це може покращити такі показники, як "Перша змістовна фарба" та "Час до інтерактивного", і часто може зробити так, щоб наступні навігації завантажувалися миттєво.

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

Підказка щодо попереднього вибору споживає додаткові байти для ресурсів, які не потрібні відразу, тому цю техніку потрібно застосовувати продумано; попередньо завантажуйте ресурси лише тоді, коли ви впевнені, що користувачі їм знадобляться. Подумайте, що не попереднє завантаження, коли користувачі знаходяться на повільних з'єднаннях. Ви можете виявити це за допомогою API мережі інформації.

Існують різні способи визначити, які посилання на попередній вибір. Найпростішим є попереднє вилучення першого посилання або декількох перших посилань на поточній сторінці. Існують також бібліотеки, які використовують більш складні підходи, пояснені пізніше в цьому пості - https://web.dev/link-prefetch/ .


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

0

Я можу лише здогадуватися. Впевнена відповідь, ймовірно, може бути знайдена лише ви, в ході експерименту. Занадто багато змінних для обліку. Але ось кілька ідей:

  1. prefetchє підказкою для браузера. Браузер може ігнорувати це з якихось довільних причин. Більше того, він має найнижчий пріоритет.
  2. Наприклад, про всяк випадок, будь ласка, перевірте налаштування свого веб-переглядача:
    Menu/Settings/Advanced/Privacy and security/Preload pages for faster browsing and searching
    (або щось подібне).
  3. Якщо ви випадково використовуєте мобільний Інтернет, це також може бути проблемою.
    https://www.technipages.com/google-chrome-prefetch
  4. Як швидко ви переходите від цільової сторінки до example.com?
  5. Перевірте журнали сервера, щоб побачити, чи отримує він коли-небудь prefetchзапити.
  6. Перевірте, чи ваш сервер встановлює якісь дивні заголовки у відповідь на prefetchзапити. Напр Cache-Control: no-cache. Так, я бачу, що у вас є cache-control: max-age=31536000, тому було б справді дивно, якщо сервер надсилатиме різні заголовки на один і той же запит (ну ... майже те саме , принаймні ви не сказали, що вони є, і, принаймні, можна бути деякими заголовками, що вказують, що це prefetchзапит), але трапляються дивні речі.

  7. Напевно, вам слід спробувати додати crossoriginатрибут. Напр

    <link rel="prefetch" href="https://example.com/app.css" as="style" crossorigin />

    Тут https://www.w3.org/TR/resource-hints/ ви можете знайти цей приклад

    <link rel="preconnect" href="//example.com">
    <link rel="preconnect" href="//cdn.example.com" crossorigin>

    досить актуально для вашої справи, але, на жаль, без пояснень.

  8. В оригінальній версії свого питання ви згадали службових працівників ... Якщо вони щось завантажують, або навіть ви самі щось завантажуєте вручну, це також може бути проблемою. Через найнижчий пріоритетprefetch

    https://developer.mozilla.org/en-US/docs/Web/HTTP/Link_prefetching_FAQ#What_if_I.27m_downloading_something_in_the_background.3F_Will_link_prefetching_compete_for_bandwidth.3F

    Якщо ви завантажуєте щось за допомогою Mozilla, попереднє завантаження посилань буде відкладено до тих пір, поки завантаження фону не завершиться

    Я думаю, те саме стосується і Chrome.

  9. Ви намагалися перенести цільову сторінку до кореневого домену? Якщо так, так і prefetchпрацює, як очікувалося, тоді так - субдомен є причиною проблеми. І повідомлення GUI Status Code: 200 (from prefetch cache)- це, мабуть, лише глюк. Тому що зовсім недавно деякі речі почали змінюватися в prefetchповедінці в Chrome. І я ще не знаю, чи все налагодиться. В основному, так, є певна ймовірність, що ти можеш prefetchлише того самого походження.

    https://docs.google.com/document/d/1bKGDIePAuF6YXmmrwM33LeLvtuCsla3vTspsxsNp-f8/edit


Деякі випадкові нотатки, прочитавши вашу відповідь: Я дуже повільно переходжу від цільової сторінки до example.com, даючи достатньо часу для завантаження всіх ресурсів. Я робив тестування вище з сервісними працівниками, відключеними в Chrome. Я думаю, що атрибут crossorigin - це щось інше. Я намагався його використовувати, і не пощастило. Найгірший випадок, я проведу тестування, яке ви запропонуєте, перемістивши цільову сторінку в кореневий домен. Я сподівався, що відповідь тут врятує мене від роботи.
Марос

1
Ви пробували FF? З посилання MDN вище: "Чи буде Mozilla попередньо вибирати документи з іншого хоста? Так. Існує не обмеження походження для попереднього вибору посилань. Обмеження попереднього вибору лише URL-адрес з того самого сервера не забезпечить підвищеної безпеки браузера." Цей уривок може бути застарілим, але все ж. Буде добре знати, чи відрізняються вони між собою у поведінці із Chrome.
x00

Я спробував, але мені не вдалося відключити сервісних службовців, які, здавалося, мають перевагу перед кешком попереднього вибору. Я можу ще спробувати.
Марос

@Maros, вам якось не належить код, або виникла якась технічна проблема?
x00

-1

ви повинні додати код нижче, якщо ви маєте піддомен ont і хочете ресурс з домену

<link rel="preconnect" href="https://example.com">
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.