From 5b883bb5d1de5a2d47d419dd0019e158b5f6896e Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Wed, 28 Jun 2023 09:08:17 +0200 Subject: [PATCH] performance: enable minification for the server bundles (#51831) This PR makes the server code be minified. ## Why This will improve performance of the server code because of the lesser size, lesser time to parse and lesser code via tree sharking. Cons: this should lead to increased build times, so a `disableServerMinification` config was added link NEXT-1319 --- packages/next/src/build/webpack-config.ts | 7 ++++++- .../next/src/build/webpack/config/blocks/base.ts | 1 + packages/next/src/build/webpack/config/index.ts | 3 +++ packages/next/src/build/webpack/config/utils.ts | 1 + packages/next/src/server/config-schema.ts | 6 ++++++ packages/next/src/server/config-shared.ts | 12 ++++++++++++ 6 files changed, 29 insertions(+), 1 deletion(-) diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index 411f67be83785..31ed619c8b27a 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -1766,7 +1766,11 @@ export default async function getBaseWebpackConfig( runtimeChunk: isClient ? { name: CLIENT_STATIC_FILES_RUNTIME_WEBPACK } : undefined, - minimize: !dev && (isClient || isEdgeServer), + minimize: + !dev && + (isClient || + isEdgeServer || + (isNodeServer && config.experimental.serverMinification)), minimizer: [ // Minify JavaScript (compiler: webpack.Compiler) => { @@ -2724,6 +2728,7 @@ export default async function getBaseWebpackConfig( experimental: config.experimental, disableStaticImages: config.images.disableStaticImages, transpilePackages: config.transpilePackages, + serverSourceMaps: config.experimental.serverSourceMaps, }) // @ts-ignore Cache exists diff --git a/packages/next/src/build/webpack/config/blocks/base.ts b/packages/next/src/build/webpack/config/blocks/base.ts index a9b43e144b81c..ca5f1ce959f62 100644 --- a/packages/next/src/build/webpack/config/blocks/base.ts +++ b/packages/next/src/build/webpack/config/blocks/base.ts @@ -34,6 +34,7 @@ export const base = curry(function base( } else { if ( ctx.isEdgeRuntime || + (ctx.isServer && ctx.serverSourceMaps) || // Enable browser sourcemaps: (ctx.productionBrowserSourceMaps && ctx.isClient) ) { diff --git a/packages/next/src/build/webpack/config/index.ts b/packages/next/src/build/webpack/config/index.ts index b9f0718469b3a..4daa1b35696a2 100644 --- a/packages/next/src/build/webpack/config/index.ts +++ b/packages/next/src/build/webpack/config/index.ts @@ -25,6 +25,7 @@ export async function buildConfiguration( transpilePackages, experimental, disableStaticImages, + serverSourceMaps, }: { hasAppDir: boolean supportedBrowsers: string[] | undefined @@ -41,6 +42,7 @@ export async function buildConfiguration( future: NextConfigComplete['future'] experimental: NextConfigComplete['experimental'] disableStaticImages: NextConfigComplete['disableStaticImages'] + serverSourceMaps: NextConfigComplete['experimental']['serverSourceMaps'] } ): Promise { const ctx: ConfigurationContext = { @@ -64,6 +66,7 @@ export async function buildConfiguration( transpilePackages, future, experimental, + serverSourceMaps: serverSourceMaps ?? false, } let fns = [base(ctx), css(ctx)] diff --git a/packages/next/src/build/webpack/config/utils.ts b/packages/next/src/build/webpack/config/utils.ts index 0cae76e8a83f2..004e0acac5b6d 100644 --- a/packages/next/src/build/webpack/config/utils.ts +++ b/packages/next/src/build/webpack/config/utils.ts @@ -22,6 +22,7 @@ export type ConfigurationContext = { sassOptions: any productionBrowserSourceMaps: boolean + serverSourceMaps: boolean transpilePackages: NextConfigComplete['transpilePackages'] diff --git a/packages/next/src/server/config-schema.ts b/packages/next/src/server/config-schema.ts index b52ad11987930..1439550ee4e30 100644 --- a/packages/next/src/server/config-schema.ts +++ b/packages/next/src/server/config-schema.ts @@ -512,6 +512,12 @@ const configSchema = { logging: { type: 'string', }, + serverMinification: { + type: 'boolean', + }, + serverSourceMaps: { + type: 'boolean', + }, }, type: 'object', }, diff --git a/packages/next/src/server/config-shared.ts b/packages/next/src/server/config-shared.ts index aeed79b241ef8..00b56e469a0b0 100644 --- a/packages/next/src/server/config-shared.ts +++ b/packages/next/src/server/config-shared.ts @@ -287,6 +287,16 @@ export interface ExperimentalConfig { * Allows adjusting body parser size limit for server actions. */ serverActionsBodySizeLimit?: SizeLimit + + /** + * enables the minification of server code. + */ + serverMinification?: boolean + + /** + * Enables source maps generation for the server production bundle. + */ + serverSourceMaps?: boolean } export type ExportPathMap = { @@ -670,6 +680,8 @@ export const defaultConfig: NextConfig = { output: !!process.env.NEXT_PRIVATE_STANDALONE ? 'standalone' : undefined, modularizeImports: undefined, experimental: { + serverMinification: false, + serverSourceMaps: false, caseSensitiveRoutes: false, useDeploymentId: false, deploymentId: undefined,