Framework integrations
get-browser is framework-agnostic — it's just functions. But sometimes you want a typed hook / composable that re-renders on the values you care about. These are copy-paste recipes you can drop into your project.
React hook
src/hooks/use-browser.ts
import { useSyncExternalStore } from 'react';
import { type Browser, detect } from 'get-browser';
const subscribe = () => () => {};
const getServerSnapshot = (): Browser => 'unknown';
export function useBrowser(): Browser {
return useSyncExternalStore(subscribe, () => detect(), getServerSnapshot);
}
Usage:
import { useBrowser } from './hooks/use-browser';
import { browsers } from 'get-browser';
function DownloadBadge() {
const browser = useBrowser();
return browser === browsers.SAFARI ? <SafariBadge /> : <ChromeBadge />;
}
Why
useSyncExternalStore? It's the React-recommended way to read a non-React data source so SSR and CSR snapshots stay consistent. The emptysubscribeis intentional — the user-agent doesn't change during a session, so we never re-fire.
For a hook that updates when you pass a custom UA at runtime (e.g. in tests), wrap detect in useMemo:
import { useMemo } from 'react';
import { detect } from 'get-browser';
export function useBrowserWithOverride(userAgent?: string) {
return useMemo(() => detect(userAgent ? { userAgent } : undefined), [userAgent]);
}
Vue 3 composable
src/composables/useBrowser.ts
import { ref } from 'vue';
import { type Browser, detect } from 'get-browser';
export function useBrowser() {
const browser = ref<Browser>(detect());
return { browser };
}
Usage:
<script setup lang="ts">
import { useBrowser } from '@/composables/useBrowser';
import { browsers } from 'get-browser';
const { browser } = useBrowser();
</script>
<template>
<p v-if="browser === browsers.IE">Please upgrade your browser.</p>
</template>
Svelte 5 store
src/lib/browser.svelte.ts
import { detect, type Browser } from 'get-browser';
export function createBrowser() {
let value = $state<Browser>('unknown');
if (typeof window !== 'undefined') {
value = detect();
}
return {
get value() {
return value;
},
};
}
Usage:
<script lang="ts">
import { createBrowser } from '$lib/browser.svelte.ts';
import { browsers } from 'get-browser';
const browser = createBrowser();
</script>
{#if browser.value === browsers.SAFARI}
<p>You're on Safari.</p>
{/if}
Solid signal
src/lib/browser.ts
import { createSignal } from 'solid-js';
import { detect, type Browser } from 'get-browser';
export const [browser, setBrowser] = createSignal<Browser>(detect());
Usage:
import { browser } from './lib/browser';
import { browsers } from 'get-browser';
function App() {
return (
<Show when={browser() === browsers.SAFARI}>
<SafariOnly />
</Show>
);
}
Angular service
src/app/browser.service.ts
import { Injectable } from '@angular/core';
import { detect, type Browser } from 'get-browser';
@Injectable({ providedIn: 'root' })
export class BrowserService {
readonly browser: Browser = detect();
}