Skip to content

Commit 94661aa

Browse files
committed
Add back in the module loading indirection to make it work across bundles (runtime + user bundle) on the server
1 parent 99293d5 commit 94661aa

File tree

12 files changed

+38
-33
lines changed

12 files changed

+38
-33
lines changed

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1579,12 +1579,10 @@ export default async function getBaseWebpackConfig(
15791579
layer: WEBPACK_LAYERS.appMetadataRoute,
15801580
},
15811581
{
1582+
// Ensure that the app page module is in the client layers, this
1583+
// enables React to work correctly for RSC.
15821584
layer: WEBPACK_LAYERS.serverSideRendering,
1583-
test: [
1584-
// Ensure that the app page module is in the client layers, this
1585-
// enables React to work correctly for RSC.
1586-
/next[\\/]dist[\\/](esm[\\/])?server[\\/]future[\\/]route-modules[\\/]app-page[\\/]module/,
1587-
],
1585+
test: /next[\\/]dist[\\/](esm[\\/])?server[\\/]future[\\/]route-modules[\\/]app-page[\\/]module/,
15881586
},
15891587
{
15901588
// All app dir layers need to use this configured resolution logic

packages/next/src/client/app-next-dev.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,6 @@ import { appBootstrap } from './app-bootstrap'
44

55
appBootstrap(() => {
66
require('./app-webpack')
7-
// It is import that the webpack patch above in ./app-webpack runs before any
8-
// react code is loaded. This order dependent loading will ensure that react controls
9-
// the filename resolution of flight loaded chunks and will not be intercepted
10-
// by the patch above.
117
const { hydrate } = require('./app-index')
128
hydrate()
139
})

packages/next/src/client/app-next.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,9 @@ import { appBootstrap } from './app-bootstrap'
22

33
appBootstrap(() => {
44
// Include app-router and layout-router in the main chunk
5-
require('./app-webpack')
6-
// It is import that the webpack patch above in ./app-webpack runs before any
7-
// react code is loaded. This order dependent loading will ensure that react controls
8-
// the filename resolution of flight loaded chunks and will not be intercepted
9-
// by the patch above.
105
require('next/dist/client/components/app-router')
116
require('next/dist/client/components/layout-router')
7+
require('./app-webpack')
128
const { hydrate } = require('./app-index')
139
hydrate()
1410
})
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// @ts-expect-error
2+
process.env.__NEXT_NEW_LINK_BEHAVIOR = true
3+
4+
export {}

packages/next/src/server/app-render/action-handler.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -360,15 +360,13 @@ export async function handleAction({
360360
}
361361
}
362362
} else {
363-
// Use react-server-dom-webpack/server.node for decodeReplyFromBusboy and react-server-dom-webpack/server.edge
364-
// for decodeAction and decodeReply. We could actually use just server.node for all the action handling because
365-
// the but these packages don't actually have any direct platform primitives so either works in this context
363+
// Use react-server-dom-webpack/server.node which supports streaming
366364
const {
365+
decodeReply,
367366
decodeReplyFromBusboy,
368367
decodeAction,
369-
decodeReply,
370368
decodeFormState,
371-
} = ComponentMod
369+
} = require(`./react-server.node`)
372370

373371
if (isMultipartAction) {
374372
if (isFetchAction) {

packages/next/src/server/app-render/create-server-components-renderer.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ export function createServerComponentRenderer<Props>(
1313
ComponentToRender: (props: Props) => any,
1414
ComponentMod: {
1515
renderToReadableStream: any
16-
createFromReadableStream: any
16+
__next_app__?: {
17+
require: any
18+
loadChunk: any
19+
}
1720
},
1821
{
1922
inlinedDataTransformStream,

packages/next/src/server/app-render/entry-base.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,6 @@ const {
66
// eslint-disable-next-line import/no-extraneous-dependencies
77
} = require('react-server-dom-webpack/server.edge')
88

9-
let decodeReplyFromBusboy
10-
if (process.env.NEXT_RUNTIME !== 'edge') {
11-
decodeReplyFromBusboy =
12-
// eslint-disable-next-line import/no-extraneous-dependencies
13-
require('react-server-dom-webpack/server.node').decodeReplyFromBusboy
14-
}
15-
169
import AppRouter from '../../client/components/app-router'
1710
import LayoutRouter from '../../client/components/layout-router'
1811
import RenderFromTemplateContext from '../../client/components/render-from-template-context'
@@ -47,7 +40,6 @@ export {
4740
decodeReply,
4841
decodeAction,
4942
decodeFormState,
50-
decodeReplyFromBusboy,
5143
preloadStyle,
5244
preloadFont,
5345
preconnect,
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// This file should be opted into the react-server layer
2+
3+
export {
4+
decodeReply,
5+
decodeReplyFromBusboy,
6+
decodeAction,
7+
decodeFormState,
8+
// eslint-disable-next-line import/no-extraneous-dependencies
9+
} from 'react-server-dom-webpack/server.node'

packages/next/src/server/app-render/use-flight-response.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,16 @@ export function useFlightResponse(
2525
return flightResponseRef.current
2626
}
2727
// react-server-dom-webpack/client.edge must not be hoisted for require cache clearing to work correctly
28-
const {
29-
createFromReadableStream,
30-
} = require(`react-server-dom-webpack/client.edge`)
28+
let createFromReadableStream
29+
if (process.env.TURBOPACK) {
30+
createFromReadableStream =
31+
// eslint-disable-next-line import/no-extraneous-dependencies
32+
require('react-server-dom-turbopack/client.edge').createFromReadableStream
33+
} else {
34+
createFromReadableStream =
35+
// eslint-disable-next-line import/no-extraneous-dependencies
36+
require('react-server-dom-webpack/client.edge').createFromReadableStream
37+
}
3138

3239
const [renderStream, forwardStream] = flightStream.tee()
3340
const res = createFromReadableStream(renderStream, {

packages/next/webpack.config.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,10 @@ module.exports = ({ dev, turbo, bundleType, experimental }) => {
195195
},
196196
module: {
197197
rules: [
198+
{
199+
include: /[\\/]react-server.node/,
200+
layer: 'react-server',
201+
},
198202
{
199203
include: /vendored[\\/]rsc[\\/]entrypoints/,
200204
resolve: {

test/e2e/app-dir/chunk-loading/app/account/ClientShared.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import { SuperShared } from '../../components/SuperShared'
44
import { LazyShared } from '../../components/LazyShared'
5-
import 'client-only'
65

76
export function ClientShared() {
87
return <SuperShared from="fizz" />

test/e2e/app-dir/chunk-loading/app/account/page.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { ClientShared, ClientDynamicShared } from './ClientShared'
2-
import 'server-only'
32

43
import styles from './styles.module.css'
54

0 commit comments

Comments
 (0)