From c9f372f7f03777d01558cb6907487af0625616fe Mon Sep 17 00:00:00 2001 From: Jiachi Liu Date: Thu, 22 Jun 2023 14:22:37 +0200 Subject: [PATCH 1/6] Add esm entry for next/server and alias @vercel/og --- packages/next/src/build/webpack-config.ts | 7 +++++ packages/next/src/server/web/exports/index.ts | 8 ++++++ .../app/twitter-image2.tsx | 28 +++++++++++++++++++ .../app/twitter-image3.tsx | 28 +++++++++++++++++++ .../metadata-dynamic-routes/next.config.js | 8 ++++++ 5 files changed, 79 insertions(+) create mode 100644 packages/next/src/server/web/exports/index.ts create mode 100644 test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image2.tsx create mode 100644 test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image3.tsx diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index fd9e9a76380c..47e52c26876e 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -1088,6 +1088,8 @@ export default async function getBaseWebpackConfig( 'next/dist/server': 'next/dist/esm/server', // Alias the usage of next public APIs + [require.resolve('next/server')]: + 'next/dist/esm/server/web/exports/index', [require.resolve('next/dist/client/link')]: 'next/dist/esm/client/link', [require.resolve('next/dist/client/image')]: @@ -1130,6 +1132,11 @@ export default async function getBaseWebpackConfig( 'styled-jsx/style$': require.resolve(`styled-jsx/style`), 'styled-jsx$': require.resolve(`styled-jsx`), + // Alias 3rd party @vercel/og package to vendored og image package to reduce bundle size + '@vercel/og': `next/dist/compiled/@vercel/og/${ + isEdgeServer ? 'index.edge.js' : 'index.node.js' + }`, + ...customAppAliases, ...customErrorAlias, ...customDocumentAliases, diff --git a/packages/next/src/server/web/exports/index.ts b/packages/next/src/server/web/exports/index.ts new file mode 100644 index 000000000000..d461efb78dc1 --- /dev/null +++ b/packages/next/src/server/web/exports/index.ts @@ -0,0 +1,8 @@ +// Alias index file of next/server for edge runtime for tree-shaking purpose + +export { default as ImageResponse } from './image-response' +export { default as NextRequest } from './next-request' +export { default as NextResponse } from './next-response' +export { default as userAgent } from './user-agent' +export { default as userAgentFromString } from './user-agent-from-string' +export { default as URLPattern } from './url-pattern' diff --git a/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image2.tsx b/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image2.tsx new file mode 100644 index 000000000000..b271d2a897a8 --- /dev/null +++ b/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image2.tsx @@ -0,0 +1,28 @@ +// Edge: Using @vercel/og external package, and should be aliased to "next/server" ImageResponse +import { ImageResponse } from '@vercel/og' + +export const alt = 'Twitter' +export const size = { width: 1600, height: 900 } + +export default function twitter() { + return new ImageResponse( + ( +
+ Twitter Image +
+ ), + size + ) +} + +export const runtime = 'edge' diff --git a/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image3.tsx b/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image3.tsx new file mode 100644 index 000000000000..a6de76e59300 --- /dev/null +++ b/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image3.tsx @@ -0,0 +1,28 @@ +// Nodejs: Using @vercel/og external package, and should be aliased to "next/server" ImageResponse +import { ImageResponse } from '@vercel/og' + +export const alt = 'Twitter' +export const size = { width: 1600, height: 900 } + +export default function twitter() { + return new ImageResponse( + ( +
+ Twitter Image +
+ ), + size + ) +} + +export const runtime = 'nodejs' diff --git a/test/e2e/app-dir/metadata-dynamic-routes/next.config.js b/test/e2e/app-dir/metadata-dynamic-routes/next.config.js index 4ba52ba2c8df..dc0c3a93b03e 100644 --- a/test/e2e/app-dir/metadata-dynamic-routes/next.config.js +++ b/test/e2e/app-dir/metadata-dynamic-routes/next.config.js @@ -1 +1,9 @@ module.exports = {} + +// For development: analyze the bundled chunks for stats app +if (process.env.ANALYZE) { + const withBundleAnalyzer = require('@next/bundle-analyzer')({ + enabled: true, + }) + module.exports = withBundleAnalyzer(module.exports) +} From 5e5ca1a00c5a139c91f8509baee39ac4232dea47 Mon Sep 17 00:00:00 2001 From: Jiachi Liu Date: Thu, 22 Jun 2023 14:52:34 +0200 Subject: [PATCH 2/6] add test --- packages/next/src/build/webpack-config.ts | 7 ++--- .../web/spec-extension/image-response.ts | 1 + .../app/twitter-image.tsx | 9 ++++++ .../app/twitter-image2.tsx | 10 ++++++- .../app/twitter-image3.tsx | 28 ------------------- .../metadata-dynamic-routes/index.test.ts | 10 ++++++- 6 files changed, 30 insertions(+), 35 deletions(-) delete mode 100644 test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image3.tsx diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index 47e52c26876e..63a1fd6e0bd0 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -1077,6 +1077,8 @@ export default async function getBaseWebpackConfig( ...nodePathList, // Support for NODE_PATH environment variable ], alias: { + // Alias 3rd party @vercel/og package to vendored og image package to reduce bundle size + '@vercel/og': 'next/dist/server/web/exports/image-response', // Alias next/dist imports to next/dist/esm assets, // let this alias hit before `next` alias. ...(isEdgeServer @@ -1132,11 +1134,6 @@ export default async function getBaseWebpackConfig( 'styled-jsx/style$': require.resolve(`styled-jsx/style`), 'styled-jsx$': require.resolve(`styled-jsx`), - // Alias 3rd party @vercel/og package to vendored og image package to reduce bundle size - '@vercel/og': `next/dist/compiled/@vercel/og/${ - isEdgeServer ? 'index.edge.js' : 'index.node.js' - }`, - ...customAppAliases, ...customErrorAlias, ...customDocumentAliases, diff --git a/packages/next/src/server/web/spec-extension/image-response.ts b/packages/next/src/server/web/spec-extension/image-response.ts index fdbb4e974ee9..bccd7401a255 100644 --- a/packages/next/src/server/web/spec-extension/image-response.ts +++ b/packages/next/src/server/web/spec-extension/image-response.ts @@ -1,4 +1,5 @@ export class ImageResponse { + public static displayName = 'NextImageResponse' constructor( ...args: ConstructorParameters< typeof import('next/dist/compiled/@vercel/og').ImageResponse diff --git a/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image.tsx b/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image.tsx index ec3e38f7c3e5..9fbb5bebf3f8 100644 --- a/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image.tsx +++ b/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image.tsx @@ -1,4 +1,13 @@ import { ImageResponse } from 'next/server' +import { ImageResponse as ImageResponse2 } from 'next/server' + +// Node.js: Using @vercel/og external package, and should be aliased to "next/server" ImageResponse +// @ts-ignore +if (ImageResponse.displayName !== 'NextImageResponse') + throw new Error('ImageResponse mismatch: ' + ImageResponse.displayName) +// @ts-ignore +if (ImageResponse2.displayName !== 'NextImageResponse') + throw new Error('ImageResponse mismatch: ' + ImageResponse2.displayName) export const alt = 'Twitter' export const size = { width: 1600, height: 900 } diff --git a/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image2.tsx b/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image2.tsx index b271d2a897a8..b75bed882042 100644 --- a/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image2.tsx +++ b/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image2.tsx @@ -1,5 +1,13 @@ -// Edge: Using @vercel/og external package, and should be aliased to "next/server" ImageResponse import { ImageResponse } from '@vercel/og' +import { ImageResponse as ImageResponse2 } from 'next/server' + +// Edge: Using @vercel/og external package, and should be aliased to "next/server" ImageResponse +// @ts-ignore +if (ImageResponse.displayName !== 'NextImageResponse') + throw new Error('ImageResponse mismatch: ' + ImageResponse.displayName) +// @ts-ignore +if (ImageResponse2.displayName !== 'NextImageResponse') + throw new Error('ImageResponse mismatch: ' + ImageResponse2.displayName) export const alt = 'Twitter' export const size = { width: 1600, height: 900 } diff --git a/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image3.tsx b/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image3.tsx deleted file mode 100644 index a6de76e59300..000000000000 --- a/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image3.tsx +++ /dev/null @@ -1,28 +0,0 @@ -// Nodejs: Using @vercel/og external package, and should be aliased to "next/server" ImageResponse -import { ImageResponse } from '@vercel/og' - -export const alt = 'Twitter' -export const size = { width: 1600, height: 900 } - -export default function twitter() { - return new ImageResponse( - ( -
- Twitter Image -
- ), - size - ) -} - -export const runtime = 'nodejs' diff --git a/test/e2e/app-dir/metadata-dynamic-routes/index.test.ts b/test/e2e/app-dir/metadata-dynamic-routes/index.test.ts index 71224c59c4f2..7ea386962ac6 100644 --- a/test/e2e/app-dir/metadata-dynamic-routes/index.test.ts +++ b/test/e2e/app-dir/metadata-dynamic-routes/index.test.ts @@ -101,12 +101,20 @@ createNextDescribe( }) it('should render og image with twitter-image dynamic routes', async () => { - const res = await next.fetch('/twitter-image') + // nodejs runtime + let res = await next.fetch('/twitter-image') expect(res.headers.get('content-type')).toBe('image/png') expect(res.headers.get('cache-control')).toBe( isNextDev ? CACHE_HEADERS.NONE : CACHE_HEADERS.LONG ) + + // edge runtime + res = await next.fetch('/twitter-image2') + expect(res.headers.get('content-type')).toBe('image/png') + expect(res.headers.get('cache-control')).toBe( + isNextDev ? CACHE_HEADERS.NONE : CACHE_HEADERS.LONG + ) }) it('should support generate multi images with generateImageMetadata', async () => { From d58bec267d17df2c305ddfd354e47aa1419b9c23 Mon Sep 17 00:00:00 2001 From: Jiachi Liu Date: Thu, 22 Jun 2023 16:35:28 +0200 Subject: [PATCH 3/6] fix test --- packages/next/src/build/webpack-config.ts | 23 +++++++++++-------- .../webpack/plugins/middleware-plugin.ts | 2 +- .../src/lib/server-external-packages.json | 1 - .../app/twitter-image.tsx | 5 ++-- .../app/twitter-image2.tsx | 18 +++++++++++---- .../metadata-dynamic-routes/index.test.ts | 3 +++ 6 files changed, 33 insertions(+), 19 deletions(-) diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index 63a1fd6e0bd0..a4dd579ce0eb 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -1078,7 +1078,8 @@ export default async function getBaseWebpackConfig( ], alias: { // Alias 3rd party @vercel/og package to vendored og image package to reduce bundle size - '@vercel/og': 'next/dist/server/web/exports/image-response', + '@vercel/og': 'next/dist/server/web/spec-extension/image-response', + // Alias next/dist imports to next/dist/esm assets, // let this alias hit before `next` alias. ...(isEdgeServer @@ -1437,15 +1438,6 @@ export default async function getBaseWebpackConfig( resolveResult.res = require.resolve(request) } - // Don't bundle @vercel/og nodejs bundle for nodejs runtime - // TODO-APP: bundle route.js with different layer that externals common node_module deps - if ( - layer === WEBPACK_LAYERS.server && - request === 'next/dist/compiled/@vercel/og/index.node.js' - ) { - return `module ${request}` - } - const { res, isEsm } = resolveResult // If the request cannot be resolved we need to have @@ -1464,6 +1456,17 @@ export default async function getBaseWebpackConfig( const externalType = isEsm ? 'module' : 'commonjs' + // Don't bundle @vercel/og nodejs bundle for nodejs runtime. + // Alias 3rd party @vercel/og package to vendored og image package to reduce bundle size. + // TODO-APP: bundle route.js with different layer that externals common node_module deps. + if (layer === WEBPACK_LAYERS.server) { + if (request === 'next/dist/compiled/@vercel/og/index.node.js') + return `module ${request}` + // if (request === '@vercel/og') { + // return + // } + } + if ( /next[/\\]dist[/\\](esm[\\/])?shared[/\\](?!lib[/\\]router[/\\]router)/.test( res diff --git a/packages/next/src/build/webpack/plugins/middleware-plugin.ts b/packages/next/src/build/webpack/plugins/middleware-plugin.ts index 709a4626f0fd..00cb6b889e25 100644 --- a/packages/next/src/build/webpack/plugins/middleware-plugin.ts +++ b/packages/next/src/build/webpack/plugins/middleware-plugin.ts @@ -570,7 +570,7 @@ function getExtractMetadata(params: { const resource = module.resource const hasOGImageGeneration = resource && - /[\\/]node_modules[\\/]@vercel[\\/]og[\\/]dist[\\/]index\.(edge|node)\.js$|[\\/]next[\\/]dist[\\/]server[\\/]web[\\/]spec-extension[\\/]image-response\.js$/.test( + /[\\/]node_modules[\\/]@vercel[\\/]og[\\/]dist[\\/]index\.(edge|node)\.js$|[\\/]next[\\/]dist[\\/](esm[\\/])?server[\\/]web[\\/]spec-extension[\\/]image-response\.js$/.test( resource ) diff --git a/packages/next/src/lib/server-external-packages.json b/packages/next/src/lib/server-external-packages.json index 9fed54504e6c..7ed606365109 100644 --- a/packages/next/src/lib/server-external-packages.json +++ b/packages/next/src/lib/server-external-packages.json @@ -7,7 +7,6 @@ "@sentry/nextjs", "@sentry/node", "@swc/core", - "@vercel/og", "argon2", "autoprefixer", "aws-crt", diff --git a/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image.tsx b/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image.tsx index 9fbb5bebf3f8..aaa0f49e5b2a 100644 --- a/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image.tsx +++ b/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image.tsx @@ -1,12 +1,13 @@ import { ImageResponse } from 'next/server' -import { ImageResponse as ImageResponse2 } from 'next/server' +// @ts-ignore +import { ImageResponse as ImageResponse2 } from '@vercel/og' // Node.js: Using @vercel/og external package, and should be aliased to "next/server" ImageResponse -// @ts-ignore if (ImageResponse.displayName !== 'NextImageResponse') throw new Error('ImageResponse mismatch: ' + ImageResponse.displayName) // @ts-ignore if (ImageResponse2.displayName !== 'NextImageResponse') + // @ts-ignore throw new Error('ImageResponse mismatch: ' + ImageResponse2.displayName) export const alt = 'Twitter' diff --git a/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image2.tsx b/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image2.tsx index b75bed882042..b86c8b472493 100644 --- a/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image2.tsx +++ b/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image2.tsx @@ -1,13 +1,21 @@ -import { ImageResponse } from '@vercel/og' -import { ImageResponse as ImageResponse2 } from 'next/server' +import { ImageResponse } from 'next/server' +// @ts-ignore +import { ImageResponse as ImageResponse2 } from '@vercel/og' // Edge: Using @vercel/og external package, and should be aliased to "next/server" ImageResponse -// @ts-ignore +// if (ImageResponse.displayName !== 'NextImageResponse') +// throw new Error('ImageResponse mismatch: ' + ImageResponse.displayName) +// // @ts-ignore +// if (ImageResponse2.displayName !== 'NextImageResponse') +// // @ts-ignore +// throw new Error('ImageResponse2 mismatch: ' + ImageResponse2.displayName) + if (ImageResponse.displayName !== 'NextImageResponse') - throw new Error('ImageResponse mismatch: ' + ImageResponse.displayName) + console.log('ImageResponse mismatch: ' + ImageResponse.displayName) // @ts-ignore if (ImageResponse2.displayName !== 'NextImageResponse') - throw new Error('ImageResponse mismatch: ' + ImageResponse2.displayName) + // @ts-ignore + console.log('ImageResponse2 mismatch: ' + ImageResponse2.displayName) export const alt = 'Twitter' export const size = { width: 1600, height: 900 } diff --git a/test/e2e/app-dir/metadata-dynamic-routes/index.test.ts b/test/e2e/app-dir/metadata-dynamic-routes/index.test.ts index 7ea386962ac6..26d7a248e73c 100644 --- a/test/e2e/app-dir/metadata-dynamic-routes/index.test.ts +++ b/test/e2e/app-dir/metadata-dynamic-routes/index.test.ts @@ -14,6 +14,9 @@ createNextDescribe( 'app dir - metadata dynamic routes', { files: __dirname, + dependencies: { + '@vercel/og': 'latest', + }, }, ({ next, isNextDev, isNextStart, isNextDeploy }) => { describe('text routes', () => { From c747f8231a2ef61064db2b453a6708d4ef5a7119 Mon Sep 17 00:00:00 2001 From: Jiachi Liu Date: Thu, 22 Jun 2023 16:37:01 +0200 Subject: [PATCH 4/6] revert --- packages/next/src/build/webpack-config.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index a4dd579ce0eb..828d9cb71b5f 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -1459,12 +1459,11 @@ export default async function getBaseWebpackConfig( // Don't bundle @vercel/og nodejs bundle for nodejs runtime. // Alias 3rd party @vercel/og package to vendored og image package to reduce bundle size. // TODO-APP: bundle route.js with different layer that externals common node_module deps. - if (layer === WEBPACK_LAYERS.server) { - if (request === 'next/dist/compiled/@vercel/og/index.node.js') - return `module ${request}` - // if (request === '@vercel/og') { - // return - // } + if ( + layer === WEBPACK_LAYERS.server && + request === 'next/dist/compiled/@vercel/og/index.node.js' + ) { + return `module ${request}` } if ( From a6675933177e91c50b31926965de81008a9c59cc Mon Sep 17 00:00:00 2001 From: Jiachi Liu Date: Thu, 22 Jun 2023 18:37:03 +0200 Subject: [PATCH 5/6] move --- packages/next/src/build/webpack-config.ts | 19 +++++++++---------- .../app/twitter-image2.tsx | 11 ++--------- 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index 828d9cb71b5f..3cffed8eca4a 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -1438,6 +1438,15 @@ export default async function getBaseWebpackConfig( resolveResult.res = require.resolve(request) } + // Don't bundle @vercel/og nodejs bundle for nodejs runtime. + // TODO-APP: bundle route.js with different layer that externals common node_module deps. + if ( + layer === WEBPACK_LAYERS.server && + request === 'next/dist/compiled/@vercel/og/index.node.js' + ) { + return `module ${request}` + } + const { res, isEsm } = resolveResult // If the request cannot be resolved we need to have @@ -1456,16 +1465,6 @@ export default async function getBaseWebpackConfig( const externalType = isEsm ? 'module' : 'commonjs' - // Don't bundle @vercel/og nodejs bundle for nodejs runtime. - // Alias 3rd party @vercel/og package to vendored og image package to reduce bundle size. - // TODO-APP: bundle route.js with different layer that externals common node_module deps. - if ( - layer === WEBPACK_LAYERS.server && - request === 'next/dist/compiled/@vercel/og/index.node.js' - ) { - return `module ${request}` - } - if ( /next[/\\]dist[/\\](esm[\\/])?shared[/\\](?!lib[/\\]router[/\\]router)/.test( res diff --git a/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image2.tsx b/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image2.tsx index b86c8b472493..6fac563558bb 100644 --- a/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image2.tsx +++ b/test/e2e/app-dir/metadata-dynamic-routes/app/twitter-image2.tsx @@ -3,19 +3,12 @@ import { ImageResponse } from 'next/server' import { ImageResponse as ImageResponse2 } from '@vercel/og' // Edge: Using @vercel/og external package, and should be aliased to "next/server" ImageResponse -// if (ImageResponse.displayName !== 'NextImageResponse') -// throw new Error('ImageResponse mismatch: ' + ImageResponse.displayName) -// // @ts-ignore -// if (ImageResponse2.displayName !== 'NextImageResponse') -// // @ts-ignore -// throw new Error('ImageResponse2 mismatch: ' + ImageResponse2.displayName) - if (ImageResponse.displayName !== 'NextImageResponse') - console.log('ImageResponse mismatch: ' + ImageResponse.displayName) + throw new Error('ImageResponse mismatch: ' + ImageResponse.displayName) // @ts-ignore if (ImageResponse2.displayName !== 'NextImageResponse') // @ts-ignore - console.log('ImageResponse2 mismatch: ' + ImageResponse2.displayName) + throw new Error('ImageResponse2 mismatch: ' + ImageResponse2.displayName) export const alt = 'Twitter' export const size = { width: 1600, height: 900 } From 78e593242bf37e02bb595758a511306fcd082422 Mon Sep 17 00:00:00 2001 From: Jiachi Liu Date: Thu, 22 Jun 2023 22:08:35 +0200 Subject: [PATCH 6/6] avoid require.resolve --- packages/next/src/build/webpack-config.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index 3cffed8eca4a..fb6e5b1cfd12 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -1091,27 +1091,27 @@ export default async function getBaseWebpackConfig( 'next/dist/server': 'next/dist/esm/server', // Alias the usage of next public APIs - [require.resolve('next/server')]: + [`${NEXT_PROJECT_ROOT}/server`]: 'next/dist/esm/server/web/exports/index', - [require.resolve('next/dist/client/link')]: + [`${NEXT_PROJECT_ROOT}/dist/client/link`]: 'next/dist/esm/client/link', - [require.resolve('next/dist/client/image')]: + [`${NEXT_PROJECT_ROOT}/dist/client/image`]: 'next/dist/esm/client/image', - [require.resolve('next/dist/client/script')]: + [`${NEXT_PROJECT_ROOT}/dist/client/script`]: 'next/dist/esm/client/script', - [require.resolve('next/dist/client/router')]: + [`${NEXT_PROJECT_ROOT}/dist/client/router`]: 'next/dist/esm/client/router', - [require.resolve('next/dist/shared/lib/head')]: + [`${NEXT_PROJECT_ROOT}/dist/shared/lib/head`]: 'next/dist/esm/shared/lib/head', - [require.resolve('next/dist/shared/lib/dynamic')]: + [`${NEXT_PROJECT_ROOT}/dist/shared/lib/dynamic`]: 'next/dist/esm/shared/lib/dynamic', - [require.resolve('next/dist/pages/_document')]: + [`${NEXT_PROJECT_ROOT}/dist/pages/_document`]: 'next/dist/esm/pages/_document', - [require.resolve('next/dist/pages/_app')]: + [`${NEXT_PROJECT_ROOT}/dist/pages/_app`]: 'next/dist/esm/pages/_app', - [require.resolve('next/dist/client/components/navigation')]: + [`${NEXT_PROJECT_ROOT}/dist/client/components/navigation`]: 'next/dist/esm/client/components/navigation', - [require.resolve('next/dist/client/components/headers')]: + [`${NEXT_PROJECT_ROOT}/dist/client/components/headers`]: 'next/dist/esm/client/components/headers', } : undefined),