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

Extract and refactor getPageStaticInfo #37062

Merged
merged 1 commit into from
May 20, 2022

Conversation

javivelasco
Copy link
Member

This PR refactors the way we extract static information for a page in order to check if it has SSG, SSR and what's the configured runtime. It includes generic util extractExportedConstValue that allows to read an arbitrary exported const and it is used for reading the exposed runtime configuration.

It also revamps the cache to use a new util withPromiseCache that is used to wrap the function that parses the AST of a file using SWC. It indexes items using a sha1 of the file content in a LRU cache with a size of 500 and no TTL. This removes the requirement to purge the cache imperatively from the dev server.

This is in preparation to have a new function that will extract the export const config = {} object in middleware so that we can bring in configuration options without having to have specific AST parsing logic.

@ijjk
Copy link
Member

ijjk commented May 20, 2022

Failing test suites

Commit: 32e1dd9

yarn testheadless test/integration/cli/test/index.test.js

  • CLI Usage > info > should print output
Expand output

● CLI Usage › info › should print output

expect(received).toBe(expected) // Object.is equality

Expected: ""
Received: "warn  - Latest canary version not detected, detected: \"12.1.7-canary.10\", newest: \"12.1.7-canary.9\".
        Please try the latest canary version (`npm install next@canary`) to confirm the issue still exists before creating a new issue.
        Read more - https://nextjs.org/docs/messages/opening-an-issue
"

  496 |       // warning will show so skip this check for the stable release
  497 |       if (pkg.version.includes('-canary')) {
> 498 |         expect(info.stderr || '').toBe('')
      |                                   ^
  499 |       }
  500 |       expect(info.stdout).toMatch(
  501 |         new RegExp(`

  at Object.<anonymous> (integration/cli/test/index.test.js:498:35)

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

@ijjk
Copy link
Member

ijjk commented May 20, 2022

Stats from current PR

Default Build (Decrease detected ✓)
General Overall increase ⚠️
vercel/next.js canary javivelasco/next.js extract-config-parsing Change
buildDuration 16.9s 17.1s ⚠️ +219ms
buildDurationCached 6.5s 6.6s ⚠️ +84ms
nodeModulesSize 479 MB 479 MB ⚠️ +13.2 kB
Page Load Tests Overall decrease ⚠️
vercel/next.js canary javivelasco/next.js extract-config-parsing Change
/ failed reqs 0 0
/ total time (seconds) 4.457 4.662 ⚠️ +0.21
/ avg req/sec 560.96 536.27 ⚠️ -24.69
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.759 1.738 -0.02
/error-in-render avg req/sec 1421.19 1438.65 +17.46
Client Bundles (main, webpack)
vercel/next.js canary javivelasco/next.js extract-config-parsing Change
925.HASH.js gzip 179 B 179 B
framework-HASH.js gzip 42 kB 42 kB
main-HASH.js gzip 29 kB 29 kB
webpack-HASH.js gzip 1.44 kB 1.44 kB
Overall change 72.6 kB 72.6 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary javivelasco/next.js extract-config-parsing Change
polyfills-HASH.js gzip 31 kB 31 kB
Overall change 31 kB 31 kB
Client Pages
vercel/next.js canary javivelasco/next.js extract-config-parsing Change
_app-HASH.js gzip 1.36 kB 1.36 kB
_error-HASH.js gzip 193 B 193 B
amp-HASH.js gzip 308 B 308 B
css-HASH.js gzip 327 B 327 B
dynamic-HASH.js gzip 2.71 kB 2.71 kB
head-HASH.js gzip 359 B 359 B
hooks-HASH.js gzip 920 B 920 B
image-HASH.js gzip 5.73 kB 5.73 kB
index-HASH.js gzip 263 B 263 B
link-HASH.js gzip 2.65 kB 2.65 kB
routerDirect..HASH.js gzip 320 B 320 B
script-HASH.js gzip 391 B 391 B
withRouter-HASH.js gzip 318 B 318 B
85e02e95b279..7e3.css gzip 107 B 107 B
Overall change 16 kB 16 kB
Client Build Manifests
vercel/next.js canary javivelasco/next.js extract-config-parsing Change
_buildManifest.js gzip 458 B 458 B
Overall change 458 B 458 B
Rendered Page Sizes
vercel/next.js canary javivelasco/next.js extract-config-parsing Change
index.html gzip 533 B 533 B
link.html gzip 547 B 547 B
withRouter.html gzip 528 B 528 B
Overall change 1.61 kB 1.61 kB

Default Build with SWC (Decrease detected ✓)
General Overall increase ⚠️
vercel/next.js canary javivelasco/next.js extract-config-parsing Change
buildDuration 19.5s 19.4s -58ms
buildDurationCached 6.7s 6.7s ⚠️ +30ms
nodeModulesSize 479 MB 479 MB ⚠️ +13.2 kB
Page Load Tests Overall decrease ⚠️
vercel/next.js canary javivelasco/next.js extract-config-parsing Change
/ failed reqs 0 0
/ total time (seconds) 4.47 4.623 ⚠️ +0.15
/ avg req/sec 559.34 540.78 ⚠️ -18.56
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.681 1.695 ⚠️ +0.01
/error-in-render avg req/sec 1486.94 1475.31 ⚠️ -11.63
Client Bundles (main, webpack)
vercel/next.js canary javivelasco/next.js extract-config-parsing Change
925.HASH.js gzip 178 B 178 B
framework-HASH.js gzip 42.7 kB 42.7 kB
main-HASH.js gzip 29.5 kB 29.5 kB
webpack-HASH.js gzip 1.45 kB 1.45 kB
Overall change 73.8 kB 73.8 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary javivelasco/next.js extract-config-parsing Change
polyfills-HASH.js gzip 31 kB 31 kB
Overall change 31 kB 31 kB
Client Pages
vercel/next.js canary javivelasco/next.js extract-config-parsing Change
_app-HASH.js gzip 1.35 kB 1.35 kB
_error-HASH.js gzip 179 B 179 B
amp-HASH.js gzip 311 B 311 B
css-HASH.js gzip 324 B 324 B
dynamic-HASH.js gzip 2.89 kB 2.89 kB
head-HASH.js gzip 357 B 357 B
hooks-HASH.js gzip 920 B 920 B
image-HASH.js gzip 5.82 kB 5.82 kB
index-HASH.js gzip 261 B 261 B
link-HASH.js gzip 2.78 kB 2.78 kB
routerDirect..HASH.js gzip 322 B 322 B
script-HASH.js gzip 392 B 392 B
withRouter-HASH.js gzip 317 B 317 B
85e02e95b279..7e3.css gzip 107 B 107 B
Overall change 16.3 kB 16.3 kB
Client Build Manifests
vercel/next.js canary javivelasco/next.js extract-config-parsing Change
_buildManifest.js gzip 457 B 457 B
Overall change 457 B 457 B
Rendered Page Sizes
vercel/next.js canary javivelasco/next.js extract-config-parsing Change
index.html gzip 532 B 532 B
link.html gzip 546 B 546 B
withRouter.html gzip 527 B 527 B
Overall change 1.6 kB 1.6 kB
Commit: 32e1dd9

@shuding shuding merged commit 036ffa7 into vercel:canary May 20, 2022
Copy link
Member

@feugy feugy left a comment

Choose a reason for hiding this comment

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

too late!
But it's ok, nothing blockant

if (/runtime|getStaticProps|getServerSideProps/.test(fileContent)) {
const swcAST = await parseModule(pageFilePath, fileContent)
const { ssg, ssr } = checkExports(swcAST)
const config = tryToExtractExportedConstValue(swcAST, 'config') || {}
Copy link
Member

@feugy feugy May 20, 2022

Choose a reason for hiding this comment

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

suggestion(non-blocking): why not supporting also var and let ?

So we could get rid of

    if (declaration.kind !== 'const') {
      continue
    }

in extract-const-value.ts and rename all the things as extractExportedValue() + tryToExtractExportedValue()

For context: I'll reckon it makes no sense to export a mutable variable. And personally, I always strive using immutable code as much as possible. However it does not feel it is the purpose of this code to convey good practices: let's not add unnecessary constraints to the users.

runtime: config.runtime,
ssr: ssr,
ssg: ssg,
}
Copy link
Member

Choose a reason for hiding this comment

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

nit: given the conditionals are pretty specific we might revamp as

if (config?.runtime === 'edge') {
  return { runtime: 'edge', ssr, ssg }
}
if (ssr || ssg) {
  return { runtime: config?.runtime || nextConfig.experimental?.runtime, ssr, ssg }
}
return { ssr: false, ssg: false }

runtime: nextConfig.experimental?.runtime,
ssr: ssr,
ssg: ssg,
}
Copy link
Member

@feugy feugy May 20, 2022

Choose a reason for hiding this comment

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

question: if the config runtime is edge, but there is no SSR nor SSG, shouldn't we return {ssr: false, ssg: false}?

If yes, then the whole part could be shrink into

return {
  runtime: ssr || ssg ? config?.runtime || nextConfig.experimental?.runtime : undefined,
  ssr, 
  ssg 
}

@feugy feugy mentioned this pull request May 30, 2022
7 tasks
@javivelasco javivelasco deleted the extract-config-parsing branch May 30, 2022 22:04
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Jun 30, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants