Examples
Device Redirect
Redirect users to the appropriate version based on device type:
typescript
import uaBrowser from 'ua-browser'
const { device } = uaBrowser()
if (device === 'Mobile' || device === 'Tablet') {
window.location.href = 'https://m.example.com'
}Block Bot Requests
Filter crawler traffic in server-side middleware:
typescript
import { parseUA } from 'ua-browser'
// Express / Koa middleware
function blockBots(req, res, next) {
const ua = req.headers['user-agent'] ?? ''
const { isBot, botName } = parseUA(ua)
if (isBot) {
console.log(`Bot blocked: ${botName}`)
return res.status(403).end()
}
next()
}Block Headless Browsers
Prevent automated script access:
typescript
import uaBrowser from 'ua-browser'
const { isHeadless, isBot } = uaBrowser()
if (isHeadless || isBot) {
document.body.innerHTML = 'Access denied.'
}Load Browser-specific Polyfills
Load polyfills or fallbacks for specific browsers:
typescript
import uaBrowser from 'ua-browser'
const { browser, version } = uaBrowser()
if (browser === 'IE') {
await import('./polyfills/ie.js')
} else if (browser === 'Safari' && parseInt(version) < 14) {
await import('./polyfills/safari-legacy.js')
}SSR / Node.js — Parse Request UA
Return differentiated content based on UA in server-side rendering:
typescript
import { parseUA } from 'ua-browser'
// Next.js / Nuxt SSR
export async function getServerSideProps({ req }) {
const ua = req.headers['user-agent'] ?? ''
const { device, os, browser } = parseUA(ua)
return {
props: {
isMobile: device === 'Mobile',
isIOS: os === 'iOS',
isWeChat: browser === 'Wechat',
},
}
}Accurate Windows 10 / 11 Detection
Windows 10 and 11 share the same UA string. Use navigator.userAgentData to distinguish them:
typescript
import { parseUA, getWindowsVersion, getNavContext } from 'ua-browser'
const nav = getNavContext()
const windowsVersion = await getWindowsVersion(nav)
const { os, osVersion } = parseUA(navigator.userAgent, { nav, windowsVersion })
console.log(os) // 'Windows'
console.log(osVersion) // '11' or '10'Vue Composable
typescript
// composables/useBrowser.ts
import { ref, onMounted } from 'vue'
import uaBrowser from 'ua-browser'
import type { EnvOption } from 'ua-browser'
export function useBrowser() {
const info = ref<EnvOption | null>(null)
onMounted(() => {
info.value = uaBrowser()
})
return { info }
}vue
<script setup lang="ts">
import { useBrowser } from '@/composables/useBrowser'
const { info } = useBrowser()
</script>
<template>
<div v-if="info">
{{ info.browser }} {{ info.version }} on {{ info.os }}
</div>
</template>React Hook
typescript
// hooks/useBrowser.ts
import { useState, useEffect } from 'react'
import uaBrowser from 'ua-browser'
import type { EnvOption } from 'ua-browser'
export function useBrowser(): EnvOption | null {
const [info, setInfo] = useState<EnvOption | null>(null)
useEffect(() => {
setInfo(uaBrowser())
}, [])
return info
}tsx
import { useBrowser } from '@/hooks/useBrowser'
export function BrowserInfo() {
const info = useBrowser()
if (!info) return null
return (
<p>{info.browser} {info.version} on {info.os}</p>
)
}High-Accuracy Architecture Detection (getEnvContext)
Collect WebGL renderer, Client Hints, and other signals to distinguish Apple Silicon from Intel Mac:
typescript
import { getEnvContext, parseUA } from 'ua-browser'
const ctx = await getEnvContext()
const result = parseUA(navigator.userAgent, { ctx })
console.log(result.arch) // 'arm64' (Apple Silicon) or 'x86_64'SSR Precise Detection (parseHeaders + Client Hints)
Use HTTP Client Hints for accurate detection in Express / Next.js and similar server-side frameworks:
typescript
import { parseHeaders, ACCEPT_CH } from 'ua-browser'
// First response: tell the browser to send Client Hints
app.use((req, res, next) => {
res.setHeader('Accept-CH', ACCEPT_CH)
next()
})
// Subsequent requests: precise arch / OS detection
app.get('/api/info', (req, res) => {
const result = parseHeaders(req.headers)
res.json({
browser: result.browser,
os: result.os,
arch: result.arch, // 'x86_64' (from Sec-CH-UA-Arch)
})
})Use Standalone Detectors
Import only the detector you need to minimize bundle size:
typescript
import { detectArch } from 'ua-browser'
const arch = detectArch(navigator.userAgent)
// 'x86_64' | 'arm64' | 'arm' | 'x86' | 'unknown'
if (arch === 'arm64') {
console.log('Apple Silicon / ARM device')
}Analytics Reporting
Collect and report user environment data:
typescript
import uaBrowser from 'ua-browser'
const { browser, version, os, device, arch } = uaBrowser()
fetch('/api/analytics', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ browser, version, os, device, arch }),
})