-
Notifications
You must be signed in to change notification settings - Fork 26.7k
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
Conversation
Failing test suitesCommit: 32e1dd9
Expand output● CLI Usage › info › should print output
Read more about building and testing Next.js in contributing.md. |
Stats from current PRDefault Build (Decrease detected ✓)General Overall increase
|
vercel/next.js canary | javivelasco/next.js extract-config-parsing | Change | |
---|---|---|---|
buildDuration | 16.9s | 17.1s | |
buildDurationCached | 6.5s | 6.6s | |
nodeModulesSize | 479 MB | 479 MB |
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 | |
/ avg req/sec | 560.96 | 536.27 | |
/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 | |
nodeModulesSize | 479 MB | 479 MB |
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 | |
/ avg req/sec | 559.34 | 540.78 | |
/error-in-render failed reqs | 0 | 0 | ✓ |
/error-in-render total time (seconds) | 1.681 | 1.695 | |
/error-in-render avg req/sec | 1486.94 | 1475.31 |
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 | ✓ |
There was a problem hiding this 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') || {} |
There was a problem hiding this comment.
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, | ||
} |
There was a problem hiding this comment.
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, | ||
} |
There was a problem hiding this comment.
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
}
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 exportedconst
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 asha1
of the file content in a LRU cache with a size of500
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.