logo
  • Guide
  • Config
  • Plugin
  • API
  • Examples
  • Community
  • Modern.js 2.x Docs
  • English
    • 简体中文
    • English
    • Commands
      File Conventions
      src/
      App.tsx
      entry.ts
      entry.server.tsx
      modern.runtime.ts
      routes/
      *.[server|node].tsx
      api/
      lambda/*.ts
      server/
      modern.server.ts
      shared/
      config/
      html/
      favicon.*
      icon.*
      mock/
      public/
      upload/
      modern.config.ts
      Runtime
      Core
      createRoot
      render
      RuntimeContext
      Router
      router
      SSR
      NoSSR
      renderStreaming
      renderString
      createRequestHandler
      BFF
      useHonoContext
      Utility
      CSS-In-JS API
      Head
      loadable
      📝 Edit this page
      Previous pagerenderNext pagerouter

      #RuntimeContext

      RuntimeContext is a React Context used to get Runtime context information in components. This Context can be accessed through React's use or useContext API.

      Warning

      The useRuntimeContext Hook has been deprecated. Please use use(RuntimeContext) instead. useRuntimeContext is internally implemented as useContext(RuntimeContext), while use(RuntimeContext) is the recommended new approach in React 19.

      #Usage

      import { use } from 'react';
      import { RuntimeContext } from '@modern-js/runtime';
      
      export function App() {
        const runtimeContext = use(RuntimeContext); // You can also use useContext(RuntimeContext)
        return <div>Hello World</div>
      }

      #Type Definition

      type TRuntimeContext = {
        initialData?: Record<string, unknown>;
        isBrowser: boolean;
        routes?: RouteObject[];
        requestContext: RequestContext;
        /**
         * @deprecated Use `requestContext` instead
         */
        context: RequestContext;
        [key: string]: unknown;
      };

      #Property Description

      • isBrowser: Indicates whether the current runtime environment is a browser
      • routes: Route configuration information
      • requestContext: Request context, containing request and response objects
      • context: Deprecated, please use requestContext instead

      #RequestContext

      RequestContext is the type of the requestContext property, containing request and response related information:

      type RequestContext = {
        request: {
          params: Record<string, string>;      // Route parameters
          pathname: string;                     // Pathname
          query: Record<string, string>;        // Query parameters
          headers: IncomingHttpHeaders;         // Request headers
          host: string;                         // Hostname
          url: string;                          // Full URL
          referer?: string;                     // Referrer page
          userAgent?: string;                   // User agent
          cookie?: string;                      // Cookie string
          cookieMap?: Record<string, string>;   // Cookie map object
        };
        response: {
          setHeader: (key: string, value: string) => void;  // Set response header (server-side only)
          status: (code: number) => void;                   // Set status code (server-side only)
          locals: Record<string, any>;                      // Local data
        };
      };

      Notes:

      • response.setHeader and response.status are only available on the server-side (SSR)
      • On the browser side, the response object may not contain these methods
      • The request object is available on both server and browser, but server-side information is more complete

      #Usage Examples

      #Distinguishing Runtime Environment

      import { use } from 'react';
      import { RuntimeContext } from '@modern-js/runtime';
      
      function App() {
        const { context, isBrowser } = use(RuntimeContext);
      
        if (isBrowser === true) {
          // Browser-side execution logic
          console.log('browser render')
        } else {
          // Server-side execution logic
          // Note: Functions like logger need to be injected into context through Runtime plugins
          console.log('server render')
        }
      }

      #Getting Request Context

      When SSR is enabled, isomorphic request context can be obtained in both Node environment and browser environment.

      The slight difference is that the Node environment also supports setting response headers, response codes, and provides Logger logging and Metrics tracking.

      Tip

      When SSR is not enabled, only the information that can be obtained on the browser side is included.

      import { use } from 'react';
      import { RuntimeContext } from '@modern-js/runtime';
      
      function App() {
        const runtimeContext = use(RuntimeContext);
        const { request, response } = runtimeContext.requestContext || {};
      
        // Access request information
        const userAgent = request?.userAgent || request?.headers?.['user-agent'];
        const url = request?.url;
        const query = request?.query;
        const params = request?.params;
      
        // Server-side can set response headers
        if (!runtimeContext.isBrowser && response) {
          response.setHeader('X-Custom-Header', 'value');
          response.status(200);
        }
      
        return (
          <div>
            <div>User Agent: {userAgent}</div>
            <div>URL: {url}</div>
            <div>Query: {JSON.stringify(query)}</div>
          </div>
        );
      }

      #Accessing Injected Global Data

      Global data can be injected into RuntimeContext through the onBeforeRender hook of Runtime plugins:

      import { use } from 'react';
      import { RuntimeContext } from '@modern-js/runtime';
      
      export default function MyComponent() {
        const context = use(RuntimeContext);
        const { message } = context;
      
        return <div>{message}</div>;
      }