Skip to content

Commit f06d21e

Browse files
eps1lonztanner
authored andcommitted
Only support React 18 in Pages router
Once 19 is stable we can revisit. We should start work on this now since it's not trivial.
1 parent 1f89e87 commit f06d21e

File tree

26 files changed

+396
-310
lines changed

26 files changed

+396
-310
lines changed

examples/reproduction-template/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
},
88
"dependencies": {
99
"next": "canary",
10-
"react": "19.0.0-rc-7771d3a7-20240827",
11-
"react-dom": "19.0.0-rc-7771d3a7-20240827"
10+
"react": "^18.2.0",
11+
"react-dom": "^18.2.0"
1212
},
1313
"devDependencies": {
1414
"@types/node": "20.12.12",

package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -206,10 +206,10 @@
206206
"pretty-bytes": "5.3.0",
207207
"pretty-ms": "7.0.0",
208208
"random-seed": "0.3.0",
209-
"react": "19.0.0-rc-7771d3a7-20240827",
209+
"react": "18.3.1",
210210
"react-17": "npm:[email protected]",
211211
"react-builtin": "npm:[email protected]",
212-
"react-dom": "19.0.0-rc-7771d3a7-20240827",
212+
"react-dom": "18.3.1",
213213
"react-dom-17": "npm:[email protected]",
214214
"react-dom-builtin": "npm:[email protected]",
215215
"react-dom-experimental-builtin": "npm:[email protected]",
@@ -269,10 +269,10 @@
269269
"@babel/traverse": "7.22.5",
270270
"@types/react": "npm:[email protected]",
271271
"@types/react-dom": "npm:[email protected]",
272-
"react": "19.0.0-rc-7771d3a7-20240827",
273-
"react-dom": "19.0.0-rc-7771d3a7-20240827",
274-
"react-is": "19.0.0-rc-7771d3a7-20240827",
275-
"scheduler": "0.25.0-rc-7771d3a7-20240827"
272+
"react": "18.3.1",
273+
"react-dom": "18.3.1",
274+
"react-is": "18.3.1",
275+
"scheduler": "0.23.2"
276276
},
277277
"patchedDependencies": {
278278

packages/create-next-app/templates/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { GetTemplateFileArgs, InstallTemplateArgs } from "./types";
1313

1414
// Do not rename or format. sync-react script relies on this line.
1515
// prettier-ignore
16-
const nextjsReactPeerVersion = "19.0.0-rc-7771d3a7-20240827";
16+
const nextjsReactPeerVersion = "^18.2.0";
1717

1818
/**
1919
* Get the file path for a given file in a template, e.g. "next.config.js".

packages/next/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,8 @@
108108
"@opentelemetry/api": "^1.1.0",
109109
"@playwright/test": "^1.41.2",
110110
"babel-plugin-react-compiler": "*",
111-
"react": "^18.2.0 || 19.0.0-rc-7771d3a7-20240827",
112-
"react-dom": "^18.2.0 || 19.0.0-rc-7771d3a7-20240827",
111+
"react": "^18.2.0",
112+
"react-dom": "^18.2.0",
113113
"sass": "^1.3.0"
114114
},
115115
"peerDependenciesMeta": {

packages/next/src/build/shims/ReactDOMServerEdgeIfAvailable.d.ts

Lines changed: 0 additions & 1 deletion
This file was deleted.

packages/next/src/build/shims/ReactDOMServerEdgeIfAvailable.js

Lines changed: 0 additions & 18 deletions
This file was deleted.

packages/next/src/build/webpack-config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ const NEXT_PROJECT_ROOT_DIST_CLIENT = path.join(
107107
'client'
108108
)
109109

110-
if (parseInt(React.version) < 18) {
111-
throw new Error('Next.js requires react >= 18.2.0 to be installed.')
110+
if (parseInt(React.version) !== 18) {
111+
throw new Error('Next.js requires react@^18.2.0 to be installed.')
112112
}
113113

114114
export const babelIncludeRegexes: RegExp[] = [

packages/next/src/client/legacy/image.tsx

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import React, {
99
useState,
1010
type JSX,
1111
} from 'react'
12+
import * as ReactDOM from 'react-dom'
13+
import Head from '../../shared/lib/head'
1214
import {
1315
imageConfigDefault,
1416
VALID_LOADERS,
@@ -26,6 +28,8 @@ function normalizeSrc(src: string): string {
2628
return src[0] === '/' ? src.slice(1) : src
2729
}
2830

31+
const supportsFloat = typeof ReactDOM.preload === 'function'
32+
2933
const configEnv = process.env.__NEXT_IMAGE_OPTS as any as ImageConfigComplete
3034
const loadedImageURLs = new Set<string>()
3135
const allImgs = new Map<
@@ -978,6 +982,20 @@ export default function Image({
978982
}
979983
}
980984

985+
const linkProps:
986+
| React.DetailedHTMLProps<
987+
React.LinkHTMLAttributes<HTMLLinkElement>,
988+
HTMLLinkElement
989+
>
990+
| undefined = supportsFloat
991+
? undefined
992+
: {
993+
imageSrcSet: imgAttributes.srcSet,
994+
imageSizes: imgAttributes.sizes,
995+
crossOrigin: rest.crossOrigin,
996+
referrerPolicy: rest.referrerPolicy,
997+
}
998+
981999
const useLayoutEffect =
9821000
typeof window === 'undefined' ? React.useEffect : React.useLayoutEffect
9831001
const onLoadingCompleteRef = useRef(onLoadingComplete)
@@ -1044,6 +1062,27 @@ export default function Image({
10441062
) : null}
10451063
<ImageElement {...imgElementArgs} />
10461064
</span>
1065+
{!supportsFloat && priority ? (
1066+
// Note how we omit the `href` attribute, as it would only be relevant
1067+
// for browsers that do not support `imagesrcset`, and in those cases
1068+
// it would likely cause the incorrect image to be preloaded.
1069+
//
1070+
// https://html.spec.whatwg.org/multipage/semantics.html#attr-link-imagesrcset
1071+
<Head>
1072+
<link
1073+
key={
1074+
'__nimg-' +
1075+
imgAttributes.src +
1076+
imgAttributes.srcSet +
1077+
imgAttributes.sizes
1078+
}
1079+
rel="preload"
1080+
as="image"
1081+
href={imgAttributes.srcSet ? undefined : imgAttributes.src}
1082+
{...linkProps}
1083+
/>
1084+
</Head>
1085+
) : null}
10471086
</>
10481087
)
10491088
}

packages/next/src/compiled/unistore/unistore.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/next/src/server/render.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import type { Revalidate, SwrDelta } from './lib/revalidate'
4040
import type { COMPILER_NAMES } from '../shared/lib/constants'
4141

4242
import React, { type JSX } from 'react'
43-
import ReactDOMServerEdge from '../build/shims/ReactDOMServerEdgeIfAvailable'
43+
import ReactDOMServerBrowser from 'react-dom/server.browser'
4444
import { StyleRegistry, createStyleRegistry } from 'styled-jsx'
4545
import {
4646
GSP_NO_RETURNED_VALUE,
@@ -127,7 +127,8 @@ function noRouter() {
127127
}
128128

129129
async function renderToString(element: React.ReactElement) {
130-
const renderStream = await ReactDOMServerEdge.renderToReadableStream(element)
130+
const renderStream =
131+
await ReactDOMServerBrowser.renderToReadableStream(element)
131132
await renderStream.allReady
132133
return streamToString(renderStream)
133134
}
@@ -1322,7 +1323,7 @@ export async function renderToHTMLImpl(
13221323
) => {
13231324
const content = renderContent(EnhancedApp, EnhancedComponent)
13241325
return await renderToInitialFizzStream({
1325-
ReactDOMServer: ReactDOMServerEdge,
1326+
ReactDOMServer: ReactDOMServerBrowser,
13261327
element: content,
13271328
})
13281329
}

packages/next/types/react-dom.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ declare module 'react-dom/server.edge' {
7070
>
7171
}
7272

73+
declare module 'react-dom/server.browser' {
74+
export * from 'react-dom/server.edge'
75+
}
76+
7377
declare module 'react-dom/static.edge' {
7478
import type { JSX } from 'react'
7579
/**

0 commit comments

Comments
 (0)