Skip to content

Commit 201c7cf

Browse files
authored
Revert "Make concurrent features independent from the global runtime option (#35245)"
This reverts commit 853442d.
1 parent 52e34ce commit 201c7cf

40 files changed

+60
-468
lines changed

packages/next/build/entries.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,9 @@ export async function getPageRuntime(
187187
if (!pageRuntime) {
188188
if (isRuntimeRequired) {
189189
pageRuntime = globalRuntimeFallback
190+
} else {
191+
// @TODO: Remove this branch to fully implement the RFC.
192+
pageRuntime = globalRuntimeFallback
190193
}
191194
}
192195

packages/next/build/index.ts

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,7 @@ import {
7676
} from '../telemetry/events'
7777
import { Telemetry } from '../telemetry/storage'
7878
import { CompilerResult, runCompiler } from './compiler'
79-
import {
80-
createEntrypoints,
81-
createPagesMapping,
82-
getPageRuntime,
83-
} from './entries'
79+
import { createEntrypoints, createPagesMapping } from './entries'
8480
import { generateBuildId } from './generate-build-id'
8581
import { isWriteable } from './is-writeable'
8682
import * as Log from './output/log'
@@ -157,10 +153,11 @@ export default async function build(
157153
setGlobal('phase', PHASE_PRODUCTION_BUILD)
158154
setGlobal('distDir', distDir)
159155

160-
// We enable concurrent features (Fizz-related rendering architecture) when
161-
// using React 18 or experimental.
156+
// Currently, when the runtime option is set (either `nodejs` or `edge`),
157+
// we enable concurrent features (Fizz-related rendering architecture).
158+
const runtime = config.experimental.runtime
162159
const hasReactRoot = shouldUseReactRoot()
163-
const hasConcurrentFeatures = hasReactRoot
160+
const hasConcurrentFeatures = !!runtime
164161

165162
const hasServerComponents =
166163
hasReactRoot && !!config.experimental.serverComponents
@@ -625,7 +622,6 @@ export default async function build(
625622
entrypoints: entrypoints.client,
626623
rewrites,
627624
runWebpackSpan,
628-
hasReactRoot,
629625
}),
630626
getBaseWebpackConfig(dir, {
631627
buildId,
@@ -637,7 +633,6 @@ export default async function build(
637633
entrypoints: entrypoints.server,
638634
rewrites,
639635
runWebpackSpan,
640-
hasReactRoot,
641636
}),
642637
hasReactRoot
643638
? getBaseWebpackConfig(dir, {
@@ -651,7 +646,6 @@ export default async function build(
651646
entrypoints: entrypoints.edgeServer,
652647
rewrites,
653648
runWebpackSpan,
654-
hasReactRoot,
655649
})
656650
: null,
657651
])
@@ -960,22 +954,10 @@ export default async function build(
960954
let ssgPageRoutes: string[] | null = null
961955
let isMiddlewareRoute = !!page.match(MIDDLEWARE_ROUTE)
962956

963-
const pagePath = pagePaths.find((_path) =>
964-
_path.startsWith(actualPage + '.')
965-
)
966-
const pageRuntime =
967-
hasConcurrentFeatures && pagePath
968-
? await getPageRuntime(
969-
join(pagesDir, pagePath),
970-
config.experimental.runtime
971-
)
972-
: null
973-
974957
if (
975958
!isMiddlewareRoute &&
976959
!isReservedPage(page) &&
977-
// We currently don't support staic optimization in the Edge runtime.
978-
pageRuntime !== 'edge'
960+
!hasConcurrentFeatures
979961
) {
980962
try {
981963
let isPageStaticSpan =
@@ -1501,7 +1483,10 @@ export default async function build(
15011483

15021484
const combinedPages = [...staticPages, ...ssgPages]
15031485

1504-
if (combinedPages.length > 0 || useStatic404 || useDefaultStatic500) {
1486+
if (
1487+
!hasConcurrentFeatures &&
1488+
(combinedPages.length > 0 || useStatic404 || useDefaultStatic500)
1489+
) {
15051490
const staticGenerationSpan = nextBuildSpan.traceChild('static-generation')
15061491
await staticGenerationSpan.traceAsyncFn(async () => {
15071492
detectConflictingPaths(

packages/next/build/webpack-config.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import type { Span } from '../trace'
4848
import { getRawPageExtensions } from './utils'
4949
import browserslist from 'next/dist/compiled/browserslist'
5050
import loadJsConfig from './load-jsconfig'
51+
import { shouldUseReactRoot } from '../server/config'
5152
import { getMiddlewareSourceMapPlugins } from './webpack/plugins/middleware-source-maps-plugin'
5253

5354
const watchOptions = Object.freeze({
@@ -309,7 +310,6 @@ export default async function getBaseWebpackConfig(
309310
rewrites,
310311
isDevFallback = false,
311312
runWebpackSpan,
312-
hasReactRoot,
313313
}: {
314314
buildId: string
315315
config: NextConfigComplete
@@ -323,7 +323,6 @@ export default async function getBaseWebpackConfig(
323323
rewrites: CustomRoutes['rewrites']
324324
isDevFallback?: boolean
325325
runWebpackSpan: Span
326-
hasReactRoot: boolean
327326
}
328327
): Promise<webpack.Configuration> {
329328
const { useTypeScript, jsConfig, resolvedBaseUrl } = await loadJsConfig(
@@ -336,10 +335,10 @@ export default async function getBaseWebpackConfig(
336335
rewrites.afterFiles.length > 0 ||
337336
rewrites.fallback.length > 0
338337
const hasReactRefresh: boolean = dev && !isServer
339-
338+
const hasReactRoot = shouldUseReactRoot()
340339
const runtime = config.experimental.runtime
341340

342-
// Make sure `reactRoot` is enabled when React 18 or experimental is detected.
341+
// Make sure reactRoot is enabled when react 18 is detected
343342
if (hasReactRoot) {
344343
config.experimental.reactRoot = true
345344
}
@@ -354,14 +353,14 @@ export default async function getBaseWebpackConfig(
354353
'`experimental.runtime` requires `experimental.reactRoot` to be enabled along with React 18.'
355354
)
356355
}
357-
if (config.experimental.serverComponents && !hasReactRoot) {
356+
if (config.experimental.serverComponents && !runtime) {
358357
throw new Error(
359-
'`experimental.serverComponents` requires React 18 to be installed.'
358+
'`experimental.runtime` is required to be set along with `experimental.serverComponents`.'
360359
)
361360
}
362361

363362
const targetWeb = isEdgeRuntime || !isServer
364-
const hasConcurrentFeatures = hasReactRoot
363+
const hasConcurrentFeatures = !!runtime && hasReactRoot
365364
const hasServerComponents =
366365
hasConcurrentFeatures && !!config.experimental.serverComponents
367366
const disableOptimizedLoading = hasConcurrentFeatures

packages/next/export/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,6 @@ export default async function exportApp(
588588
nextConfig.experimental.disableOptimizedLoading,
589589
parentSpanId: pageExportSpan.id,
590590
httpAgentOptions: nextConfig.httpAgentOptions,
591-
serverComponents: nextConfig.experimental.serverComponents,
592591
})
593592

594593
for (const validation of result.ampValidations || []) {

packages/next/export/worker.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ interface ExportPageInput {
5959
disableOptimizedLoading: any
6060
parentSpanId: any
6161
httpAgentOptions: NextConfigComplete['httpAgentOptions']
62-
serverComponents?: boolean
6362
}
6463

6564
interface ExportPageResults {
@@ -107,7 +106,6 @@ export default async function exportPage({
107106
optimizeCss,
108107
disableOptimizedLoading,
109108
httpAgentOptions,
110-
serverComponents,
111109
}: ExportPageInput): Promise<ExportPageResults> {
112110
setHttpAgentOptions(httpAgentOptions)
113111
const exportPageSpan = trace('export-page-worker', parentSpanId)
@@ -262,7 +260,7 @@ export default async function exportPage({
262260
getServerSideProps,
263261
getStaticProps,
264262
pageConfig,
265-
} = await loadComponents(distDir, page, serverless, serverComponents)
263+
} = await loadComponents(distDir, page, serverless)
266264
const ampState = {
267265
ampFirst: pageConfig?.amp === true,
268266
hasQuery: Boolean(query.amp),
@@ -323,12 +321,7 @@ export default async function exportPage({
323321
throw new Error(`Failed to render serverless page`)
324322
}
325323
} else {
326-
const components = await loadComponents(
327-
distDir,
328-
page,
329-
serverless,
330-
serverComponents
331-
)
324+
const components = await loadComponents(distDir, page, serverless)
332325
const ampState = {
333326
ampFirst: components.pageConfig?.amp === true,
334327
hasQuery: Boolean(query.amp),

packages/next/pages/_document.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -585,9 +585,11 @@ export class Head extends Component<
585585
disableOptimizedLoading,
586586
optimizeCss,
587587
optimizeFonts,
588-
hasConcurrentFeatures,
588+
runtime,
589589
} = this.context
590590

591+
const hasConcurrentFeatures = !!runtime
592+
591593
const disableRuntimeJS = unstable_runtimeJS === false
592594
const disableJsPreload =
593595
unstable_JsPreload === false || !disableOptimizedLoading

packages/next/server/dev/hot-reloader.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,6 @@ export default class HotReloader {
154154
private config: NextConfigComplete
155155
private runtime?: 'nodejs' | 'edge'
156156
private hasServerComponents: boolean
157-
private hasReactRoot: boolean
158157
public clientStats: webpack5.Stats | null
159158
public serverStats: webpack5.Stats | null
160159
private clientError: Error | null = null
@@ -198,9 +197,7 @@ export default class HotReloader {
198197

199198
this.config = config
200199
this.runtime = config.experimental.runtime
201-
this.hasReactRoot = shouldUseReactRoot()
202-
this.hasServerComponents =
203-
this.hasReactRoot && !!config.experimental.serverComponents
200+
this.hasServerComponents = !!config.experimental.serverComponents
204201
this.previewProps = previewProps
205202
this.rewrites = rewrites
206203
this.hotReloaderSpan = trace('hot-reloader', undefined, {
@@ -343,6 +340,8 @@ export default class HotReloader {
343340
)
344341
)
345342

343+
const hasReactRoot = shouldUseReactRoot()
344+
346345
return webpackConfigSpan
347346
.traceChild('generate-webpack-config')
348347
.traceAsyncFn(() =>
@@ -357,7 +356,6 @@ export default class HotReloader {
357356
rewrites: this.rewrites,
358357
entrypoints: entrypoints.client,
359358
runWebpackSpan: this.hotReloaderSpan,
360-
hasReactRoot: this.hasReactRoot,
361359
}),
362360
getBaseWebpackConfig(this.dir, {
363361
dev: true,
@@ -368,10 +366,9 @@ export default class HotReloader {
368366
rewrites: this.rewrites,
369367
entrypoints: entrypoints.server,
370368
runWebpackSpan: this.hotReloaderSpan,
371-
hasReactRoot: this.hasReactRoot,
372369
}),
373370
// The edge runtime is only supported with React root.
374-
this.hasReactRoot
371+
hasReactRoot
375372
? getBaseWebpackConfig(this.dir, {
376373
dev: true,
377374
isServer: true,
@@ -382,7 +379,6 @@ export default class HotReloader {
382379
rewrites: this.rewrites,
383380
entrypoints: entrypoints.edgeServer,
384381
runWebpackSpan: this.hotReloaderSpan,
385-
hasReactRoot: this.hasReactRoot,
386382
})
387383
: null,
388384
].filter(Boolean) as webpack.Configuration[]
@@ -421,7 +417,6 @@ export default class HotReloader {
421417
this.pagesDir
422418
)
423419
).client,
424-
hasReactRoot: this.hasReactRoot,
425420
})
426421
const fallbackCompiler = webpack(fallbackConfig)
427422

packages/next/server/load-components.ts

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import type {
66
import {
77
BUILD_MANIFEST,
88
REACT_LOADABLE_MANIFEST,
9-
MIDDLEWARE_FLIGHT_MANIFEST,
109
} from '../shared/lib/constants'
1110
import { join } from 'path'
1211
import { requirePage } from './require'
@@ -31,7 +30,6 @@ export type LoadComponentsReturnType = {
3130
pageConfig: PageConfig
3231
buildManifest: BuildManifest
3332
reactLoadableManifest: ReactLoadableManifest
34-
serverComponentManifest?: any | null
3533
Document: DocumentType
3634
App: AppType
3735
getStaticProps?: GetStaticProps
@@ -63,8 +61,7 @@ export async function loadDefaultErrorComponents(distDir: string) {
6361
export async function loadComponents(
6462
distDir: string,
6563
pathname: string,
66-
serverless: boolean,
67-
serverComponents?: boolean
64+
serverless: boolean
6865
): Promise<LoadComponentsReturnType> {
6966
if (serverless) {
7067
const ComponentMod = await requirePage(pathname, distDir, serverless)
@@ -105,14 +102,10 @@ export async function loadComponents(
105102
requirePage(pathname, distDir, serverless),
106103
])
107104

108-
const [buildManifest, reactLoadableManifest, serverComponentManifest] =
109-
await Promise.all([
110-
require(join(distDir, BUILD_MANIFEST)),
111-
require(join(distDir, REACT_LOADABLE_MANIFEST)),
112-
serverComponents
113-
? require(join(distDir, 'server', MIDDLEWARE_FLIGHT_MANIFEST + '.json'))
114-
: null,
115-
])
105+
const [buildManifest, reactLoadableManifest] = await Promise.all([
106+
require(join(distDir, BUILD_MANIFEST)),
107+
require(join(distDir, REACT_LOADABLE_MANIFEST)),
108+
])
116109

117110
const Component = interopDefault(ComponentMod)
118111
const Document = interopDefault(DocumentMod)
@@ -132,6 +125,5 @@ export async function loadComponents(
132125
getServerSideProps,
133126
getStaticProps,
134127
getStaticPaths,
135-
serverComponentManifest,
136128
}
137129
}

packages/next/server/next-server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -693,7 +693,7 @@ export default class NextNodeServer extends BaseServer {
693693
}
694694

695695
protected getServerComponentManifest() {
696-
if (!this.nextConfig.experimental.serverComponents) return undefined
696+
if (!this.nextConfig.experimental.runtime) return undefined
697697
return require(join(
698698
this.distDir,
699699
'server',

packages/next/server/render.tsx

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -450,12 +450,12 @@ export async function renderToHTML(
450450
supportsDynamicHTML,
451451
images,
452452
reactRoot,
453-
runtime: globalRuntime,
453+
runtime,
454454
ComponentMod,
455455
AppMod,
456456
} = renderOpts
457457

458-
const hasConcurrentFeatures = reactRoot
458+
const hasConcurrentFeatures = !!runtime
459459

460460
let Document = renderOpts.Document
461461
const OriginalComponent = renderOpts.Component
@@ -464,7 +464,7 @@ export async function renderToHTML(
464464
const isServerComponent =
465465
!!serverComponentManifest &&
466466
hasConcurrentFeatures &&
467-
!!ComponentMod.__next_rsc__
467+
ComponentMod.__next_rsc__
468468

469469
let Component: React.ComponentType<{}> | ((props: any) => JSX.Element) =
470470
renderOpts.Component
@@ -1243,7 +1243,7 @@ export async function renderToHTML(
12431243
| typeof Document
12441244
| undefined
12451245

1246-
if (process.browser && Document.getInitialProps) {
1246+
if (runtime === 'edge' && Document.getInitialProps) {
12471247
// In the Edge runtime, `Document.getInitialProps` isn't supported.
12481248
// We throw an error here if it's customized.
12491249
if (!builtinDocument) {
@@ -1329,8 +1329,7 @@ export async function renderToHTML(
13291329
) : (
13301330
<Body>
13311331
<AppContainerWithIsomorphicFiberStructure>
1332-
{isServerComponent && AppMod.__next_rsc__ ? (
1333-
// _app.server.js is used.
1332+
{renderOpts.serverComponents && AppMod.__next_rsc__ ? (
13341333
<Component {...props.pageProps} router={router} />
13351334
) : (
13361335
<App {...props} Component={Component} router={router} />
@@ -1362,6 +1361,7 @@ export async function renderToHTML(
13621361
),
13631362
generateStaticHTML: true,
13641363
})
1364+
13651365
const flushed = await streamToString(flushEffectStream)
13661366
return flushed
13671367
}
@@ -1489,8 +1489,7 @@ export async function renderToHTML(
14891489
optimizeCss: renderOpts.optimizeCss,
14901490
optimizeFonts: renderOpts.optimizeFonts,
14911491
nextScriptWorkers: renderOpts.nextScriptWorkers,
1492-
runtime: globalRuntime,
1493-
hasConcurrentFeatures,
1492+
runtime,
14941493
}
14951494

14961495
const document = (

0 commit comments

Comments
 (0)