Skip to content

Releases: prefetch-ru/prefetch

v1.1.3

05 Mar 16:52

Choose a tag to compare

v1.1.3

Оптимизация производительности

  • Устранены избыточные new URL() — флаг isCrossOrigin вычисляется один раз и передаётся через всю цепочку preload → doPreload → preloadSpec/preloadLink/preloadFetch (ранее до 4-5 вызовов new URL() на каждый prefetch);
  • MutationObserver: точечное наблюдение — при DOM-мутациях обрабатываются только новые ссылки из addedNodes, без пересканирования всего DOM;
  • MutationObserver: requestIdleCallback — обработка новых ссылок не блокирует UI при массовых вставках (SPA-рендеринг);
  • flushSpecBuffer без .slice() — массивы URL передаются напрямую в Speculation Rules JSON, без создания копий.

Реактивное обновление сети

  • navigator.connection.onchange — состояние сети (effectiveType, saveData) обновляется при смене типа соединения (ранее кэшировалось один раз при загрузке);
  • Корректная очистка listener в destroy().

Исправления

  • Битрикс: pathname/search вместо href — проверки /bitrix/ и sessid= больше не могут ложно сработать на подстроках в домене или hash;
  • Удалена мёртвая переменная chromiumVer — не использовалась после v1.1.1.

Full Changelog: v1.1.2...v1.1.3


Integrity (SRI) IIFE — prefetch.min.js

sha384-GLzh62lOA1yEK5qmVJ40WMBv1E/5o4Y4dyMMbTH17EVJn7LWWhNiZQZqvMqJpI/9

v1.1.2

13 Jan 22:54

Choose a tag to compare

v1.1.2

Cross-origin prefetch для всех браузеров

  • Убрано ограничение chromiumVer — теперь Firefox и Safari поддерживают cross-origin prefetch;
  • mode: no-cors — для cross-origin fetch используется no-cors mode (opaque response прогревает кэш);
  • Проверка r.type === "opaque" — корректная обработка успешного no-cors response;
  • Cross-origin через fetch<link rel="prefetch" crossorigin="anonymous"> требует CORS headers, поэтому cross-origin всегда использует fetch() с no-cors.

Методы cross-origin prefetch по браузерам

Браузер Метод
Chrome/Chromium 109+ Speculation Rules API (если включены) или fetch()
Firefox fetch() с mode: no-cors
Safari/iOS fetch() с mode: no-cors

Full Changelog: v1.1.0...v1.1.2


Integrity (SRI) IIFE — prefetch.min.js

sha384-BDLxwRTwyIWnAEmc+2Rkw41jVvctV3HxxTu1ryrmagtHh18GekSP+bfqy5/YswEW

v1.1.0

12 Jan 23:32

Choose a tag to compare

v1.1.0

Архитектура

  • Единое ядроsrc/core.js + entrypoints (IIFE/ESM) через Rollup;
  • Версия из package.json — инжектится при сборке (__VERSION__);
  • Генерируемые файлыprefetch.js, prefetch.esm.js, dist/.

Производительность

  • Speculation Rules буферизация — URL группируются и вставляются одним <script> за idle tick;
  • MutationObserver оптимизацияquerySelector вместо querySelectorAll;
  • navigator.userAgentData — с fallback на UA sniffing;
  • parseUrl() — один new URL() вместо двух.

Безопасность и приватность

  • Cross-origin Speculation Rulesreferrer_policy: no-referrer + requires: ['anonymous-client-ip-when-cross-origin'];
  • Cross-origin fetch — без Purpose header (избегаем preflight), credentials: 'omit', referrerPolicy: 'no-referrer';
  • Safety timeout — 30 сек предохранитель для <link rel=prefetch> с удалением key при неуспехе;
  • Блокировка 3G — prefetch отключается на 3G соединениях.

Жизненный цикл

  • destroy() — полная очистка: таймеры, touchCancel, AbortControllers, idle callbacks, буфер SpecRules;
  • flushSpecBuffer — проверяет disabled после destroy();
  • pageshow — обновление currentKey для bfcache restore;
  • popstate/hashchange — поддержка SPA-гибридов.

Совместимость

  • window.PrefetchRu — основной API (избегаем коллизий с window.Prefetch);
  • 304 как успех — HTTP 304 Not Modified считается успешным prefetch;
  • data-prefetch-specrules-fallback — опциональный fallback при Speculation Rules.

Full Changelog: v1.0.10...v1.1.0


Integrity (SRI) IIFE — prefetch.min.js

sha384-mtWj+Hx/5xw4Vs9KyuZGevAJ2CfZLIesU5FqxBHM54PoADhcKgBjMzQuq3ggf+rh

v1.0.10

12 Jan 16:14

Choose a tag to compare

v1.0.10 — feature-detection и исправления надёжности

Исправления:

Feature-detection для IntersectionObserver/MutationObserver

  • Viewport режим и DOM наблюдатель теперь проверяют наличие API перед использованием;
  • В старых браузерах/WebView скрипт не падает с exception, просто отключает недоступные функции.

Откат ключа при неудачном запросе

  • Если document.head отсутствует или fetch недоступен, ключ удаляется из preloaded;
  • Повторная попытка предзагрузки теперь возможна (ранее ключ блокировал навсегда).

Модификаторы в mousedown

  • При нажатии с Ctrl/Meta/Shift/Alt (открытие в новой вкладке) префетч не запускается;
  • Экономит ресурсы — кэш новой вкладки всё равно отдельный.

Integrity (SRI) IIFE — prefetch.min.js

