Responsive Media
2.2.2
2026-10-02
- Изменено: общий объект
responsiveState, который создаётся один раз на весь пакет, раньше создавался в момент загрузки любой части пакета, поэтому сборщик не мог его убрать. Теперь он создаётся в отдельном исходном файле, а вpackage.jsonпакет объявляетsideEffects: false. Сборщик больше не оставляет общее состояние, если импортируется только часть пакета:useMediaQueryизresponsive-media/vueуменьшился примерно с 6,7 кБ до 0,6 кБ в минифицированном виде, аresponsive-media/container— с 7,7 кБ до 6,8 кБ. Поведение и публичный API не изменились. - Добавлено:
npm run sizeв репозитории пакета измеряет все точки входа и типичные импорты. Результат tree-shaking охраняет тест. См. Справочник.
2.2.1
2026-10-02
- Исправлено: при отложенной гидратации компонент, который гидратируется позже первого тика после монтирования — асинхронный компонент, лениво гидратируемая секция, — встречал настоящее состояние вместо серверного и расходился. Плагин Vue теперь принимает
commit: 'manual': значения сервера остаются, пока не вызванаcommitHydration(), а запасным вариантом служитcommitTimeout(по умолчанию 10 секунд);defineResponsive()возвращаетcommitHydrationрядом сplugin. Модуль Nuxt использует это: он переключает, когда Nuxt сообщаетapp:suspense:resolve, то есть когда страница догидратировалась. Для обычного Vue по умолчанию остаётся'auto'— следующий тик после монтирования. См. SSR и гидратация.
2.2.0
2026-10-02
- Новое: гидратация без несовпадений. В Vue
defineResponsive()принимаетhydration: 'deferred': пока приложение монтируется поверх серверной разметки, плагин держит значения сервера и применяет настоящие на следующем тике, так что Vue не сообщает о несовпадении при гидратации. Клиентское приложение никогда не откладывается. В React хуки теперь возвращают серверный снимок (getSsrState()) какgetServerSnapshot, поэтому гидратация больше не заканчивается recoverable-ошибкой, когда размер браузера отличается отssrState. См. SSR и гидратация. - Новое: подсказки запроса для сервера.
resolveSsrState(config, input, options?)выбирает серверное состояние поcookie(собственные<ширина>x<высота>браузера) иuser-agent(mobile,tabletилиdesktop), а составными частями служатdetectDevice(),serializeViewportCookie(),parseViewportCookie(),statesFromSize()иgetSsrState(). В Vue плагин принимает результат какapp.use(plugin, { ssrState }), а на сервере даёт каждому приложению собственное состояние, так что параллельные запросы больше не делят одно. - Новое:
useMediaQuery()в Vue принимает строку, ref или геттер и пересоздаёт подписку при изменении запроса. - Новое:
useResponsiveValue(map, fallback?)в Vue и React — значение первого активного брейкпоинта изmap; типизируется по конфигу, если пришёл изdefineResponsive(). - Новое:
useUserPreferences()в Vue и React —dark,light,reducedMotion,highContrast,lowContrast,noHover,coarsePointer,forcedColorsиprintповерх пресета доступности, без настройки; иgetUserPreferencesState()для обычного JavaScript. - Новое:
useViewportSize(options?)в Vue и React, а в ядреgetViewportSize()/subscribeViewportSize()— размер окна числами, с ограничением частоты. - Новое: CSS из того же конфига —
toMediaQueries(),toScssModule(),toScssMap(),toCustomMedia()иtoTailwindScreens(). См. Интеграция с CSS. - Новое:
responsive-media/testing—createViewportMock()заменяетwindow.matchMediaуправляемым вьюпортом (setViewport(),setFeature()), аevaluateMediaQuery()— сам вычислитель. См. Тестирование. - Новое в модуле Nuxt:
hydration(по умолчанию'deferred'),ssrHints('cookie','user-agent'),ssrDevices,cookie,devBadge(плашка с брейкпоинтом при разработке) иcss(scss,customMedia— генерируемые файлы стилей).useResponsiveValue,useUserPreferencesиuseViewportSizeтоже подключаются автоматически. Ключresponsiveвnuxt.config.tsтеперь типизирован, так что редактор подсказывает и проверяет его. См. Интеграция с Nuxt. - Изменено: модуль Nuxt теперь по умолчанию использует
hydration: 'deferred', так что первый рендер на клиенте использует значения сервера, а настоящие приходят сразу после монтирования. Чтобы сохранить поведение 2.1, задайтеhydration: 'immediate'. - Исправлено:
useResponsive()в React возвращал настоящее состояние как серверный снимок, из-за чего гидратация расходилась всякий раз, когда размер браузера отличался от догадки сервера. Теперь он возвращает серверный снимок. - Документация: Другие фреймворки показывает Svelte, Solid и Angular на существующем объекте состояния, который уже следует контракту стора.