From 1865a6e3d9193c7b1a87d1e9cedb2163118eb989 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 18 Apr 2023 12:28:49 +0200 Subject: [PATCH] Don't build pages before middleware (#48339) ### What? The team working on vercel.com reported that multiple pages were being compiled when opening a single page. Investigated this a bit and found it was caused by the matching logic (that also triggers compiling of matched pages) running before middleware runs. ### How? Removed this matcher logic, as far as I can tell it's not actually being used. Probably a leftover from when we provided `page` as a middleware parameter before we made middleware run in front of all resolving. Fixes NEXT-999 Fixes NEXT-806 --- packages/next/src/server/next-server.ts | 13 ------------ .../app/layout.tsx | 7 +++++++ .../app/new-about/page.tsx | 3 +++ .../middleware.ts | 7 +++++++ .../multiple-compiles-single-route.test.ts | 20 +++++++++++++++++++ .../next.config.js | 8 ++++++++ .../pages/[slug].js | 3 +++ .../public/favicon.ico | 0 8 files changed, 48 insertions(+), 13 deletions(-) create mode 100644 test/development/app-dir/multiple-compiles-single-route/app/layout.tsx create mode 100644 test/development/app-dir/multiple-compiles-single-route/app/new-about/page.tsx create mode 100644 test/development/app-dir/multiple-compiles-single-route/middleware.ts create mode 100644 test/development/app-dir/multiple-compiles-single-route/multiple-compiles-single-route.test.ts create mode 100644 test/development/app-dir/multiple-compiles-single-route/next.config.js create mode 100644 test/development/app-dir/multiple-compiles-single-route/pages/[slug].js create mode 100644 test/development/app-dir/multiple-compiles-single-route/public/favicon.ico diff --git a/packages/next/src/server/next-server.ts b/packages/next/src/server/next-server.ts index 3448552b50..47f7ec2aa5 100644 --- a/packages/next/src/server/next-server.ts +++ b/packages/next/src/server/next-server.ts @@ -2077,14 +2077,9 @@ export default class NextNodeServer extends BaseServer { ) { return { finished: false } } - const normalizedPathname = removeTrailingSlash(params.parsed.pathname || '') let url: string - const options: MatchOptions = { - i18n: this.i18nProvider?.analyze(normalizedPathname), - } - if (this.nextConfig.skipMiddlewareUrlNormalize) { url = getRequestMeta(params.request, '__NEXT_INIT_URL')! } else { @@ -2110,14 +2105,6 @@ export default class NextNodeServer extends BaseServer { params?: { [key: string]: string | string[] } } = {} - const match = await this.matchers.match(normalizedPathname, options) - if (match) { - page.name = match.params - ? match.definition.pathname - : params.parsedUrl.pathname - page.params = match.params - } - const middleware = this.getMiddleware() if (!middleware) { return { finished: false } diff --git a/test/development/app-dir/multiple-compiles-single-route/app/layout.tsx b/test/development/app-dir/multiple-compiles-single-route/app/layout.tsx new file mode 100644 index 0000000000..e7077399c0 --- /dev/null +++ b/test/development/app-dir/multiple-compiles-single-route/app/layout.tsx @@ -0,0 +1,7 @@ +export default function Root({ children }: { children: React.ReactNode }) { + return ( + + {children} + + ) +} diff --git a/test/development/app-dir/multiple-compiles-single-route/app/new-about/page.tsx b/test/development/app-dir/multiple-compiles-single-route/app/new-about/page.tsx new file mode 100644 index 0000000000..4f4555db6b --- /dev/null +++ b/test/development/app-dir/multiple-compiles-single-route/app/new-about/page.tsx @@ -0,0 +1,3 @@ +export default function Page() { + return

New About!

+} diff --git a/test/development/app-dir/multiple-compiles-single-route/middleware.ts b/test/development/app-dir/multiple-compiles-single-route/middleware.ts new file mode 100644 index 0000000000..f461f758f1 --- /dev/null +++ b/test/development/app-dir/multiple-compiles-single-route/middleware.ts @@ -0,0 +1,7 @@ +import { NextRequest, NextResponse } from 'next/server' + +export default function middleware(request: NextRequest) { + if (request.nextUrl.pathname === '/about') { + return NextResponse.rewrite(new URL('/new-about', request.nextUrl)) + } +} diff --git a/test/development/app-dir/multiple-compiles-single-route/multiple-compiles-single-route.test.ts b/test/development/app-dir/multiple-compiles-single-route/multiple-compiles-single-route.test.ts new file mode 100644 index 0000000000..b4a4090b06 --- /dev/null +++ b/test/development/app-dir/multiple-compiles-single-route/multiple-compiles-single-route.test.ts @@ -0,0 +1,20 @@ +import { createNextDescribe } from 'e2e-utils' + +createNextDescribe( + 'multiple-compiles-single-route', + { + files: __dirname, + }, + ({ next }) => { + // Recommended for tests that check HTML. Cheerio is a HTML parser that has a jQuery like API. + it('should not compile additional matching paths', async () => { + const logs: string[] = [] + next.on('stdout', (log) => { + logs.push(log) + }) + await next.render('/about') + // Check if `/[slug]` is mentioned in the logs as being compiled + expect(logs.some((log) => log.includes('/[slug]'))).toBe(false) + }) + } +) diff --git a/test/development/app-dir/multiple-compiles-single-route/next.config.js b/test/development/app-dir/multiple-compiles-single-route/next.config.js new file mode 100644 index 0000000000..bf49894afd --- /dev/null +++ b/test/development/app-dir/multiple-compiles-single-route/next.config.js @@ -0,0 +1,8 @@ +/** + * @type {import('next').NextConfig} + */ +const nextConfig = { + experimental: { appDir: true }, +} + +module.exports = nextConfig diff --git a/test/development/app-dir/multiple-compiles-single-route/pages/[slug].js b/test/development/app-dir/multiple-compiles-single-route/pages/[slug].js new file mode 100644 index 0000000000..04d7e2308b --- /dev/null +++ b/test/development/app-dir/multiple-compiles-single-route/pages/[slug].js @@ -0,0 +1,3 @@ +export default function Page() { + return
Page
+} diff --git a/test/development/app-dir/multiple-compiles-single-route/public/favicon.ico b/test/development/app-dir/multiple-compiles-single-route/public/favicon.ico new file mode 100644 index 0000000000..e69de29bb2