sha384-k81u5ASBRvPtzLbZh+DsaSsEdh6Nnl+hl3UYbDbaXowc9ju9C+gRakWVyBJj4jQv

v1.0.9

12 Jan 14:58

Choose a tag to compare

v1.0.9 — исправления стабильности и надёжности

Исправления

Guard от двойной инициализации

  • Защита от повторной загрузки скрипта через маркер __prefetchRu;
  • При ошибках интеграции, SPA с повторным инжектом, A/B-тестах — больше не создаются дублирующиеся event listeners.

Единая шкала времени

  • Date.now() вместо event.timeStamp для надёжного анти-touch дубляжа;
  • Исключает edge-case баги в браузерах с разными системами отсчёта timeStamp.

Точная проверка опасных путей

  • Все блокировки (/login, /auth, /cart, /add и др.) теперь проверяются по сегментам pathname;
  • Больше не блокируются безобидные URL: /author, /cartoon, /authentication, /additional.

Оптимизация ресурсов

  • MutationObserver запускается только с viewport режимом;
  • <link rel="prefetch"> удаляется из DOM после загрузки — не раздувает <head> на долгоживущих страницах.

Full Changelog: v1.0.8...v1.0.9


Integrity (SRI) IIFE — prefetch.min.js

sha384-odT5BaFB94lY2uR5v3aTTzI20laOsz7ma8zd/FecVJLZLg0rStzzPsHR9bpAC6NE

v1.0.8

11 Jan 14:24

Choose a tag to compare

v1.0.8 — добавлена ESM-версия

ESM версия

Добавлена ESM версия библиотеки для использования в современных бандлерах (Vite, Webpack, Rollup) и <script type="module">.

Новые файлы в npm пакете:

  • prefetch.esm.js — ESM версия
  • dist/prefetch.esm.min.js — минифицированная ESM

Использование:

import Prefetch from '@prefetchru/prefetch'

CSP nonce:

  • При прямом подключении <script type="module" src="prefetch.esm.js" nonce="..."> — nonce определяется автоматически
  • При использовании через бандлер — передавайте через <body data-prefetch-nonce="...">

SSR: ESM версия безопасна для серверного рендеринга — возвращает заглушку если нет window.


v1.0.7 — Улучшения стабильности и точности

Исправления и улучшения:

  • Улучшена обработка событий мыши;
  • mouseleave вместо mouseout — событие больше не срабатывает ложно при переходе курсора на вложенные элементы внутри ссылки (например, <span>, <img>);
  • Защита от дублирования таймеров — при множественных mouseover по вложенным элементам больше не создаются лишние таймеры предзагрузки;
  • Улучшена фильтрация ссылок;
  • Исключение пустых href — ссылки <a href=""> и <a> без атрибута href теперь игнорируются (часто используются как кнопки с JavaScript-обработчиками);
  • Проверка текущей страницы — больше не пытаемся префетчить страницу, на которой уже находимся;
  • Точная проверка action-путей;
  • Пути /add, /delete, /remove теперь блокируются только как отдельные сегменты URL;
  • Ссылки типа /address, /additional, /delicious больше не блокируются ошибочно;
  • Регистронезависимость расширений;
  • Файлы .PDF, .ZIP, .DOC и т.д. теперь корректно распознаются независимо от регистра.

Full Changelog: v1.0.7...v1.0.8


Integrity (SRI) IIFE — prefetch.min.js

sha384-nNS1JL47ofhJMYvmWpvqMewFJ5iYNbVM1VOJs+IHoicVzN3cWbMFxuki4n2pmdck

v1.0.7

11 Jan 12:39

Choose a tag to compare

v1.0.7 — Улучшения стабильности и точности

Исправления и улучшения:

  • Улучшена обработка событий мыши;
  • mouseleave вместо mouseout — событие больше не срабатывает ложно при переходе курсора на вложенные элементы внутри ссылки (например, <span>, <img>);
  • Защита от дублирования таймеров — при множественных mouseover по вложенным элементам больше не создаются лишние таймеры предзагрузки;
  • Улучшена фильтрация ссылок;
  • Исключение пустых href — ссылки <a href=""> и <a> без атрибута href теперь игнорируются (часто используются как кнопки с JavaScript-обработчиками);
  • Проверка текущей страницы — больше не пытаемся префетчить страницу, на которой уже находимся;
  • Точная проверка action-путей;
  • Пути /add, /delete, /remove теперь блокируются только как отдельные сегменты URL;
  • Ссылки типа /address, /additional, /delicious больше не блокируются ошибочно;
  • Регистронезависимость расширений;
  • Файлы .PDF, .ZIP, .DOC и т.д. теперь корректно распознаются независимо от регистра.

Full Changelog: v1.0.6...v1.0.7


Integrity (SRI)

sha384-dt/dXrGzcFqvGJqBSfy2TbyD3vPORKkjyz9WBGyHFK5ft10FvoAGv/BwGrxj+5eI

v1.0.6

10 Jan 13:12

Choose a tag to compare

Техническое обновление до версии 1.0.6


Integrity (SRI)

sha384-11bHdrPV9+j2BGIzObjSUObUBIB8rE9QDO96Gxt/13txkdoA+eumFQljXaC7tVul

v1.0.5

09 Jan 23:37

Choose a tag to compare

Улучшения

  • Улучшена проверка доменов аналитики: используется точное сравнение hostname вместо поиска подстроки в URL

Это обеспечивает более точную фильтрацию ссылок на домены аналитики (Яндекс.Метрика, Google Analytics, Matomo/Piwik).

v1.0.4

09 Jan 23:27

Choose a tag to compare

Техническое обновление до версии 1.0.4