OS Detect
Лёгкое определение ОС, форм-фактора и рантайм-окружения для браузера, Node.js и SSR — с React-хуками и Vue composables. Без зависимостей.
Возможности
getOS()— возвращает типизированный строковый идентификатор текущей ОС; приоритет проверки гарантирует, что ChromeOS никогда не определится как Linux- Булевы функции —
detectIsIOS(),detectIsMacOS(),detectIsAndroid(),detectIsWindows(),detectIsLinux(),detectIsChromeOS()— все синхронные и кэшируемые detectIsWindows11()— асинхронная; используетnavigator.userAgentData.getHighEntropyValues()в браузере иos.release()в Node.js- Категория устройства —
isMobileDevice()иisDesktopDevice()для быстрых грубых проверок getFormFactor()—'phone' | 'tablet' | 'desktop' | 'tv', по ОС и физическому размеру экрана, а не по наличию тачскрина — сенсорный ноутбук на Windows всё равно'desktop'detectHasTouch()иgetPrimaryInput()— есть ли у устройства сенсорный экран вообще, и какой тип ввода ('mouse'|'touch') сейчас реально основной; второе обновляется вживую на гибридных устройствах при подключении/отключении клавиатуры или мышиgetPixelRatio()иdetectIsTV()— соотношение физических и логических пикселей, и определение смарт-ТВ (best-effort)getRuntime()—'node' | 'browser' | 'webworker', а также отдельные проверкиdetectIsNode(),detectIsBrowser(),detectIsWebWorker(),detectIsElectron()иdetectIsPWA()- React-хуки —
useOS(),useIsWindows11(),useFormFactor(),useRuntime()и живойusePrimaryInput()изos-detect/react - Vue composables — те же пять, из
os-detect/vue, как readonly-ссылки - Поддержка Node.js — читает
process.platformв Node.js (в том числе на Node 21+, где рантайм добавляет собственный синтетический глобалnavigator);detectIsWindows11()использует номер сборки изos.release() - Определение iPadOS 13+ — корректно определяет iPad, отправляющие
Macintoshв userAgent, черезnavigator.maxTouchPoints - Кэш результатов — каждая функция кэширует свой результат после первого вызова, кроме
getPrimaryInput()/getPixelRatio()(намеренно живые — см. API Reference) - Никаких runtime-зависимостей — никаких внешних пакетов; React и Vue — опциональные peer-зависимости
- Tree-shakeable ESM — импортируйте только то, что используете; UMD- и CJS-сборки также включены
Как это работает
Браузер — сначала проверяет navigator.userAgentData.platform (Chrome 90+ / Edge 90+, не подделывается через переопределение userAgent), затем переходит на разбор navigator.userAgent регулярным выражением для браузеров, которые его не реализуют (Firefox, Safari, старый Chrome).
Node.js — читает process.platform напрямую; парсинг userAgent на сервере не выполняется. detectIsWindows11() дополнительно динамически импортирует встроенный модуль os и разбирает номер сборки из os.release().
Все результаты кэшируются в переменных уровня модуля после первого вызова, поэтому повторные вызовы в функциях рендера или computed-свойствах практически бесплатны — см. resetDetectionCache(), если нужно принудительно повторить проверку.
Форм-фактор и рантайм-окружение работают по той же идее, с двумя намеренными исключениями. getFormFactor() и getRuntime() собраны из таких же кэшируемых синхронных проверок, что и getOS(). getPrimaryInput() и getPixelRatio() не кэшируются — основной тип ввода на гибридном устройстве или соотношение пикселей окна могут по-настоящему измениться прямо во время сессии, поэтому обе функции каждый раз заново читают живой сигнал вместо того, чтобы навсегда замораживать первый ответ.