Device Memory API и производительность веба: подсказка памяти
Что может и чего не может показать navigator.deviceMemory, как постепенно адаптировать ресурсы и соблюдать ограничения приватности.
Нужна структурированная документация по теме Отпечатки?
Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.
navigator.deviceMemory - приблизительная подсказка, которая помогает веб-приложению выбрать осторожную стратегию ресурсов. Это не инвентаризация RAM, не тест производительности и не основание для идентификации человека. Считайте её необязательным входом, сочетайте с результатами выполнения и сохраняйте рабочий вариант по умолчанию для браузеров без этого свойства.
Что показывает Device Memory API
Device Memory API предоставляет navigator.deviceMemory - приблизительный объём памяти устройства в гигабайтах. Спецификация W3C описывает намеренно уменьшенное и сгруппированное значение, а не точное измерение. Браузер может округлить или ограничить его до возврата, поэтому код должен воспринимать его как общий намёк на возможности.
Свойство подходит для выбора между заранее подготовленными вариантами ресурсов: отложить большую картинку, уменьшить начальный кэш или выбрать более лёгкую задачу на клиенте. Оно не показывает свободную память в данный момент и не предсказывает успешное завершение страницы. Подсказка также ничего не говорит о квоте хранилища, скорости CPU, качестве сети или предпочтениях пользователя.
Доступность и ограничения
Поддержка не универсальна. MDN называет Navigator.deviceMemory экспериментальной функцией с ограниченной доступностью; браузер может не предоставлять её или показывать только в защищённом контексте. Код должен проверять наличие свойства и работать без него, не считая отсутствие признаком малого объёма памяти.
Значение намеренно неточное и может зависеть от политики браузера. Не используйте его как барьер совместимости, проверку права доступа или порог для маркировки устройства и его владельца. Нельзя выводить из группы модель, доход, местоположение или личность. Это одна из чувствительных к приватности поверхностей, а не надёжный профиль устройства.
Постепенная адаптация реальных нагрузок
Начните с базового варианта, работающего без API. Если подсказка доступна, используйте её для выбора ограниченного варианта, а затем наблюдайте результат по обычным метрикам приложения: завершение загрузки, ошибки декодирования, длинные задачи и отмены пользователем. Эти сигналы лучше описывают текущую задачу, чем статичная оценка оборудования.
Меняйте одну стоимость за раз и делайте решение обратимым. Можно отложить загрузку медиа ниже первого экрана, выбрать меньший предварительный просмотр, сократить число одновременных workers или отложить необязательный индекс. Сохраняйте тот же смысловой контент и доступные элементы управления. Нельзя удалять необходимое действие только из-за отсутствующей или малой подсказки.
В руководстве по планированию ёмкости BrowserContext описаны измеряемые бюджеты для длительных браузерных нагрузок. Руководство по возможностям WebGL и приватности показывает такой же подход с запасным вариантом, а сигналы хранилища и памяти в профилях объясняют, почему разные значения ресурсов нельзя смешивать.
Запасные варианты с уважением к приватности
Оставляйте подсказку локальной для решения, которому она нужна. Не отправляйте исходное значение на сервер, не добавляйте его к идентификатору аккаунта и не храните как постоянный атрибут профиля, если только явно описанная функция этого не требует. Даже сгруппированное значение может усиливать отпечаток в сочетании с другими сигналами.
Предпочитайте несколько политик ресурсов с явным значением по умолчанию и документируйте эвристический характер выбора. Учитывайте пользовательские настройки экономии трафика и, когда возможно, позволяйте запросить полный вариант. Если адаптация меняет передачу данных, объясните это до действия и сохраните доступный способ продолжить.
Используйте подсказку в правильном слое
API относится к отображению и планированию, а не к идентичности, правам или оплате. Страница может отложить предпросмотр, пока сервер сохраняет те же разрешения и обязательные данные.
Не делайте сервер зависимым от значения, которое может отсутствовать или округляться иначе. Для предпочтения отправляйте видимый временный выбор, например экономию трафика, а не группу памяти.
Сочетайте возможности и результаты
Память - лишь часть нагрузки. Задержка, декодирование, CPU, хранилище, экран и настройки могут быть важнее. Измеряйте результат, полезный пользователю, а не статичную оценку.
Наблюдайте декодирование изображения, запуск видео, повторы, задержку ввода и восстановление. Эти результаты направляют политику, не превращая подсказку в ярлык.
Сначала спроектируйте базовый путь
Базовый путь должен включать обязательный контент, клавиатурный доступ, читаемый текст и повтор улучшений. Лёгкий вариант может отложить дополнения, но не скрывать единственный способ завершить задачу.
Проверяйте отсутствие свойства, позднее чтение и широкую группу, а также изменение экономии трафика во время сессии. Цель - корректная работа каждой ветки.
Выбирайте устойчивые политики
Адаптивные изображения, отложенная загрузка, обратное давление, ограниченные кэши и отмена полезны без API и снижают нагрузку на сеть и батарею.
Держите несколько именованных политик. Для каждой укажите размер, параллельность, кэш и восстановление, чтобы её было легко проверять.
Журналы и хранение
Записывайте политику и результат, а не лишнее аппаратное значение. resource_policy=reduced обычно объясняет задержку. Если исходное значение нужно для диагностики, ограничьте доступ и срок и удалите его.
Агрегируйте результаты по политике. Не создавайте панели, сортирующие людей по памяти; результатов достаточно для улучшения продукта.
Вопросы перед выпуском
Убедитесь, что опыт полон без свойства, права и аккаунты от него не зависят, а журналы не хранят исходную подсказку. Необязательное уменьшение должно быть понятным и обратимым.
Повторите проверку после обновления браузера или страницы. Малый тест без свойства лучше большой матрицы предполагаемых устройств.
Проверяйте доступность без предположения о семействе браузера
Проверка возможностей должна быть обычной веткой приложения, а не тестом имени браузера. Читайте свойство только при его наличии и сохраняйте базовый вариант при undefined. Защищённый контекст, приватное окно или встроенный фрейм могут изменить доступность независимо от ОС.
Тестируйте ветку в поддерживаемых средах. Проверяйте доступность обязательного контента и управления, а не фиксированное значение. Обновление может изменить округление, поэтому тесты должны проверять поведение.
Отделяйте подсказку памяти от бюджета производительности
Подсказка выбирает начальную политику, а бюджет измеряется на рабочей нагрузке. Храните их раздельно: подсказка относится к странице, бюджет - к версии, хосту, нагрузке и окну наблюдения.
При превышении бюджета сначала проверьте жизненный цикл, медиа, workers, кэш и сеть. Утечка влияет на любой класс устройства; процессор может ограничивать отзывчивость даже при нормальной памяти.
Учитывайте намерение пользователя
Адаптация не должна отменять ясный выбор. Если пользователь запросил полный документ, объясните стоимость и предложите постепенную загрузку, но не ухудшайте содержимое молча. Экономия трафика отличается от оценки памяти.
Дайте видимый способ повторить необязательное улучшение и объясните задержку. Не запрашивайте аппаратное значение только ради меньшей картинки; размер или режим передачи должны быть понятны.
Избегайте связи между сессиями
Самый безопасный вариант - временное использование: прочитайте подсказку для текущей задачи, сохраните только выбранную политику и удалите исходное значение. Не объединяйте его с ID, IP, Canvas, шрифтами или таймингами.
Для поддержки записывайте политику, версию браузера и воспроизводимую нагрузку, а не группу памяти. Агрегированные отчёты позволяют сравнивать политики без отслеживания человека.
Планируйте изменения и восстановление
У политики должны быть владелец, условие отката и дата проверки. Повторяйте нагрузку после изменения браузера, пакета, медиа или хоста. Сохраняйте базовый путь до получения новых данных.
Восстановление тоже относится к производительности: отменяйте необязательную работу, освобождайте буферы и не создавайте циклы повторов под нагрузкой. Эти меры полезны для любого объёма памяти.
Описывайте публичную границу
Документация должна говорить, что API - приблизительная необязательная подсказка и что базовый путь сохраняется. Укажите также, что API не измеряет свободную память, не гарантирует производительность, не идентифицирует устройство и не разрешает доступ к аккаунту.
Сохраняйте две публичные ссылки. Спецификация W3C подтверждает уменьшенное значение и причину приватности, MDN - ограниченную доступность. При изменении поддержки обновите описание и повторите тест запасного варианта.
Проверка должна охватывать отказ каждого необязательного ресурса: отменённая картинка сохраняет текст, недоступный worker даёт основной путь, а отсутствие кэша использует ограниченные запросы. Подсказка не видит временное давление и другие вкладки. Небольшие сценарии должны проверять загрузку, возврат, переходы, прерванную передачу и закрытие. Записывайте завершение, отмену, задержку и восстановление без содержимого и идентификаторов. Так политики улучшаются без превращения Device Memory API в профиль оборудования.
Команды с несколькими продуктами могут использовать общие названия политик и настраивать пределы для каждой нагрузки. Просмотрщик уменьшает предпросмотр, редактор уменьшает индексацию, но оба сообщают поддержку о политике reduced. Публикуйте понятное поведение, а не группу памяти. При недостатке данных сохраняйте простую политику вместо сбора новых идентифицирующих сведений.
Записи проверки должны быть небольшими и воспроизводимыми: обычно достаточно политики, нагрузки, версии браузера и результатов. Сценарий должен запускаться без доступа к закрытым страницам клиентов и сохранять данные для сравнения версий.
В производственной проверке также зафиксируйте, какой запасной вариант показан при отсутствии подсказки и может ли человек продолжить работу без изменения настройки. Так решение API связывается с реальным опытом: уменьшенное изображение, отложенный просмотр или меньшее число workers должны оставаться понятными и обратимыми. Такие поведенческие данные полезнее сохранённой аппаратной группы и упрощают повторную проверку после обновления.
Если серверу нужно объяснить выбор, записывайте только краткое имя политики и результат задачи. Не отправляйте подсказку как атрибут аккаунта: возможность отката и диагностики сохранится, а разовое решение совместимости не превратится в межсессионный профиль.
Практический список решений
- Проверьте
navigator.deviceMemory; никогда не предполагайте его наличие. - Определите базовый вариант, не зависящий от подсказки.
- Используйте широкие обратимые варианты ресурсов, а не ярлыки устройств.
- Измеряйте результаты задачи и меняйте бюджеты по наблюдаемым сбоям.
- Не помещайте значение в идентификаторы, журналы и удалённые запросы, если пользователь не понимает цель.
Источники
Похожие статьи
Переведите BotBrowser из исследований в продакшн
Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.