Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: ignore metadata from default.js #75669

Draft
wants to merge 3 commits into
base: canary
Choose a base branch
from

Conversation

huozhi
Copy link
Member

@huozhi huozhi commented Feb 4, 2025

What

default.js is not the main page that we want to extract metadata from, especially when there're multiple default.js in the parallel routes. They should be ignored, and we always respect the ones defined in page.js and layout.js

Why

You could have multiple parts of parallel routes in one page, we can't just mixing the exports from each default.js. Instead, we horner the original exported metadata from the page or layout itself.

Closes NDX-633

Copy link
Member Author

huozhi commented Feb 4, 2025

This stack of pull requests is managed by Graphite. Learn more about stacking.

@ijjk
Copy link
Member

ijjk commented Feb 4, 2025

Failing test suites

Commit: ec1834e

pnpm test test/integration/node-fetch-keep-alive/test/index.test.js

  • node-fetch-keep-alive > dev > should send keep-alive for json API
  • node-fetch-keep-alive > dev > should send keep-alive for getStaticProps
  • node-fetch-keep-alive > dev > should send keep-alive for getStaticPaths
  • node-fetch-keep-alive > dev > should send keep-alive for getServerSideProps
  • node-fetch-keep-alive > production mode > should send keep-alive for json API
  • node-fetch-keep-alive > production mode > should send keep-alive for getStaticProps
  • node-fetch-keep-alive > production mode > should send keep-alive for getStaticPaths
  • node-fetch-keep-alive > production mode > should send keep-alive for getServerSideProps
Expand output

● node-fetch-keep-alive › dev › should send keep-alive for json API

