Skip to content

解析函数


parseUA(ua, options?)

纯函数版本:无全局状态、无 DOM 访问。适合 SSR、Node.js 及单元测试。

typescript
import { parseUA } from 'ua-browser'

parseUA(ua: string, options?: ParseOptions): EnvOption
参数类型必填说明
uastring要解析的 UA 字符串
optionsParseOptions注入上下文,详见下表

ParseOptions 字段:

字段类型说明
navNavContext浏览器环境子集(语言、平台、触控点数)。使用 getNavContext()navigator 读取。
windowsVersionstring | nullgetWindowsVersion() 预先获取的 Windows 版本,用于区分 Windows 10 / 11。
ctxEnvContextgetEnvContext() 的返回值,包含完整多信号上下文。同时传入时优先级高于 navwindowsVersion
customBotDefsreadonly BotDef[]自定义 Bot 检测规则,插在 GenericBot 兜底之前,不影响全局状态。
languagestring显式语言覆盖(BCP47,如 "zh-CN")。优先级高于 nav/ctx 及 UA 推断,适合服务端传入 Accept-Language 请求头。

返回值: EnvOption

示例:

typescript
// 最简用法:仅 UA 字符串
const result = parseUA(navigator.userAgent)

// 注入 navigator 上下文(language/platform 已填充)
import { parseUA, getNavContext } from 'ua-browser'
const nav = getNavContext()
const result = parseUA(navigator.userAgent, { nav })
console.log(result.language) // 'zh-CN'
console.log(result.platform) // 'Win32'

// 注入完整环境上下文(启用多信号检测)
import { parseUA, getEnvContext } from 'ua-browser'
const ctx = await getEnvContext()
const result = parseUA(navigator.userAgent, { ctx })
console.log(result.arch) // 'arm64'(基于 WebGL / Client Hints)

// 自定义 Bot 规则
import { parseUA } from 'ua-browser'
import type { BotDef } from 'ua-browser'
const myBots: BotDef[] = [{ name: 'GenericBot', detect: /MyInternalCrawler/ }]
const result = parseUA(ua, { customBotDefs: myBots })


parseHeaders(headers)

从 HTTP 请求头中解析 UA 及 Client Hints,返回 EnvOption。适用于 SSR 精准检测场景。

typescript
import { parseHeaders, ACCEPT_CH } from 'ua-browser'

parseHeaders(headers: Record<string, string | string[] | undefined>): EnvOption
参数类型必填说明
headersRecord<string, string | string[] | undefined>HTTP 请求头对象(如 Express / Next.js 中的 req.headers

返回值: EnvOption

可读取的 Client Hints 请求头:

请求头数据
user-agent完整 UA 字符串
sec-ch-ua浏览器品牌列表
sec-ch-ua-full-version-list精确浏览器版本
sec-ch-ua-platform操作系统名称
sec-ch-ua-platform-versionOS 版本(可区分 Windows 10 / 11)
sec-ch-ua-archCPU 架构(如 x86arm
sec-ch-ua-mobile移动端标识

两阶段请求流程:

首次请求时浏览器只发送 user-agent。在响应中返回 ACCEPT_CH,告知支持的浏览器后续请求附带 Client Hints。

typescript
import { parseHeaders, ACCEPT_CH } from 'ua-browser'

// 第一次响应——告知浏览器上报 Client Hints
res.setHeader('Accept-CH', ACCEPT_CH)

// 后续请求携带 Client Hints 后
const result = parseHeaders(req.headers)
console.log(result.arch) // 'x86_64'(来自 Sec-CH-UA-Arch)
console.log(result.os)   // 'Windows'

注意事项:

  • 兼容 Express、Koa、Next.js API Route、Fastify、Hono 等任何以普通对象形式暴露请求头的框架。
  • Client Hints 请求头缺失时回退到纯 UA 解析。


ACCEPT_CH

包含 parseHeaders() 可消费的所有 Client Hints 请求头名称的常量字符串。将其设置为 Accept-CH 响应头,以请求支持的浏览器(Chrome / Edge 90+)在后续请求中携带这些信息。

typescript
import { ACCEPT_CH } from 'ua-browser'

ACCEPT_CH: string
// 'Sec-CH-UA, Sec-CH-UA-Full-Version-List, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version, Sec-CH-UA-Arch, Sec-CH-UA-Mobile'

示例:

typescript
res.setHeader('Accept-CH', ACCEPT_CH)
res.setHeader('Vary', 'Sec-CH-UA, Sec-CH-UA-Full-Version-List')  // 推荐同时设置

Released under the MIT License.