Remix Installation
step 1: Install react-page-tracker
npm install react-page-tracker
step 2: Add PageTracker to your layout component
force Vite to build to CommonJS
vite.config.ts
export default defineConfig({ + ssr: { + noExternal: ['react-page-tracker'], // force Vite to build to CommonJS + }, plugins: [ remix({ future: { v3_fetcherPersist: true, v3_relativeSplatPath: true, v3_throwAbortReason: true, v3_singleFetch: true, v3_lazyRouteDiscovery: true, }, }), tsconfigPaths(), ], });
root.tsx
import { Links, Meta, Outlet, Scripts, ScrollRestoration } from '@remix-run/react'; import type { LinksFunction } from '@remix-run/node'; import './tailwind.css'; + import { PageTracker } from 'react-page-tracker'; export const links: LinksFunction = () => [ { rel: 'preconnect', href: 'https://fonts.googleapis.com' }, { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossOrigin: 'anonymous', }, ]; export function Layout({ children }: { children: React.ReactNode }) { return ( <html lang="en"> <head> <meta charSet="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <Meta /> <Links /> </head> <body> + <PageTracker /> {children} <ScrollRestoration /> <Scripts /> </body> </html> ); } export default function App() { return <Outlet />; }
You are all set up! Now you can access the page tracking information in any component.
step 3: Access the page value in any component
component.tsx
import { usePageTrackerStore } from 'react-page-tracker'; export const PageTrackerValue = () => { // get all state const state = usePageTrackerStore((state) => state); // get the specific state you'd like to use const pickState = usePageTrackerStore((state) => ({ isFirstPage: state.isFirstPage, referrer: state.referrer, pageHistory: state.pageHistory, })); return ( <div className="flex"> <div className="flex flex-col gap-3"> <pre className="rounded-md bg-gray-100 px-2 py-0.5 font-bold"> state: {JSON.stringify(state)} </pre> <pre className="rounded-md bg-gray-100 px-2 py-0.5 font-bold"> pickState: {JSON.stringify(pickState)} </pre> </div> </div> ); };