Server-Only Context for React Server Components

0.1.0 · active · verified Sun Apr 19

`server-only-context` is a lightweight utility designed to provide request-scoped context specifically for React Server Components (RSC). It helps mitigate the problem of prop drilling in server-side rendering environments by leveraging React's experimental `cache` function to store and retrieve values associated with the current request. This ensures that context values are isolated between different concurrent server requests, which is crucial for multi-user applications. The current stable version, 0.1.0, indicates it's an early-stage project that is actively developed but may still be subject to changes. Its core differentiator is its exclusive design for the server-side, contrasting with traditional React Context which is primarily client-side or hydrates from server-rendered content. It offers a straightforward API to create getter/setter tuples for managing context values.

Common errors

Warnings

Install

Imports

Quickstart

This quickstart demonstrates how to define server-only context and then set and retrieve values within a React Server Component structure, mimicking a typical page and its child components.

/* src/context/locale.ts */
import serverContext from 'server-only-context';
export const [getLocale, setLocale] = serverContext<string>('en');

/* src/context/user.ts */
export const [getUserId, setUserId] = serverContext<string>('');

/* src/app/layout.tsx */
// Example of a root layout that might set initial context
// import { setLocale, setUserId } from '@/context'; // In a real app, combine contexts into one file or use aliases
// export default function RootLayout({ children }: { children: React.ReactNode }) {
//   // In a real scenario, you'd extract locale/userId from headers or cookies here
//   setLocale('en-US'); 
//   setUserId('guest');
//   return <html><body>{children}</body></html>;
// }

/* src/app/[locale]/[userId]/page.tsx */
// This represents a server component page where context is set based on URL params
import { setLocale, setUserId } from '@/context/locale'; // Assume these are from a combined context file for brevity
import { getLocale, getUserId } from '@/context/user'; // Assume these are from a combined context file for brevity

interface UserPageProps {
  params: { 
    locale: string; 
    userId: string; 
  };
}

async function MyComponent() {
  // In a real app, this might be a child component deep in the tree
  const locale = getLocale();
  const userId = getUserId();

  return (
    <div>
      <p>Hello {userId || 'Guest'}!</p>
      <p>Current Locale is: {locale || 'Default'}</p>
      <p>This data was fetched using server-only context.</p>
    </div>
  );
}

export default async function UserPage({ params: { locale, userId } }: UserPageProps) {
  setLocale(locale);
  setUserId(userId);

  // Demonstrate subsequent access within the same request scope
  const currentLocaleCheck = getLocale();
  const currentUserIdCheck = getUserId();
  console.log(`Context set to: locale=${currentLocaleCheck}, userId=${currentUserIdCheck}`);

  return <MyComponent />;
}

view raw JSON →