Skip to content

Commit

Permalink
templates: have loadContext available in handleRequest (#6190)
Browse files Browse the repository at this point in the history
  • Loading branch information
MichaelDeBoey authored May 25, 2023
1 parent 3239ba9 commit f0e4b94
Show file tree
Hide file tree
Showing 24 changed files with 87 additions and 52 deletions.
8 changes: 6 additions & 2 deletions docs/guides/migrating-react-router-app.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,10 @@ Let's start by creating two new files:
```tsx filename=app/entry.server.tsx
import { PassThrough } from "stream";

import type { EntryContext } from "@remix-run/node";
import type {
AppLoadContext,
EntryContext,
} from "@remix-run/node";
import { Response } from "@remix-run/node";
import { RemixServer } from "@remix-run/react";
import isbot from "isbot";
Expand All @@ -60,7 +63,8 @@ export default function handleRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
loadContext: AppLoadContext
) {
return isbot(request.headers.get("user-agent"))
? handleBotRequest(
Expand Down
11 changes: 7 additions & 4 deletions docs/guides/streaming.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,12 @@ Let's take a dive into how to accomplish this.

First, to enable streaming with React 18, you'll update your `entry.server.tsx` file to use `renderToPipeableStream`. Here's a simple (and incomplete) version of that:

```tsx filename=app/entry.server.tsx lines=[1,9,18,25,30,35]
```tsx filename=app/entry.server.tsx lines=[1,10,20,27,32,37]
import { PassThrough } from "stream";

import { Response } from "@remix-run/node"; // or cloudflare/deno
import type {
AppLoadContext,
EntryContext,
Headers,
} from "@remix-run/node"; // or cloudflare/deno
Expand All @@ -95,7 +96,8 @@ export default function handleRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
loadContext: AppLoadContext
) {
return new Promise((resolve) => {
const { pipe } = renderToPipeableStream(
Expand Down Expand Up @@ -126,7 +128,7 @@ export default function handleRequest(
<details>
<summary>For a more complete example, expand this</summary>

This handles errors and properly disables streaming for bots which you typically want to force waiting so you can display all the content for SEO purposes.
This handles errors and properly disables streaming for bots which you typically want to force waiting, so you can display all the content for SEO purposes.

```tsx filename=app/entry.server.tsx
import { PassThrough } from "stream";
Expand All @@ -146,7 +148,8 @@ export default function handleRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
loadContext: AppLoadContext
) {
// If the request is from a bot, we want to wait for the full
// response to render before sending it to the client. This
Expand Down
10 changes: 7 additions & 3 deletions docs/guides/styling.md
Original file line number Diff line number Diff line change
Expand Up @@ -635,8 +635,11 @@ Here's some sample code to show how you might use Styled Components with Remix (
2. Your `entry.server.tsx` will look something like this:
```tsx filename=entry.server.tsx lines=[4,12,15-20,22-23]
import type { EntryContext } from "@remix-run/node"; // or cloudflare/deno
```tsx filename=entry.server.tsx lines=[7,16,19-24,26-27]
import type {
AppLoadContext,
EntryContext,
} from "@remix-run/node"; // or cloudflare/deno
import { RemixServer } from "@remix-run/react";
import { renderToString } from "react-dom/server";
import { ServerStyleSheet } from "styled-components";
Expand All @@ -645,7 +648,8 @@ Here's some sample code to show how you might use Styled Components with Remix (
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
loadContext: AppLoadContext
) {
const sheet = new ServerStyleSheet();

Expand Down
10 changes: 7 additions & 3 deletions docs/route/headers.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,16 +91,20 @@ All that said, you can avoid this entire problem by _not defining headers in par

Note that you can also add headers in your `entry.server` file for things that should be global, for example:

```tsx lines=[16]
import type { EntryContext } from "@remix-run/node"; // or cloudflare/deno
```tsx lines=[20]
import type {
AppLoadContext,
EntryContext,
} from "@remix-run/node"; // or cloudflare/deno
import { RemixServer } from "@remix-run/react";
import { renderToString } from "react-dom/server";

export default function handleRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
loadContext: AppLoadContext
) {
const markup = renderToString(
<RemixServer context={remixContext} url={request.url} />
Expand Down
5 changes: 3 additions & 2 deletions integration/defer-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -949,7 +949,7 @@ test.describe("aborted", () => {
files: {
"app/entry.server.tsx": js`
import { PassThrough } from "stream";
import type { EntryContext } from "@remix-run/node";
import type { AppLoadContext, EntryContext } from "@remix-run/node";
import { Response } from "@remix-run/node";
import { RemixServer } from "@remix-run/react";
import isbot from "isbot";
Expand All @@ -961,7 +961,8 @@ test.describe("aborted", () => {
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
loadContext: AppLoadContext
) {
return isbot(request.headers.get("user-agent"))
? handleBotRequest(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { PassThrough } from "stream";
import type { EntryContext } from "@remix-run/node";
import type { AppLoadContext, EntryContext } from "@remix-run/node";
import { Response } from "@remix-run/node";
import { RemixServer } from "@remix-run/react";
import { renderToPipeableStream } from "react-dom/server";
Expand All @@ -10,7 +10,8 @@ export default function handleRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
loadContext: AppLoadContext
) {
return new Promise((resolve, reject) => {
let { pipe, abort } = renderToPipeableStream(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { PassThrough } from "stream";
import type { EntryContext } from "@remix-run/node";
import type { AppLoadContext, EntryContext } from "@remix-run/node";
import { Response } from "@remix-run/node";
import { RemixServer } from "@remix-run/react";
import { renderToPipeableStream } from "react-dom/server";
Expand All @@ -10,7 +10,8 @@ export default function handleRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
loadContext: AppLoadContext
) {
return new Promise((resolve, reject) => {
let { pipe, abort } = renderToPipeableStream(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import type { EntryContext } from "@remix-run/node";
import type { AppLoadContext, EntryContext } from "@remix-run/node";
import { RemixServer } from "@remix-run/react";
import { renderToString } from "react-dom/server";

export default function handleRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
loadContext: AppLoadContext
) {
// eslint-disable-next-line testing-library/render-result-naming-convention
let markup = renderToString(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { EntryContext } from "@remix-run/cloudflare";
import type { AppLoadContext, EntryContext } from "@remix-run/cloudflare";
import { RemixServer } from "@remix-run/react";
import isbot from "isbot";
import { renderToReadableStream } from "react-dom/server";
Expand All @@ -7,7 +7,8 @@ export default async function handleRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
loadContext: AppLoadContext
) {
const body = await renderToReadableStream(
<RemixServer context={remixContext} url={request.url} />,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import type { EntryContext } from "@remix-run/cloudflare";
import type { AppLoadContext, EntryContext } from "@remix-run/cloudflare";
import { RemixServer } from "@remix-run/react";
import { renderToString } from "react-dom/server";

export default function handleRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
loadContext: AppLoadContext
) {
let markup = renderToString(
<RemixServer context={remixContext} url={request.url} />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { EntryContext } from "@remix-run/deno";
import type { AppLoadContext, EntryContext } from "@remix-run/deno";
import { RemixServer } from "@remix-run/react";
import isbot from "isbot";
import { renderToReadableStream } from "react-dom/server";
Expand All @@ -7,7 +7,8 @@ export default async function handleRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
loadContext: AppLoadContext
) {
const body = await renderToReadableStream(
<RemixServer context={remixContext} url={request.url} />,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import type { EntryContext } from "@remix-run/deno";
import type { AppLoadContext, EntryContext } from "@remix-run/deno";
import { RemixServer } from "@remix-run/react";
import { renderToString } from "react-dom/server";

export default function handleRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
loadContext: AppLoadContext
) {
let markup = renderToString(
<RemixServer context={remixContext} url={request.url} />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { PassThrough } from "stream";

import type { EntryContext } from "@remix-run/node";
import type { AppLoadContext, EntryContext } from "@remix-run/node";
import { Response } from "@remix-run/node";
import { RemixServer } from "@remix-run/react";
import isbot from "isbot";
Expand All @@ -12,7 +12,8 @@ export default function handleRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
loadContext: AppLoadContext
) {
return isbot(request.headers.get("user-agent"))
? handleBotRequest(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import type { EntryContext } from "@remix-run/node";
import type { AppLoadContext, EntryContext } from "@remix-run/node";
import { RemixServer } from "@remix-run/react";
import { renderToString } from "react-dom/server";

export default function handleRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
loadContext: AppLoadContext
) {
let markup = renderToString(
<RemixServer context={remixContext} url={request.url} />
Expand Down
5 changes: 3 additions & 2 deletions scripts/playground/template/app/entry.server.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { PassThrough } from "stream";
import type { EntryContext } from "@remix-run/node";
import type { AppLoadContext, EntryContext } from "@remix-run/node";
import { Response } from "@remix-run/node";
import { RemixServer } from "@remix-run/react";
import isbot from "isbot";
Expand All @@ -11,7 +11,8 @@ export default function handleRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
loadContext: AppLoadContext
) {
let callbackName = isbot(request.headers.get("user-agent"))
? "onAllReady"
Expand Down
5 changes: 3 additions & 2 deletions templates/arc/app/entry.server.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import { PassThrough } from "node:stream";

import type { EntryContext } from "@remix-run/node";
import type { AppLoadContext, EntryContext } from "@remix-run/node";
import { Response } from "@remix-run/node";
import { RemixServer } from "@remix-run/react";
import isbot from "isbot";
Expand All @@ -18,7 +18,8 @@ export default function handleRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
loadContext: AppLoadContext
) {
return isbot(request.headers.get("user-agent"))
? handleBotRequest(
Expand Down
5 changes: 3 additions & 2 deletions templates/cloudflare-pages/app/entry.server.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* For more information, see https://remix.run/file-conventions/entry.server
*/

import type { EntryContext } from "@remix-run/cloudflare";
import type { AppLoadContext, EntryContext } from "@remix-run/cloudflare";
import { RemixServer } from "@remix-run/react";
import isbot from "isbot";
import { renderToReadableStream } from "react-dom/server";
Expand All @@ -13,7 +13,8 @@ export default async function handleRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
loadContext: AppLoadContext
) {
const body = await renderToReadableStream(
<RemixServer context={remixContext} url={request.url} />,
Expand Down
5 changes: 3 additions & 2 deletions templates/cloudflare-workers/app/entry.server.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* For more information, see https://remix.run/file-conventions/entry.server
*/

import type { EntryContext } from "@remix-run/cloudflare";
import type { AppLoadContext, EntryContext } from "@remix-run/cloudflare";
import { RemixServer } from "@remix-run/react";
import isbot from "isbot";
import { renderToReadableStream } from "react-dom/server";
Expand All @@ -13,7 +13,8 @@ export default async function handleRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
loadContext: AppLoadContext
) {
const body = await renderToReadableStream(
<RemixServer context={remixContext} url={request.url} />,
Expand Down
5 changes: 3 additions & 2 deletions templates/deno/app/entry.server.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* For more information, see https://remix.run/file-conventions/entry.server
*/

import type { EntryContext } from "@remix-run/deno";
import type { AppLoadContext, EntryContext } from "@remix-run/deno";
import { RemixServer } from "@remix-run/react";
import isbot from "isbot";
import { renderToReadableStream } from "react-dom/server";
Expand All @@ -14,6 +14,7 @@ export default async function handleRequest(
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext,
loadContext: AppLoadContext
) {
const body = await renderToReadableStream(
<RemixServer context={remixContext} url={request.url} />,
Expand All @@ -23,7 +24,7 @@ export default async function handleRequest(
console.error(error);
responseStatusCode = 500;
},
},
}
);

if (isbot(request.headers.get("user-agent"))) {
Expand Down
5 changes: 3 additions & 2 deletions templates/express/app/entry.server.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import { PassThrough } from "node:stream";

import type { EntryContext } from "@remix-run/node";
import type { AppLoadContext, EntryContext } from "@remix-run/node";
import { Response } from "@remix-run/node";
import { RemixServer } from "@remix-run/react";
import isbot from "isbot";
Expand All @@ -18,7 +18,8 @@ export default function handleRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
loadContext: AppLoadContext
) {
return isbot(request.headers.get("user-agent"))
? handleBotRequest(
Expand Down
Loading

0 comments on commit f0e4b94

Please sign in to comment.