From 58a230f9c8572b3e456c7102830fac720edd4e4e Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Sat, 6 Nov 2021 17:00:58 +0100 Subject: [PATCH 1/3] enable splitChunks for the server-web build --- packages/next/build/webpack-config.ts | 16 ++++--- .../webpack/plugins/middleware-plugin.ts | 42 ++++++++++++------- 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/packages/next/build/webpack-config.ts b/packages/next/build/webpack-config.ts index 71174550d9c0f..93c8e1b5ef3fd 100644 --- a/packages/next/build/webpack-config.ts +++ b/packages/next/build/webpack-config.ts @@ -665,7 +665,7 @@ export default async function getBaseWebpackConfig( [PAGES_DIR_ALIAS]: pagesDir, [DOT_NEXT_ALIAS]: distDir, - ...(targetWeb ? getOptimizedAliases() : {}), + ...(!isServer ? getOptimizedAliases() : {}), ...getReactProfilingInProduction(), ...(targetWeb @@ -990,7 +990,12 @@ export default async function getBaseWebpackConfig( ? // make sure importing "next" is handled gracefully for client // bundles in case a user imported types and it wasn't removed // TODO: should we warn/error for this instead? - ['next', ...(webServerRuntime ? [{ etag: '{}', chalk: '{}' }] : [])] + [ + 'next', + ...(webServerRuntime + ? [{ etag: '{}', chalk: '{}', 'react-dom': '{}' }] + : []), + ] : !isServerless ? [ ({ @@ -1054,10 +1059,10 @@ export default async function getBaseWebpackConfig( } : {}), splitChunks: isServer - ? dev || webServerRuntime + ? dev ? false : ({ - filename: '[name].js', + filename: webServerRuntime ? 'chunks/[name].js' : '[name].js', // allow to split entrypoints chunks: ({ name }: any) => !name?.match(MIDDLEWARE_ROUTE), // size of files is not so relevant for server build @@ -1465,7 +1470,8 @@ export default async function getBaseWebpackConfig( new PagesManifestPlugin({ serverless: isLikeServerless, dev }), // MiddlewarePlugin should be after DefinePlugin so NEXT_PUBLIC_* // replacement is done before its process.env.* handling - !isServer && new MiddlewarePlugin({ dev }), + (!isServer || webServerRuntime) && + new MiddlewarePlugin({ dev, webServerRuntime }), isServer && new NextJsSsrImportPlugin(), !isServer && new BuildManifestPlugin({ diff --git a/packages/next/build/webpack/plugins/middleware-plugin.ts b/packages/next/build/webpack/plugins/middleware-plugin.ts index 579cfb8a230da..b4ed0459ffc17 100644 --- a/packages/next/build/webpack/plugins/middleware-plugin.ts +++ b/packages/next/build/webpack/plugins/middleware-plugin.ts @@ -31,11 +31,25 @@ export interface MiddlewareManifest { } } +const middlewareManifest: MiddlewareManifest = { + sortedMiddleware: [], + clientInfo: [], + middleware: {}, + version: 1, +} export default class MiddlewarePlugin { dev: boolean - - constructor({ dev }: { dev: boolean }) { + webServerRuntime: boolean + + constructor({ + dev, + webServerRuntime, + }: { + dev: boolean + webServerRuntime: boolean + }) { this.dev = dev + this.webServerRuntime = webServerRuntime } createAssets( @@ -44,17 +58,14 @@ export default class MiddlewarePlugin { envPerRoute: Map ) { const entrypoints = compilation.entrypoints - const middlewareManifest: MiddlewareManifest = { - sortedMiddleware: [], - clientInfo: [], - middleware: {}, - version: 1, - } for (const entrypoint of entrypoints.values()) { if (!entrypoint.name) continue const result = MIDDLEWARE_FULL_ROUTE_REGEX.exec(entrypoint.name) + const ssrEntryInfo = ssrEntries.get(entrypoint.name) + if (ssrEntryInfo && !this.webServerRuntime) continue + if (!ssrEntryInfo && this.webServerRuntime) continue const location = result ? `/${result[1]}` @@ -67,14 +78,15 @@ export default class MiddlewarePlugin { } const files = ssrEntryInfo ? [ - `server/${MIDDLEWARE_SSR_RUNTIME_WEBPACK}.js`, ssrEntryInfo.requireFlightManifest ? `server/${MIDDLEWARE_FLIGHT_MANIFEST}.js` : null, `server/${MIDDLEWARE_BUILD_MANIFEST}.js`, `server/${MIDDLEWARE_REACT_LOADABLE_MANIFEST}.js`, - `server/${entrypoint.name}.js`, - ].filter(nonNullable) + ...entrypoint.getFiles().map((file) => 'server/' + file), + ] + .filter(nonNullable) + .filter((file: string) => !file.endsWith('.hot-update.js')) : entrypoint .getFiles() .filter((file: string) => !file.endsWith('.hot-update.js')) @@ -107,9 +119,11 @@ export default class MiddlewarePlugin { } ) - assets[`server/${MIDDLEWARE_MANIFEST}`] = new sources.RawSource( - JSON.stringify(middlewareManifest, null, 2) - ) + assets[ + this.webServerRuntime + ? MIDDLEWARE_MANIFEST + : `server/${MIDDLEWARE_MANIFEST}` + ] = new sources.RawSource(JSON.stringify(middlewareManifest, null, 2)) } apply(compiler: webpack5.Compiler) { From 88d849f7b85e55438bc96f242afefe7723648eab Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Sat, 6 Nov 2021 18:12:30 +0100 Subject: [PATCH 2/3] re-add polyfills --- packages/next/build/webpack-config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/build/webpack-config.ts b/packages/next/build/webpack-config.ts index 93c8e1b5ef3fd..df0e590eef1ab 100644 --- a/packages/next/build/webpack-config.ts +++ b/packages/next/build/webpack-config.ts @@ -665,7 +665,7 @@ export default async function getBaseWebpackConfig( [PAGES_DIR_ALIAS]: pagesDir, [DOT_NEXT_ALIAS]: distDir, - ...(!isServer ? getOptimizedAliases() : {}), + ...(targetWeb ? getOptimizedAliases() : {}), ...getReactProfilingInProduction(), ...(targetWeb From 03c4b4926b365ea0b1c535cf648db210e321896e Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Sat, 6 Nov 2021 18:34:20 +0100 Subject: [PATCH 3/3] remove unused --- packages/next/build/webpack/plugins/middleware-plugin.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/next/build/webpack/plugins/middleware-plugin.ts b/packages/next/build/webpack/plugins/middleware-plugin.ts index da4fa15373fe8..a992c1a5dccee 100644 --- a/packages/next/build/webpack/plugins/middleware-plugin.ts +++ b/packages/next/build/webpack/plugins/middleware-plugin.ts @@ -4,7 +4,6 @@ import { getSortedRoutes } from '../../../shared/lib/router/utils' import { MIDDLEWARE_MANIFEST, MIDDLEWARE_FLIGHT_MANIFEST, - MIDDLEWARE_SSR_RUNTIME_WEBPACK, MIDDLEWARE_BUILD_MANIFEST, MIDDLEWARE_REACT_LOADABLE_MANIFEST, } from '../../../shared/lib/constants'