Skip to content

Commit

Permalink
templates: have loadContext available in handleRequest
Browse files Browse the repository at this point in the history
  • Loading branch information
MichaelDeBoey committed May 1, 2023
1 parent bc08834 commit 4ab3f8a
Show file tree
Hide file tree
Showing 24 changed files with 164 additions and 92 deletions.
17 changes: 11 additions & 6 deletions docs/guides/migrating-react-router-app.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ 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,28 +60,32 @@ export default function handleRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
loadContext: AppLoadContext
) {
return isbot(request.headers.get("user-agent"))
? handleBotRequest(
request,
responseStatusCode,
responseHeaders,
remixContext
remixContext,
loadContext
)
: handleBrowserRequest(
request,
responseStatusCode,
responseHeaders,
remixContext
remixContext,
loadContext
);
}

function handleBotRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
_loadContext: AppLoadContext
) {
return new Promise((resolve, reject) => {
const { pipe, abort } = renderToPipeableStream(
Expand Down Expand Up @@ -123,7 +127,8 @@ function handleBrowserRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
_loadContext: AppLoadContext
) {
return new Promise((resolve, reject) => {
const { pipe, abort } = renderToPipeableStream(
Expand Down
23 changes: 15 additions & 8 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 All @@ -156,23 +159,26 @@ export default function handleRequest(
request,
responseStatusCode,
responseHeaders,
remixContext
remixContext,
loadContext
);
}

return serveBrowsers(
request,
responseStatusCode,
responseHeaders,
remixContext
remixContext,
loadContext
);
}

function serveTheBots(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
_loadContext: AppLoadContext
) {
return new Promise((resolve, reject) => {
const { pipe, abort } = renderToPipeableStream(
Expand Down Expand Up @@ -207,7 +213,8 @@ function serveBrowsers(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
_loadContext: AppLoadContext
) {
return new Promise((resolve, reject) => {
let didError = false;
Expand Down
10 changes: 7 additions & 3 deletions docs/guides/styling.md
Original file line number Diff line number Diff line change
Expand Up @@ -633,8 +633,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 @@ -643,7 +646,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
17 changes: 11 additions & 6 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,28 +961,32 @@ test.describe("aborted", () => {
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
loadContext: AppLoadContext
) {
return isbot(request.headers.get("user-agent"))
? handleBotRequest(
request,
responseStatusCode,
responseHeaders,
remixContext
remixContext,
loadContext
)
: handleBrowserRequest(
request,
responseStatusCode,
responseHeaders,
remixContext
remixContext,
loadContext
);
}
function handleBotRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
_loadContext: AppLoadContext
) {
return new Promise((resolve, reject) => {
let didError = false;
Expand Down Expand Up @@ -1027,7 +1031,8 @@ test.describe("aborted", () => {
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext
remixContext: EntryContext,
_loadContext: AppLoadContext
) {
return new Promise((resolve, reject) => {
let didError = false;
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
Loading

0 comments on commit 4ab3f8a

Please sign in to comment.