thrown: "Exceeded timeout of 60000 ms for a test.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  69 |
  70 |   function runTests() {
> 71 |     it('should send keep-alive for json API', async () => {
     |     ^
  72 |       const res = await fetchViaHTTP(appPort, '/api/json')
  73 |       const obj = await res.json()
  74 |       expect(obj).toEqual({ connection: 'keep-alive' })

  at it (integration/node-fetch-keep-alive/test/index.test.js:71:5)
  at runTests (integration/node-fetch-keep-alive/test/index.test.js:39:5)
  at describe (integration/node-fetch-keep-alive/test/index.test.js:22:3)
  at Object.describe (integration/node-fetch-keep-alive/test/index.test.js:21:1)

● node-fetch-keep-alive › dev › should send keep-alive for getStaticProps

thrown: "Exceeded timeout of 60000 ms for a test.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  75 |     })
  76 |
> 77 |     it('should send keep-alive for getStaticProps', async () => {
     |     ^
  78 |       const browser = await webdriver(appPort, '/ssg')
  79 |       const props = await browser.elementById('props').text()
  80 |       const obj = JSON.parse(props)

  at it (integration/node-fetch-keep-alive/test/index.test.js:77:5)
  at runTests (integration/node-fetch-keep-alive/test/index.test.js:39:5)
  at describe (integration/node-fetch-keep-alive/test/index.test.js:22:3)
  at Object.describe (integration/node-fetch-keep-alive/test/index.test.js:21:1)

● node-fetch-keep-alive › dev › should send keep-alive for getStaticPaths

thrown: "Exceeded timeout of 60000 ms for a test.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  83 |     })
  84 |
> 85 |     it('should send keep-alive for getStaticPaths', async () => {
     |     ^
  86 |       const browser = await webdriver(appPort, '/blog/first')
  87 |       const props = await browser.elementById('props').text()
  88 |       const obj = JSON.parse(props)

  at it (integration/node-fetch-keep-alive/test/index.test.js:85:5)
  at runTests (integration/node-fetch-keep-alive/test/index.test.js:39:5)
  at describe (integration/node-fetch-keep-alive/test/index.test.js:22:3)
  at Object.describe (integration/node-fetch-keep-alive/test/index.test.js:21:1)

● node-fetch-keep-alive › dev › should send keep-alive for getServerSideProps

thrown: "Exceeded timeout of 60000 ms for a test.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  91 |     })
  92 |
> 93 |     it('should send keep-alive for getServerSideProps', async () => {
     |     ^
  94 |       const browser = await webdriver(appPort, '/ssr')
  95 |       const props = await browser.elementById('props').text()
  96 |       const obj = JSON.parse(props)

  at it (integration/node-fetch-keep-alive/test/index.test.js:93:5)
  at runTests (integration/node-fetch-keep-alive/test/index.test.js:39:5)
  at describe (integration/node-fetch-keep-alive/test/index.test.js:22:3)
  at Object.describe (integration/node-fetch-keep-alive/test/index.test.js:21:1)

● node-fetch-keep-alive › production mode › should send keep-alive for json API

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  42 |     'production mode',
  43 |     () => {
> 44 |       beforeAll(async () => {
     |       ^
  45 |         mockServer = createServer((req, res) => {
  46 |           // we can test request headers by sending them
  47 |           // back with the response

  at beforeAll (integration/node-fetch-keep-alive/test/index.test.js:44:7)
  at integration/node-fetch-keep-alive/test/index.test.js:41:56
  at Object.describe (integration/node-fetch-keep-alive/test/index.test.js:21:1)

● node-fetch-keep-alive › production mode › should send keep-alive for getStaticProps

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  42 |     'production mode',
  43 |     () => {
> 44 |       beforeAll(async () => {
     |       ^
  45 |         mockServer = createServer((req, res) => {
  46 |           // we can test request headers by sending them
  47 |           // back with the response

  at beforeAll (integration/node-fetch-keep-alive/test/index.test.js:44:7)
  at integration/node-fetch-keep-alive/test/index.test.js:41:56
  at Object.describe (integration/node-fetch-keep-alive/test/index.test.js:21:1)

● node-fetch-keep-alive › production mode › should send keep-alive for getStaticPaths

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  42 |     'production mode',
  43 |     () => {
> 44 |       beforeAll(async () => {
     |       ^
  45 |         mockServer = createServer((req, res) => {
  46 |           // we can test request headers by sending them
  47 |           // back with the response

  at beforeAll (integration/node-fetch-keep-alive/test/index.test.js:44:7)
  at integration/node-fetch-keep-alive/test/index.test.js:41:56
  at Object.describe (integration/node-fetch-keep-alive/test/index.test.js:21:1)

● node-fetch-keep-alive › production mode › should send keep-alive for getServerSideProps

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  42 |     'production mode',
  43 |     () => {
> 44 |       beforeAll(async () => {
     |       ^
  45 |         mockServer = createServer((req, res) => {
  46 |           // we can test request headers by sending them
  47 |           // back with the response

  at beforeAll (integration/node-fetch-keep-alive/test/index.test.js:44:7)
  at integration/node-fetch-keep-alive/test/index.test.js:41:56
  at Object.describe (integration/node-fetch-keep-alive/test/index.test.js:21:1)

● Test suite failed to run

listen EADDRINUSE: address already in use :::44001

  28 |         res.end(JSON.stringify({ connection }))
  29 |       })
> 30 |       mockServer.listen(44001)
     |                  ^
  31 |       appPort = await findPort()
  32 |       app = await launchApp(appDir, appPort)
  33 |     })

  at Object.listen (integration/node-fetch-keep-alive/test/index.test.js:30:18)

● Test suite failed to run

listen EADDRINUSE: address already in use :::44001

  49 |           res.end(JSON.stringify({ connection }))
  50 |         })
> 51 |         mockServer.listen(44001)
     |                    ^
  52 |         const { stdout, stderr } = await nextBuild(appDir, [], {
  53 |           stdout: true,
  54 |           stderr: true,

  at Object.listen (integration/node-fetch-keep-alive/test/index.test.js:51:20)

Read more about building and testing Next.js in contributing.md.

@ijjk
Copy link
Member

ijjk commented Feb 5, 2025

Stats from current PR

Default Build (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary vercel/next.js huozhi/02-05-fix_default.js_metadata Change
buildDuration 22s 20.9s N/A
buildDurationCached 19s 16.3s N/A
nodeModulesSize 392 MB 392 MB ⚠️ +1.4 kB
nextStartRea..uration (ms) 496ms 499ms N/A
Client Bundles (main, webpack)
vercel/next.js canary vercel/next.js huozhi/02-05-fix_default.js_metadata Change
5306-HASH.js gzip 54 kB 54 kB N/A
8276.HASH.js gzip 169 B 168 B N/A
8377-HASH.js gzip 5.46 kB 5.46 kB N/A
bccd1874-HASH.js gzip 52.9 kB 52.9 kB N/A
framework-HASH.js gzip 57.5 kB 57.5 kB N/A
main-app-HASH.js gzip 241 B 242 B N/A
main-HASH.js gzip 34.5 kB 34.5 kB N/A
webpack-HASH.js gzip 1.71 kB 1.71 kB N/A
Overall change 0 B 0 B
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js huozhi/02-05-fix_default.js_metadata Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Overall change 39.4 kB 39.4 kB
Client Pages
vercel/next.js canary vercel/next.js huozhi/02-05-fix_default.js_metadata Change
_app-HASH.js gzip 193 B 193 B
_error-HASH.js gzip 193 B 193 B
amp-HASH.js gzip 512 B 510 B N/A
css-HASH.js gzip 343 B 342 B N/A
dynamic-HASH.js gzip 1.84 kB 1.84 kB
edge-ssr-HASH.js gzip 265 B 265 B
head-HASH.js gzip 363 B 362 B N/A
hooks-HASH.js gzip 393 B 392 B N/A
image-HASH.js gzip 4.59 kB 4.58 kB N/A
index-HASH.js gzip 268 B 268 B
link-HASH.js gzip 2.35 kB 2.35 kB N/A
routerDirect..HASH.js gzip 328 B 328 B
script-HASH.js gzip 397 B 397 B
withRouter-HASH.js gzip 323 B 326 B N/A
1afbb74e6ecf..834.css gzip 106 B 106 B
Overall change 3.59 kB 3.59 kB
Client Build Manifests
vercel/next.js canary vercel/next.js huozhi/02-05-fix_default.js_metadata Change
_buildManifest.js gzip 748 B 747 B N/A
Overall change 0 B 0 B
Rendered Page Sizes
vercel/next.js canary vercel/next.js huozhi/02-05-fix_default.js_metadata Change
index.html gzip 525 B 524 B N/A
link.html gzip 539 B 538 B N/A
withRouter.html gzip 520 B 520 B
Overall change 520 B 520 B
Edge SSR bundle Size
vercel/next.js canary vercel/next.js huozhi/02-05-fix_default.js_metadata Change
edge-ssr.js gzip 130 kB 130 kB N/A
page.js gzip 210 kB 210 kB N/A
Overall change 0 B 0 B
Middleware size
vercel/next.js canary vercel/next.js huozhi/02-05-fix_default.js_metadata Change
middleware-b..fest.js gzip 676 B 674 B N/A
middleware-r..fest.js gzip 155 B 156 B N/A
middleware.js gzip 31.3 kB 31.3 kB N/A
edge-runtime..pack.js gzip 844 B 844 B
Overall change 844 B 844 B
Next Runtimes
vercel/next.js canary vercel/next.js huozhi/02-05-fix_default.js_metadata Change
app-page-exp...dev.js gzip 393 kB 393 kB
app-page-exp..prod.js gzip 132 kB 132 kB
app-page-tur..prod.js gzip 145 kB 145 kB
app-page-tur..prod.js gzip 141 kB 141 kB
app-page.run...dev.js gzip 380 kB 380 kB
app-page.run..prod.js gzip 128 kB 128 kB
app-route-ex...dev.js gzip 39.3 kB 39.3 kB
app-route-ex..prod.js gzip 25.6 kB 25.6 kB
app-route-tu..prod.js gzip 25.6 kB 25.6 kB
app-route-tu..prod.js gzip 25.4 kB 25.4 kB
app-route.ru...dev.js gzip 40.8 kB 40.8 kB
app-route.ru..prod.js gzip 25.4 kB 25.4 kB
dist_client_...dev.js gzip 356 B 356 B
dist_client_...dev.js gzip 349 B 349 B
pages-api-tu..prod.js gzip 9.69 kB 9.69 kB
pages-api.ru...dev.js gzip 11.8 kB 11.8 kB
pages-api.ru..prod.js gzip 9.68 kB 9.68 kB
pages-turbo...prod.js gzip 21.9 kB 21.9 kB
pages.runtim...dev.js gzip 31.5 kB 31.5 kB
pages.runtim..prod.js gzip 21.9 kB 21.9 kB
server.runti..prod.js gzip 60.5 kB 60.5 kB
Overall change 1.67 MB 1.67 MB
build cache Overall increase ⚠️
vercel/next.js canary vercel/next.js huozhi/02-05-fix_default.js_metadata Change
0.pack gzip 2.1 MB 2.11 MB ⚠️ +4.18 kB
index.pack gzip 74.6 kB 74.8 kB ⚠️ +201 B
Overall change 2.18 MB 2.18 MB ⚠️ +4.38 kB
Diff details
Diff for main-HASH.js

Diff too large to display

Commit: c071f53

@huozhi huozhi force-pushed the huozhi/02-05-fix_default.js_metadata branch from 4ce41c6 to c071f53 Compare February 5, 2025 12:28
@huozhi huozhi marked this pull request as ready for review February 5, 2025 13:23
@huozhi huozhi requested a review from ztanner February 5, 2025 13:23
@@ -550,6 +551,15 @@ async function resolveMetadataItemsImpl(
}
}

const pageKey = tree[0]

// If it's default.js, ignore the metadata
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's possible that the default is the page though right? since the way resolution works is that page gets higher priority, but without a page, default is given priority.

ref:

page = segment === DEFAULT_SEGMENT_KEY ? modules.defaultPage : page

@huozhi huozhi marked this pull request as draft February 6, 2025 00:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants