Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Optimize Next.js bootup compilation (#50379)
## What? Currently we use the initial compile to add entrypoints that we know are going to be used in the application. For example the Next.js runtime, `react`, `react-dom`, and such. While this was the right default when Next.js only had `pages`, it's no longer true when both `pages` and `app` exist. E.g. when you're working on a page using App Router we'd still compile `pages/_app`, `pages/_document`, and `pages/_error` even though those would not be used. In case of larger applications (e.g. Vercel's application) this would mean thousands of extra modules being compiled even though you don't need them for the page you're looking at. Similarly we'd compile the Next.js runtime for App Router even when you're only using `pages`. This PR changes the handling to only compile the entries that are needed for the current set of visited pages (on-demand-entries). If that set only includes `app` entrypoints then the `pages` related files will be excluded. If the set contains both `app` and `pages` both will be included. Similarly for `amp`, if you don't use `amp: true` / `amp: hybrid` the development runtime will not be compiled. 📔 Note: This is specifically for webpack, Turbopack already compiles everything needed lazily so it didn't have this limitation. #### Before ``` - event compiled client and server successfully in 1079 ms (306 modules) - event compiled client and server successfully in 155 ms (306 modules) ``` With opening `/`: ``` - event compiled client and server successfully in 1118 ms (306 modules) - event compiled client and server successfully in 157 ms (306 modules) - event compiled client and server successfully in 599 ms (486 modules) ``` Total: 1.874ms (Note: This number is much higher when `pages/_app` imports many modules). #### After ``` - event compiled client and server successfully in 118 ms (20 modules) - event compiled client and server successfully in 65 ms (20 modules) ``` 📔 Note: opening the page then causes the Next.js / React runtime to be compiled ofcourse ``` - event compiled client and server successfully in 115 ms (20 modules) - event compiled client and server successfully in 57 ms (20 modules) - event compiled client and server successfully in 1137 ms (361 modules) ``` Total: 1.309ms (Note: This number is not affected by`pages/_app` importing many modules). ## How? We can only apply this optimization after we've looped over the list of on-demand entries, as that has the required metadata. Hence why I went with deleting the keys for each respective type of entrypoint (`pages`, `app`, `amp`). <!-- Thanks for opening a PR! Your contribution is much appreciated. To make sure your PR is handled as smoothly as possible we request that you follow the checklist sections below. Choose the right checklist for the change(s) that you're making: ## For Contributors ### Improving Documentation or adding/fixing Examples - The "examples guidelines" are followed from our contributing doc https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md - Make sure the linting passes by running `pnpm build && pnpm lint`. See https://github.com/vercel/next.js/blob/canary/contributing/repository/linting.md ### Fixing a bug - Related issues linked using `fixes #number` - Tests added. See: https://github.com/vercel/next.js/blob/canary/contributing/core/testing.md#writing-tests-for-nextjs - Errors have a helpful link attached, see https://github.com/vercel/next.js/blob/canary/contributing.md ### Adding a feature - Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. (A discussion must be opened, see https://github.com/vercel/next.js/discussions/new?category=ideas) - Related issues/discussions are linked using `fixes #number` - e2e tests added (https://github.com/vercel/next.js/blob/canary/contributing/core/testing.md#writing-tests-for-nextjs - Documentation added - Telemetry added. In case of a feature if it's used or not. - Errors have a helpful link attached, see https://github.com/vercel/next.js/blob/canary/contributing.md ## For Maintainers - Minimal description (aim for explaining to someone not on the team to understand the PR) - When linking to a Slack thread, you might want to share details of the conclusion - Link both the Linear (Fixes NEXT-xxx) and the GitHub issues - Add review comments if necessary to explain to the reviewer the logic behind a change ### What? ### Why? ### How? Closes NEXT- Fixes # --> --------- Co-authored-by: JJ Kasper <[email protected]>
- Loading branch information