diff --git a/packages/next/src/build/shims/ReactDOMServerEdgeIfAvailable.d.ts b/packages/next/src/build/shims/ReactDOMServerEdgeIfAvailable.d.ts new file mode 100644 index 00000000000000..4d4f000bdf487f --- /dev/null +++ b/packages/next/src/build/shims/ReactDOMServerEdgeIfAvailable.d.ts @@ -0,0 +1 @@ +export * from 'react-dom/server.edge' diff --git a/packages/next/src/build/shims/ReactDOMServerEdgeIfAvailable.js b/packages/next/src/build/shims/ReactDOMServerEdgeIfAvailable.js new file mode 100644 index 00000000000000..cbe329c9e4cb35 --- /dev/null +++ b/packages/next/src/build/shims/ReactDOMServerEdgeIfAvailable.js @@ -0,0 +1,18 @@ +let ReactDOMServer + +try { + ReactDOMServer = require('react-dom/server.edge') +} catch (error) { + if ( + // TODO: copilot suggestion. Does this code actually exist? + error.code !== 'MODULE_NOT_FOUND' && + // TODO: actually encountered that + error.code !== 'ERR_PACKAGE_PATH_NOT_EXPORTED' + ) { + throw error + } + // TOOD: Ensure App Router does not bundle this + ReactDOMServer = require('react-dom/server.browser') +} + +module.exports = ReactDOMServer diff --git a/packages/next/src/server/render.tsx b/packages/next/src/server/render.tsx index d78bb6adffcf57..ce6c46cd61cdc8 100644 --- a/packages/next/src/server/render.tsx +++ b/packages/next/src/server/render.tsx @@ -40,7 +40,7 @@ import type { Revalidate, SwrDelta } from './lib/revalidate' import type { COMPILER_NAMES } from '../shared/lib/constants' import React, { type JSX } from 'react' -import ReactDOMServerEdge from 'react-dom/server.edge' +import ReactDOMServerEdge from '../build/shims/ReactDOMServerEdgeIfAvailable' import { StyleRegistry, createStyleRegistry } from 'styled-jsx' import { GSP_NO_RETURNED_VALUE, diff --git a/packages/next/webpack.config.js b/packages/next/webpack.config.js index 51e2090a116431..4e270b079c6ce1 100644 --- a/packages/next/webpack.config.js +++ b/packages/next/webpack.config.js @@ -2,6 +2,8 @@ const webpack = require('webpack') const path = require('path') const TerserPlugin = require('terser-webpack-plugin') const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer') +const { writeFileSync } = require('fs') +const { StatsWriterPlugin } = require('webpack-stats-plugin') const pagesExternals = [ 'react', @@ -13,6 +15,7 @@ const pagesExternals = [ 'react-dom/package.json', 'react-dom/client', 'react-dom/server', + 'react-dom/server.browser', 'react-dom/server.edge', 'react-server-dom-webpack/client', 'react-server-dom-webpack/client.edge', @@ -219,6 +222,26 @@ module.exports = ({ dev, turbo, bundleType, experimental }) => { } : {}), }), + + new StatsWriterPlugin({ + stats: 'verbose', + transform(data) { + const json = JSON.stringify(data, null, 2) + + writeFileSync( + path.join( + process.env.HOME, + 'stats/next-bundle', + `stats.${bundleType}${ + turbo ? `.turbo` : '.webpack' + }.${dev ? 'dev' : 'prod'}.bad.json` + ), + json + ) + + return json + }, + }), ].filter(Boolean), stats: { optimizationBailout: true,