No description
Find a file
Shu Ding 0dd0ef226c
Fix tree-shaking for metadata image functions on the Edge runtime (#51762)
This PR fixes tree-shaking for the metadata image generation module
(e.g. `opengraph-image.js` and other conventions) when the page has
`runtime = 'edge'`.

## Details

The first step of this fix is to change this from the loader:

```js
import * as exported from "./opengraph-image.js"
```

to be necessary fields only (so the `default` export can potentially be
removed):

```js
import { alt, size } from "./opengraph-image.js"
```

To know which fields are exported, we need to load the module first via
Webpack loader's `loadModule` API and check its
`HarmonyExportSpecifierDependency` dependencies.

This is the first step to make it tree-shakable. Since we have
`./opengraph-image.js` used in another entry, the actual image API route
`opengraph-image/route.js`:

```js
import * as image from "./opengraph-image.js"
```

Webpack still treats both as the same module and generates one chunk for
it. We want to "fork" it into two modules. The technique here is to add
a noop resource query and make it:

```js
import { alt, size } from "./opengraph-image.js?__next_metadata_image_meta__"
```

So it won't be shared in the chunk (as it's a different request), and
can be concatenated inline.

However that's not enough, the inlined result will still have all
imports from our `opengraph-image.js`, including `import { ImageResponse
} from 'next/server'`. Because we can't simply add `"sideEffects":
false` in Next.js' package.json, we need a way to mark this import as
side-effect free. I went through
https://github.com/webpack/webpack/blob/main/lib/optimize/SideEffectsFlagPlugin.js
and used the same method to mark that module with
`module.factoryMeta.sideEffectFree = true`.

With all these added, the page bundle will no longer contain the
`ImageResponse` instance.

## Result

The difference is quite amazing, for the new added test (an empty Edge
runtime page with an opengrah image file) here're the before/after
metrics for the `page.js` server bundle:

Edge bundle size: 892kB → 500kB.
Build time: 26.792s → 8.830s.
2023-06-26 13:44:29 +02:00
.cargo Revert "Next Build Turbo POC (#49942)" (#51538) 2023-06-19 21:54:04 -07:00
.config Update Next.js code owners (#51319) 2023-06-14 20:07:32 -07:00
.devcontainer re-enable next-dev-tests (#47087) 2023-03-14 16:05:19 +01:00
.github Update needs for build and deploy (#51731) 2023-06-23 17:14:22 -07:00
.husky Replace pre-commit with husky (#38350) 2022-07-06 11:14:16 -05:00
.vscode [Next Docs] Update Git Workflow (#50579) 2023-06-08 12:01:55 +02:00
bench Replace var with const (#49379) 2023-05-09 10:25:39 +02:00
contributing Update codeowners (#51250) 2023-06-13 17:47:12 +00:00
docs docs(deploy): fix GitHub Actions cache key (#51789) 2023-06-25 13:28:02 -07:00
errors Update docs for Google Analytics 4 (#51405) 2023-06-23 20:54:52 +00:00
examples chore(examples): relax pinned versions to fix npm install fail due to peer deps issue (#51636) 2023-06-24 00:12:38 -07:00
packages Fix tree-shaking for metadata image functions on the Edge runtime (#51762) 2023-06-26 13:44:29 +02:00
scripts Update codeowners (#51250) 2023-06-13 17:47:12 +00:00
test Fix tree-shaking for metadata image functions on the Edge runtime (#51762) 2023-06-26 13:44:29 +02:00
.alexignore Integrate next-* crates from Turbopack (#47019) 2023-03-13 14:33:17 +01:00
.alexrc docs: Add "special" to the Alex allowlist (#48021) 2023-04-06 16:32:06 +02:00
.eslintignore Migrate validate links script from next-site and setup GitHub action (#51365) 2023-06-20 13:19:06 +00:00
.eslintrc.json Update MetadataRoute to namespace (#47674) 2023-03-30 15:27:44 -07:00
.gitattributes chore: make next/src/build files indexable on github (#51647) 2023-06-22 11:32:42 +00:00
.gitignore Remove unused code from test-pack turbo task (#48487) 2023-04-18 12:12:00 +00:00
.npmrc fix: npm publish provenance permissions (#48757) 2023-04-24 14:08:55 +00:00
.prettierignore Migrate validate links script from next-site and setup GitHub action (#51365) 2023-06-20 13:19:06 +00:00
.prettierignore_staged Migrate validate links script from next-site and setup GitHub action (#51365) 2023-06-20 13:19:06 +00:00
.prettierrc.json Prettier trailingComma default value to es5 since 2.0 (#14391) 2020-06-22 13:25:24 +02:00
.rustfmt.toml build(cargo): move workspaces manifest to top level (#48198) 2023-04-19 18:38:36 +02:00
.vercel.approvers Move the Next.js team back to github codeowners (#51657) 2023-06-22 17:24:09 +00:00
azure-pipelines.yml Revert "Fix pnpm ERR_INVALID_THIS on Node 20" (#51539) 2023-06-19 23:38:15 -07:00
Cargo.lock Revert "Update swc_core to v0.78.15" (#51716) 2023-06-23 17:12:47 +00:00
Cargo.toml Revert "Update swc_core to v0.78.15" (#51716) 2023-06-23 17:12:47 +00:00
CODE_OF_CONDUCT.md updated code of conduct to v2.1 (#34208) 2022-02-10 18:11:42 -06:00
contributing.md chore: improve repo templates (#46629) 2023-03-01 09:25:51 -08:00
jest.config.js use env var to switch next.js to turbopack mode (#51353) 2023-06-21 13:52:14 +00:00
jest.replay.config.js Add Replay integration for dev e2e tests (#40955) 2022-09-29 14:45:10 -07:00
lerna.json v13.4.8-canary.2 2023-06-24 02:20:39 +00:00
license.md Update license year (#44403) 2023-01-01 11:12:49 +01:00
lint-staged.config.js Run dev tests against default CNA templates (#45211) 2023-01-24 11:01:03 -08:00
package.json type check tests (and convert next-test-utils.js to ts) (#51071) 2023-06-23 17:42:50 +00:00
plopfile.js Opt-in to dynamic rendering when reading searchParams (#46205) 2023-03-16 21:46:35 +01:00
pnpm-lock.yaml v13.4.8-canary.2 2023-06-24 02:20:39 +00:00
pnpm-workspace.yaml Integrate next-* crates from Turbopack (#47019) 2023-03-13 14:33:17 +01:00
readme.md Monorepo (#5341) 2018-10-01 01:02:10 +02:00
release.js Fix labels for release sections 2021-11-21 13:11:54 +01:00
run-tests.js ci(workflow): enable test trace upload (#51107) 2023-06-12 17:14:13 +00:00
rust-toolchain build(cargo): move workspaces manifest to top level (#48198) 2023-04-19 18:38:36 +02:00
test-file.txt Add additional file serving tests (#12479) 2020-05-04 11:58:19 -05:00
tsconfig-tsec.json Integrate tsec into the linting process (#33746) 2022-02-24 16:59:18 -08:00
tsconfig.json type check tests (and convert next-test-utils.js to ts) (#51071) 2023-06-23 17:42:50 +00:00
tsec-exemptions.json Move core files to src folder and move JS files to TypeScript (#44405) 2023-01-03 10:05:50 +01:00
turbo.json Ensure we run cargo-integration on next change (#51736) 2023-06-23 21:57:29 -07:00
UPGRADING.md Move upgrading guide to /docs (#10727) 2020-02-28 23:46:18 +01:00
vercel.json Silence GH Comments for Preview URLs (#18766) 2020-11-03 21:59:47 +00:00

Next.js

Getting Started

Visit https://nextjs.org/learn to get started with Next.js.

Documentation

Visit https://nextjs.org/docs to view the full documentation.

Who is using Next.js?

Next.js is used by the world's leading companies. Check out the Next.js Showcase to learn more.

Community

The Next.js community can be found on GitHub Discussions, where you can ask questions, voice ideas, and share your projects.

To chat with other community members you can join the Next.js Discord.

Our Code of Conduct applies to all Next.js community channels.

Contributing

Please see our contributing.md.

Good First Issues

We have a list of good first issues that contain bugs that have a relatively limited scope. This is a great place to get started, gain experience, and get familiar with our contribution process.

Authors

Security

If you believe you have found a security vulnerability in Next.js, we encourage you to responsibly disclose this and not open a public issue. We will investigate all legitimate reports. Email security@vercel.com to disclose any security vulnerabilities.

https://vercel.com/security