Separate PPR from static optimization

This commit is contained in:
Sam Becker 2024-05-08 11:36:20 -05:00
parent e79a053b6d
commit aeba8d02c5
13 changed files with 76 additions and 110 deletions

View File

@ -94,7 +94,7 @@ _⚠ READ BEFORE PROCEEDING_
Application behavior can be changed by configuring the following environment variables:
- `NEXT_PUBLIC_PRO_MODE = 1` enables higher quality image storage (results in increased storage usage)
- `NEXT_PUBLIC_STATICALLY_OPTIMIZE = 1` enables PPR and static optimization, i.e., building pages ahead of time (results in increased storage usage)—⚠️ _Experimental_
- `NEXT_PUBLIC_STATICALLY_OPTIMIZE = 1` enables static optimization, i.e., renders pages and images at build time (results in increased project usage)—⚠️ _Experimental_
- `NEXT_PUBLIC_BLUR_DISABLED = 1` prevents image blur data being stored and displayed (potentially useful for limiting Postgres usage)
- `NEXT_PUBLIC_GEO_PRIVACY = 1` disables collection/display of location-based data
- `NEXT_PUBLIC_IGNORE_PRIORITY_ORDER = 1` prevents `priority_order` field affecting photo order

View File

@ -35,16 +35,6 @@ const nextConfig = {
.concat(createRemotePattern(HOSTNAME_AWS_S3)),
minimumCacheTTL: 31536000,
},
...process.env.NEXT_PUBLIC_STATICALLY_OPTIMIZE === '1' && {
experimental: { ppr: true },
},
webpack: (config) => {
config.optimization ??= {};
if (process.env.NODE_ENV !== 'production') {
config.optimization.minimize = false;
}
return config;
},
};
const withBundleAnalyzer = require('@next/bundle-analyzer')({

View File

@ -42,7 +42,7 @@
"jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0",
"nanoid": "^5.0.7",
"next": "14.3.0-canary.44",
"next": "^14.2.3",
"next-auth": "5.0.0-beta.15",
"next-themes": "^0.3.0",
"openai": "^4.38.5",

123
pnpm-lock.yaml generated
View File

@ -58,7 +58,7 @@ importers:
version: 1.1.3
'@vercel/analytics':
specifier: ^1.2.2
version: 1.2.2(next@14.3.0-canary.44(@babel/core@7.24.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)
version: 1.2.2(next@14.2.3(@babel/core@7.24.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)
'@vercel/blob':
specifier: ^0.23.2
version: 0.23.2
@ -67,7 +67,7 @@ importers:
version: 1.0.1
'@vercel/speed-insights':
specifier: ^1.0.10
version: 1.0.10(next@14.3.0-canary.44(@babel/core@7.24.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(svelte@4.2.15)(vue@3.4.25(typescript@5.4.5))
version: 1.0.10(next@14.2.3(@babel/core@7.24.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(svelte@4.2.15)(vue@3.4.25(typescript@5.4.5))
ai:
specifier: ^3.0.34
version: 3.0.34(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.15)(vue@3.4.25(typescript@5.4.5))(zod@3.23.4)
@ -108,11 +108,11 @@ importers:
specifier: ^5.0.7
version: 5.0.7
next:
specifier: 14.3.0-canary.44
version: 14.3.0-canary.44(@babel/core@7.24.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
specifier: ^14.2.3
version: 14.2.3(@babel/core@7.24.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next-auth:
specifier: 5.0.0-beta.15
version: 5.0.0-beta.15(next@14.3.0-canary.44(@babel/core@7.24.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)
version: 5.0.0-beta.15(next@14.2.3(@babel/core@7.24.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)
next-themes:
specifier: ^0.3.0
version: 0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@ -809,62 +809,62 @@ packages:
'@next/bundle-analyzer@14.2.3':
resolution: {integrity: sha512-Z88hbbngMs7njZKI8kTJIlpdLKYfMSLwnsqYe54AP4aLmgL70/Ynx/J201DQ+q2Lr6FxFw1uCeLGImDrHOl2ZA==}
'@next/env@14.3.0-canary.44':
resolution: {integrity: sha512-n7E0UKB5tAcEEVO9iLuWVdx5nf+39GEHBo4mrRrC9zqXdP9Jxve4nFWFeDTU5EBSzuH3Zy4DmoVNHUOspHLmyQ==}
'@next/env@14.2.3':
resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==}
'@next/eslint-plugin-next@14.2.3':
resolution: {integrity: sha512-L3oDricIIjgj1AVnRdRor21gI7mShlSwU/1ZGHmqM3LzHhXXhdkrfeNY5zif25Bi5Dd7fiJHsbhoZCHfXYvlAw==}
'@next/swc-darwin-arm64@14.3.0-canary.44':
resolution: {integrity: sha512-gooP4KXsw3DDZAlvjEJNyQsSacwPRJJ5f5wkrws1J17L/heUgZHX6G7vHnQgkAejyvfa5BhW2c9rlcPxOHNQqw==}
'@next/swc-darwin-arm64@14.2.3':
resolution: {integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
'@next/swc-darwin-x64@14.3.0-canary.44':
resolution: {integrity: sha512-NbtsRFYzs8sU2VCMzqGjb4tdzhkQt1KcMB/ZqnHX5pPw5xtXqPXzBGLM0z3wHr5/vWlL4V22j8E7AGchE2TeXg==}
'@next/swc-darwin-x64@14.2.3':
resolution: {integrity: sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
'@next/swc-linux-arm64-gnu@14.3.0-canary.44':
resolution: {integrity: sha512-ctGyGeHy/07TH82ZYuA74Xy0t8Zcq1xrMLTI9RUA8Dh4khf37RI7r9SHzAeqKmPGZJAPRyE6pwXtAlCg/TstjA==}
'@next/swc-linux-arm64-gnu@14.2.3':
resolution: {integrity: sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@next/swc-linux-arm64-musl@14.3.0-canary.44':
resolution: {integrity: sha512-cX/jD3EnhIphZwRBureGSPV4GlQ7ueUKmne+5N2BsO6tHih0cnveyssropX1dTupU7aGti+22kPorPDY7BYNfQ==}
'@next/swc-linux-arm64-musl@14.2.3':
resolution: {integrity: sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@next/swc-linux-x64-gnu@14.3.0-canary.44':
resolution: {integrity: sha512-2HPcwOxXBQj3WD5ezz78o/SJXXz9D4U5H7Mc4e0cTUMy/GGW4ysg2Ullwus+FVOmm2z8GAcNbEeqh71D/lAtww==}
'@next/swc-linux-x64-gnu@14.2.3':
resolution: {integrity: sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@next/swc-linux-x64-musl@14.3.0-canary.44':
resolution: {integrity: sha512-UV9HUQenKZkrqbhRsB59X5KrMKaPUnXkbZmwLkjD2IieUgm5CswfXJ2+7JneopviwaR3k8eJMA2KV9uyA/3LpQ==}
'@next/swc-linux-x64-musl@14.2.3':
resolution: {integrity: sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@next/swc-win32-arm64-msvc@14.3.0-canary.44':
resolution: {integrity: sha512-Swrl7I7q4sw7iS6O2j5v/c5bLgHP+i4/z79XTzU2LDubMP7gL3eUqLhN1GAOO35q/j49Ysbsr3VUM14JCtGOkg==}
'@next/swc-win32-arm64-msvc@14.2.3':
resolution: {integrity: sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
'@next/swc-win32-ia32-msvc@14.3.0-canary.44':
resolution: {integrity: sha512-3KKbNG6EDMpAY9PP/Bv32ildjljC9vUwRbLrhBLa6l3TkD6n8xtlObNf9DMD0Fsa79VKHZKIkY1EvCn/7xlj5A==}
'@next/swc-win32-ia32-msvc@14.2.3':
resolution: {integrity: sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==}
engines: {node: '>= 10'}
cpu: [ia32]
os: [win32]
'@next/swc-win32-x64-msvc@14.3.0-canary.44':
resolution: {integrity: sha512-pDD9g/tTI/ihOP4c8wy5E0dRz8QUy2/7uAVyW11MIkroA4A4/cWa58PQNW5ByhvySPTcf9trnlaVPa2mdxBMMA==}
'@next/swc-win32-x64-msvc@14.2.3':
resolution: {integrity: sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@ -1364,8 +1364,11 @@ packages:
resolution: {integrity: sha512-IHk53BVw6MPMi2Gsn+hCng8rFA3ZmR3Rk7GllxDUW9qFJl/hiSvskn7XldkECapQVkIg/1dHpMAxI9xSTaLLSA==}
engines: {node: '>=14.0.0'}
'@swc/helpers@0.5.11':
resolution: {integrity: sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==}
'@swc/counter@0.1.3':
resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
'@swc/helpers@0.5.5':
resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==}
'@tailwindcss/container-queries@0.1.1':
resolution: {integrity: sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==}
@ -3259,8 +3262,8 @@ packages:
react: ^16.8 || ^17 || ^18
react-dom: ^16.8 || ^17 || ^18
next@14.3.0-canary.44:
resolution: {integrity: sha512-iYJmuiARcldXjN27N0Yo8gWyy6vWl+FoUNcEaL2GGh3sA/rc4hcbZD89ZUXoVFsPAI7ze6sKM60Znct9RwCbKQ==}
next@14.2.3:
resolution: {integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==}
engines: {node: '>=18.17.0'}
hasBin: true
peerDependencies:
@ -5452,37 +5455,37 @@ snapshots:
- bufferutil
- utf-8-validate
'@next/env@14.3.0-canary.44': {}
'@next/env@14.2.3': {}
'@next/eslint-plugin-next@14.2.3':
dependencies:
glob: 10.3.10
'@next/swc-darwin-arm64@14.3.0-canary.44':
'@next/swc-darwin-arm64@14.2.3':
optional: true
'@next/swc-darwin-x64@14.3.0-canary.44':
'@next/swc-darwin-x64@14.2.3':
optional: true
'@next/swc-linux-arm64-gnu@14.3.0-canary.44':
'@next/swc-linux-arm64-gnu@14.2.3':
optional: true
'@next/swc-linux-arm64-musl@14.3.0-canary.44':
'@next/swc-linux-arm64-musl@14.2.3':
optional: true
'@next/swc-linux-x64-gnu@14.3.0-canary.44':
'@next/swc-linux-x64-gnu@14.2.3':
optional: true
'@next/swc-linux-x64-musl@14.3.0-canary.44':
'@next/swc-linux-x64-musl@14.2.3':
optional: true
'@next/swc-win32-arm64-msvc@14.3.0-canary.44':
'@next/swc-win32-arm64-msvc@14.2.3':
optional: true
'@next/swc-win32-ia32-msvc@14.3.0-canary.44':
'@next/swc-win32-ia32-msvc@14.2.3':
optional: true
'@next/swc-win32-x64-msvc@14.3.0-canary.44':
'@next/swc-win32-x64-msvc@14.2.3':
optional: true
'@nodelib/fs.scandir@2.1.5':
@ -6111,8 +6114,11 @@ snapshots:
'@smithy/types': 2.12.0
tslib: 2.6.2
'@swc/helpers@0.5.11':
'@swc/counter@0.1.3': {}
'@swc/helpers@0.5.5':
dependencies:
'@swc/counter': 0.1.3
tslib: 2.6.2
'@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.3)':
@ -6404,11 +6410,11 @@ snapshots:
dependencies:
crypto-js: 4.2.0
'@vercel/analytics@1.2.2(next@14.3.0-canary.44(@babel/core@7.24.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)':
'@vercel/analytics@1.2.2(next@14.2.3(@babel/core@7.24.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)':
dependencies:
server-only: 0.0.1
optionalDependencies:
next: 14.3.0-canary.44(@babel/core@7.24.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next: 14.2.3(@babel/core@7.24.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
'@vercel/blob@0.23.2':
@ -6422,9 +6428,9 @@ snapshots:
dependencies:
'@upstash/redis': 1.25.1
'@vercel/speed-insights@1.0.10(next@14.3.0-canary.44(@babel/core@7.24.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(svelte@4.2.15)(vue@3.4.25(typescript@5.4.5))':
'@vercel/speed-insights@1.0.10(next@14.2.3(@babel/core@7.24.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(svelte@4.2.15)(vue@3.4.25(typescript@5.4.5))':
optionalDependencies:
next: 14.3.0-canary.44(@babel/core@7.24.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next: 14.2.3(@babel/core@7.24.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
svelte: 4.2.15
vue: 3.4.25(typescript@5.4.5)
@ -8407,10 +8413,10 @@ snapshots:
natural-compare@1.4.0: {}
next-auth@5.0.0-beta.15(next@14.3.0-canary.44(@babel/core@7.24.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1):
next-auth@5.0.0-beta.15(next@14.2.3(@babel/core@7.24.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1):
dependencies:
'@auth/core': 0.28.0
next: 14.3.0-canary.44(@babel/core@7.24.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next: 14.2.3(@babel/core@7.24.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
next-themes@0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
@ -8418,10 +8424,10 @@ snapshots:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
next@14.3.0-canary.44(@babel/core@7.24.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
next@14.2.3(@babel/core@7.24.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@next/env': 14.3.0-canary.44
'@swc/helpers': 0.5.11
'@next/env': 14.2.3
'@swc/helpers': 0.5.5
busboy: 1.6.0
caniuse-lite: 1.0.30001612
graceful-fs: 4.2.11
@ -8430,16 +8436,15 @@ snapshots:
react-dom: 18.3.1(react@18.3.1)
styled-jsx: 5.1.1(@babel/core@7.24.4)(react@18.3.1)
optionalDependencies:
'@next/swc-darwin-arm64': 14.3.0-canary.44
'@next/swc-darwin-x64': 14.3.0-canary.44
'@next/swc-linux-arm64-gnu': 14.3.0-canary.44
'@next/swc-linux-arm64-musl': 14.3.0-canary.44
'@next/swc-linux-x64-gnu': 14.3.0-canary.44
'@next/swc-linux-x64-musl': 14.3.0-canary.44
'@next/swc-win32-arm64-msvc': 14.3.0-canary.44
'@next/swc-win32-ia32-msvc': 14.3.0-canary.44
'@next/swc-win32-x64-msvc': 14.3.0-canary.44
sharp: 0.33.3
'@next/swc-darwin-arm64': 14.2.3
'@next/swc-darwin-x64': 14.2.3
'@next/swc-linux-arm64-gnu': 14.2.3
'@next/swc-linux-arm64-musl': 14.2.3
'@next/swc-linux-x64-gnu': 14.2.3
'@next/swc-linux-x64-musl': 14.2.3
'@next/swc-win32-arm64-msvc': 14.2.3
'@next/swc-win32-ia32-msvc': 14.2.3
'@next/swc-win32-x64-msvc': 14.2.3
transitivePeerDependencies:
- '@babel/core'
- babel-plugin-macros

View File

@ -1 +0,0 @@
export { default } from '@/components/PageSpinner';

View File

@ -5,8 +5,7 @@ import { getIBMPlexMonoMedium } from '@/site/font';
import { ImageResponse } from 'next/og';
import { getImageResponseCacheControlHeaders } from '@/image-response/cache';
import { STATICALLY_OPTIMIZED } from '@/site/config';
import { getPhotoIds } from '@/photo/db';
import { GENERATE_STATIC_PARAMS_LIMIT } from '@/photo';
import { GENERATE_STATIC_PARAMS_LIMIT, getPhotoIds } from '@/photo/db';
export let generateStaticParams:
(() => Promise<{ photoId: string }[]>) | undefined = undefined;

View File

@ -1,5 +1,4 @@
import {
GENERATE_STATIC_PARAMS_LIMIT,
GRID_THUMBNAILS_TO_SHOW_MAX,
descriptionForPhoto,
titleForPhoto,
@ -14,7 +13,7 @@ import {
import PhotoDetailPage from '@/photo/PhotoDetailPage';
import { getPhotosNearIdCachedCached } from '@/photo/cache';
import { STATICALLY_OPTIMIZED } from '@/site/config';
import { getPhotoIds } from '@/photo/db';
import { GENERATE_STATIC_PARAMS_LIMIT, getPhotoIds } from '@/photo/db';
export let generateStaticParams:
(() => Promise<{ photoId: string }[]>) | undefined = undefined;

View File

@ -1,6 +1,4 @@
import { cache } from 'react';
import { auth } from '@/auth';
import { screenForPPR } from '@/utility/ppr';
export const authCachedSafe = cache(() => auth()
.catch(e => screenForPPR(e, null, 'auth')));
export const authCachedSafe = cache(() => auth().catch(() => null));

View File

@ -16,7 +16,8 @@ import { parameterize } from '@/utility/string';
import { TagsWithMeta } from '@/tag';
import { FilmSimulation, FilmSimulations } from '@/simulation';
import { SHOULD_DEBUG_SQL, PRIORITY_ORDER_ENABLED } from '@/site/config';
import { screenForPPR } from '@/utility/ppr';
export const GENERATE_STATIC_PARAMS_LIMIT = 1000;
const PHOTO_DEFAULT_LIMIT = 100;
@ -310,7 +311,6 @@ const safelyQueryPhotos = async <T>(
try {
result = await callback();
} catch (e: any) {
screenForPPR(e, undefined, 'neon postgres');
if (MIGRATION_FIELDS_01.some(field => new RegExp(
`column "${field}" of relation "photos" does not exist`,
'i',

View File

@ -14,8 +14,6 @@ import camelcaseKeys from 'camelcase-keys';
import { isBefore } from 'date-fns';
import type { Metadata } from 'next';
export const GENERATE_STATIC_PARAMS_LIMIT = 1000;
// ROOT PAGE
export const INFINITE_SCROLL_INITIAL_HOME =
process.env.NODE_ENV === 'development' ? 2 : 12;

View File

@ -27,7 +27,6 @@ import {
isUrlFromCloudflareR2,
} from './cloudflare-r2';
import { PATH_API_PRESIGNED_URL } from '@/site/paths';
import { screenForPPR } from '@/utility/ppr';
export const generateStorageId = () => generateNanoid(16);
@ -193,15 +192,15 @@ const getStorageUrlsForPrefix = async (prefix = '') => {
if (HAS_VERCEL_BLOB_STORAGE) {
urls.push(...await vercelBlobList(prefix)
.catch(e => screenForPPR(e, [], 'vercel blob')));
.catch(() => []));
}
if (HAS_AWS_S3_STORAGE) {
urls.push(...await awsS3List(prefix)
.catch(e => screenForPPR(e, [], 'aws blob')));
.catch(() => []));
}
if (HAS_CLOUDFLARE_R2_STORAGE) {
urls.push(...await cloudflareR2List(prefix)
.catch(e => screenForPPR(e, [], 'cloudflare blob')));
.catch(() => []));
}
return urls

View File

@ -358,8 +358,8 @@ export default function SiteChecklistClient({
optional
experimental
>
Set environment variable to {'"1"'} to enable PPR
and static optimization, i.e., build pages ahead of time:
Set environment variable to {'"1"'} to enable static optimization,
i.e., rendering pages and images at build time:
{renderEnvVars(['NEXT_PUBLIC_STATICALLY_OPTIMIZE'])}
</ChecklistRow>
<ChecklistRow

View File

@ -1,21 +0,0 @@
export const screenForPPR = <T>(
error: any,
fallback: T,
sourceToLog?: string,
debug?: boolean
): T => {
// PPR errors, if caught, must be re-thrown in order to
// postpone rendering
if (error.sourceError?.message?.includes('ppr-caught-error')) {
if (debug) {
console.log(`${sourceToLog}: throwing error.sourceError`);
}
throw error.sourceError;
} else if (error.message?.includes('ppr-caught-error')) {
if (debug) {
console.log(`${sourceToLog}: throwing error`);
}
throw error;
}
return fallback;
};