043bbaa731
<!-- 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 - Run `pnpm prettier-fix` to fix formatting issues before opening the PR. - Read the Docs Contribution Guide to ensure your contribution follows the docs guidelines: https://nextjs.org/docs/community/contribution-guide ### Adding or Updating 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? Make Telemetry import in `packages/next/src/server/lib/router-server.ts` lazy and conditional ### Why? `Telemetry` in that module is only used when `opts.dev` is truthy, so in production mode the module is imported and used. Cost of importing that module is quite significant chunk of starting `standalone` server. Those are example logs I got from https://www.npmjs.com/package/require-times (with updates to make it work as that is pretty old package that wasn't updated and doesn't work as is) on the server: Before the change: ``` total: 658ms 646ms node_modules/next/dist/server/lib/start-server.js 479ms node_modules/next/dist/server/lib/router-server.js 149ms node_modules/next/dist/telemetry/storage.js 87ms node_modules/next/dist/compiled/@edge-runtime/ponyfill/index.js 86ms node_modules/next/dist/compiled/@edge-runtime/primitives/index.js 1ms node_modules/next/dist/compiled/@edge-runtime/primitives/load.js 23ms node_modules/next/dist/compiled/@edge-runtime/primitives/fetch.js.text.js 12ms node_modules/next/dist/compiled/@edge-runtime/primitives/url.js.text.js 1ms node_modules/next/dist/compiled/@edge-runtime/primitives/events.js.text.js 1ms node_modules/next/dist/compiled/@edge-runtime/primitives/structured-clone.js.text.js 41ms node_modules/next/dist/compiled/conf/index.js 12ms node_modules/next/dist/compiled/semver/index.js 12ms node_modules/next/dist/telemetry/project-id.js 3ms node_modules/next/dist/telemetry/post-payload.js 1ms node_modules/next/dist/compiled/is-docker/index.js 1ms node_modules/next/dist/telemetry/anonymous-meta.js 1ms node_modules/next/dist/compiled/is-wsl/index.js 100ms node_modules/next/dist/server/base-server.js 17ms node_modules/next/dist/server/future/route-matcher-providers/app-page-route-matcher-provider.js 7ms node_modules/next/dist/lib/is-app-page-route.js 7ms node_modules/next/dist/server/future/normalizers/built/app/index.js 3ms node_modules/next/dist/server/future/normalizers/built/app/app-page-normalizer.js 2ms node_modules/next/dist/server/future/normalizers/absolute-filename-normalizer.js 1ms node_modules/next/dist/shared/lib/page-path/absolute-path-to-page.js 1ms node_modules/next/dist/lib/page-types.js 2ms node_modules/next/dist/server/future/normalizers/built/app/app-bundle-path-normalizer.js 1ms node_modules/next/dist/shared/lib/page-path/normalize-page-path.js 1ms node_modules/next/dist/server/future/normalizers/built/app/app-filename-normalizer.js 1ms node_modules/next/dist/server/future/normalizers/built/app/app-pathname-normalizer.js 1ms node_modules/next/dist/server/future/route-matcher-providers/manifest-route-matcher-provider.js 15ms node_modules/next/dist/server/app-render/strip-flight-headers.js 13ms node_modules/next/dist/server/future/route-modules/helpers/response-handlers.js 13ms node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.js 8ms node_modules/next/dist/server/future/normalizers/locale-route-normalizer.js 4ms node_modules/next/dist/server/api-utils/index.js 2ms node_modules/next/dist/server/web/spec-extension/adapters/headers.js 1ms node_modules/next/dist/server/web/spec-extension/adapters/reflect.js 4ms node_modules/next/dist/server/render-result.js 3ms node_modules/next/dist/server/stream-utils/node-web-streams-helper.js 1ms node_modules/next/dist/lib/scheduler.js 4ms node_modules/next/dist/server/future/route-matcher-providers/pages-api-route-matcher-provider.js 3ms node_modules/next/dist/server/future/normalizers/built/pages/index.js 1ms node_modules/next/dist/server/future/normalizers/built/pages/pages-filename-normalizer.js 1ms node_modules/next/dist/server/future/normalizers/built/pages/pages-pathname-normalizer.js 1ms node_modules/next/dist/lib/is-api-route.js 2ms node_modules/next/dist/server/future/route-matcher-managers/default-route-matcher-manager.js 1ms node_modules/next/dist/server/future/route-matchers/locale-route-matcher.js 2ms node_modules/next/dist/server/future/route-matcher-providers/app-route-route-matcher-provider.js 2ms node_modules/next/dist/server/lib/match-next-data-pathname.js 2ms node_modules/next/dist/server/future/route-modules/checks.js 1ms node_modules/next/dist/lib/is-edge-runtime.js 1ms node_modules/next/dist/shared/lib/runtime-config.external.js 1ms node_modules/next/dist/server/lib/revalidate.js 1ms node_modules/next/dist/shared/lib/router/utils/escape-path-delimiters.js 1ms node_modules/next/dist/server/future/route-matcher-providers/pages-route-matcher-provider.js 1ms node_modules/next/dist/server/future/route-matchers/pages-route-matcher.js 1ms node_modules/next/dist/server/send-response.js 1ms node_modules/next/dist/shared/lib/router/utils/get-route-from-asset-path.js 1ms node_modules/next/dist/server/lib/server-action-request-meta.js 83ms node_modules/next/dist/server/lib/router-utils/filesystem.js 22ms node_modules/next/dist/lib/load-custom-routes.js 4ms node_modules/next/dist/lib/try-to-parse-path.js 2ms node_modules/next/dist/lib/is-error.js 1ms node_modules/next/dist/shared/lib/is-plain-object.js 1ms node_modules/next/dist/compiled/path-to-regexp/index.js 2ms node_modules/next/dist/lib/redirect-status.js 1ms node_modules/next/dist/client/components/redirect-status-code.js 1ms node_modules/next/dist/shared/lib/escape-regexp.js 16ms node_modules/next/dist/server/future/normalizers/request/rsc.js 13ms node_modules/next/dist/shared/lib/router/utils/index.js 10ms node_modules/next/dist/shared/lib/router/utils/is-dynamic.js 3ms node_modules/next/dist/server/future/helpers/interception-routes.js 1ms node_modules/next/dist/shared/lib/router/utils/app-paths.js 1ms node_modules/next/dist/shared/lib/page-path/ensure-leading-slash.js 1ms node_modules/next/dist/shared/lib/router/utils/sorted-routes.js 9ms node_modules/next/dist/shared/lib/page-path/normalize-path-sep.js 4ms node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.js 4ms node_modules/next/dist/shared/lib/router/utils/prepare-destination.js 1ms node_modules/next/dist/client/components/app-router-headers.js 1ms node_modules/next/dist/server/api-utils/get-cookie-parser.js 4ms node_modules/next/dist/lib/metadata/get-metadata-route.js 2ms node_modules/next/dist/server/server-utils.js 1ms node_modules/next/dist/lib/metadata/is-metadata-route.js 1ms node_modules/next/dist/compiled/lru-cache/index.js 1ms node_modules/next/dist/lib/file-exists.js 1ms node_modules/next/dist/lib/recursive-readdir.js 1ms node_modules/next/dist/shared/lib/router/utils/path-match.js 1ms node_modules/next/dist/shared/lib/router/utils/route-regex.js 1ms node_modules/next/dist/shared/lib/router/utils/route-matcher.js 1ms node_modules/next/dist/server/future/normalizers/request/postponed.js 1ms node_modules/next/dist/shared/lib/page-path/denormalize-page-path.js 1ms node_modules/next/dist/server/future/normalizers/request/prefetch-rsc.js 35ms node_modules/next/dist/server/lib/router-utils/resolve-routes.js 11ms node_modules/next/dist/server/body-streams.js 1ms node_modules/next/dist/server/lib/server-ipc/utils.js 1ms node_modules/next/dist/shared/lib/router/utils/relativize-url.js 1ms node_modules/next/dist/server/future/normalizers/request/next-data.js 1ms node_modules/next/dist/server/lib/mock-request.js 22ms node_modules/next/dist/server/serve-static.js 20ms node_modules/next/dist/compiled/send/index.js 1ms node_modules/next/dist/compiled/fresh/index.js 22ms node_modules/next/dist/server/pipe-readable.js 20ms node_modules/next/dist/server/web/spec-extension/adapters/next-request.js 18ms node_modules/next/dist/server/web/spec-extension/request.js 15ms node_modules/next/dist/server/web/next-url.js 12ms node_modules/next/dist/shared/lib/router/utils/format-next-pathname-info.js 1ms node_modules/next/dist/shared/lib/router/utils/add-path-prefix.js 1ms node_modules/next/dist/shared/lib/i18n/detect-domain-locale.js 2ms node_modules/next/dist/server/web/spec-extension/cookies.js 1ms node_modules/next/dist/compiled/@edge-runtime/cookies/index.js 1ms node_modules/next/dist/lib/detached-promise.js 19ms node_modules/next/dist/compiled/compression/index.js 16ms node_modules/next/dist/server/lib/dev-bundler-service.js 4ms node_modules/next/dist/trace/index.js 3ms node_modules/next/dist/trace/trace.js 2ms node_modules/next/dist/trace/report/index.js 1ms node_modules/next/dist/trace/report/to-telemetry.js 1ms node_modules/next/dist/trace/report/to-json.js 2ms node_modules/next/dist/server/lib/router-utils/proxy-request.js 1ms node_modules/next/dist/server/server-route-utils.js 1ms node_modules/next/dist/server/node-environment.js 1ms node_modules/next/dist/shared/lib/utils.js 1ms node_modules/next/dist/lib/find-pages-dir.js 1ms node_modules/next/dist/server/lib/router-utils/is-postpone.js 140ms node_modules/next/dist/server/next.js 84ms node_modules/next/dist/server/config.js 20ms node_modules/next/dist/shared/lib/match-remote-pattern.js 18ms node_modules/next/dist/compiled/micromatch/index.js 17ms node_modules/next/dist/compiled/zod/index.js 14ms node_modules/next/dist/shared/lib/constants.js 8ms node_modules/@swc/helpers/cjs/_interop_require_default.cjs 3ms node_modules/next/dist/compiled/find-up/index.js 1ms node_modules/next/dist/compiled/p-limit/index.js 3ms node_modules/next/dist/telemetry/ci-info.js 1ms node_modules/next/dist/compiled/ci-info/index.js 2ms node_modules/next/dist/server/config-shared.js 1ms node_modules/next/dist/shared/lib/image-config.js 2ms node_modules/@next/env/dist/index.js 2ms node_modules/next/dist/telemetry/flush-and-exit.js 2ms node_modules/next/dist/lib/find-root.js 1ms node_modules/next/dist/server/setup-http-agent-env.js 1ms node_modules/next/dist/shared/lib/router/utils/path-has-prefix.js 21ms node_modules/next/dist/server/lib/trace/tracer.js 5ms node_modules/next/dist/compiled/@opentelemetry/api/index.js 1ms node_modules/next/dist/server/lib/trace/constants.js 13ms node_modules/next/dist/shared/lib/router/utils/format-url.js 12ms node_modules/next/dist/build/output/log.js 9ms node_modules/next/dist/lib/picocolors.js 3ms node_modules/next/dist/server/require-hook.js 1ms node_modules/next/dist/server/node-polyfill-crypto.js 1ms node_modules/next/dist/lib/constants.js 1ms node_modules/next/dist/server/lib/utils.js 14ms node_modules/next/dist/compiled/watchpack/watchpack.js 3ms node_modules/next/dist/compiled/debug/index.js 1ms node_modules/next/dist/server/lib/format-hostname.js 1ms node_modules/next/dist/server/lib/app-info-log.js 1ms node_modules/next/dist/lib/turbopack-warning.js ``` And after the change: ``` total: 516ms 499ms node_modules/next/dist/server/lib/start-server.js 303ms node_modules/next/dist/server/lib/router-server.js 103ms node_modules/next/dist/server/base-server.js 42ms node_modules/next/dist/server/future/route-matcher-providers/app-page-route-matcher-provider.js 38ms node_modules/next/dist/server/future/normalizers/built/app/index.js 20ms node_modules/next/dist/server/future/normalizers/built/app/app-page-normalizer.js 18ms node_modules/next/dist/server/future/normalizers/absolute-filename-normalizer.js 17ms node_modules/next/dist/shared/lib/page-path/absolute-path-to-page.js 1ms node_modules/next/dist/lib/page-types.js 17ms node_modules/next/dist/server/future/normalizers/built/app/app-bundle-path-normalizer.js 16ms node_modules/next/dist/shared/lib/page-path/normalize-page-path.js 1ms node_modules/next/dist/server/future/normalizers/built/app/app-pathname-normalizer.js 1ms node_modules/next/dist/lib/is-app-page-route.js 1ms node_modules/next/dist/server/future/route-kind.js 1ms node_modules/next/dist/server/future/route-matcher-providers/manifest-route-matcher-provider.js 10ms node_modules/next/dist/server/send-response.js 8ms node_modules/next/dist/server/future/normalizers/locale-route-normalizer.js 4ms node_modules/next/dist/server/api-utils/index.js 2ms node_modules/next/dist/server/web/spec-extension/adapters/headers.js 1ms node_modules/next/dist/server/web/spec-extension/adapters/reflect.js 3ms node_modules/next/dist/server/render-result.js 2ms node_modules/next/dist/server/stream-utils/node-web-streams-helper.js 3ms node_modules/next/dist/server/future/route-matcher-providers/pages-api-route-matcher-provider.js 2ms node_modules/next/dist/server/future/normalizers/built/pages/index.js 1ms node_modules/next/dist/server/future/normalizers/built/pages/pages-bundle-path-normalizer.js 1ms node_modules/next/dist/server/future/route-matchers/pages-api-route-matcher.js 2ms node_modules/next/dist/server/future/route-matcher-providers/app-route-route-matcher-provider.js 1ms node_modules/next/dist/lib/is-app-route-route.js 1ms node_modules/next/dist/server/future/route-matchers/app-route-route-matcher.js 2ms node_modules/next/dist/server/future/route-modules/helpers/response-handlers.js 1ms node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.js 2ms node_modules/next/dist/server/lib/match-next-data-pathname.js 1ms node_modules/next/dist/lib/is-edge-runtime.js 1ms node_modules/next/dist/shared/lib/runtime-config.external.js 1ms node_modules/next/dist/server/lib/revalidate.js 1ms node_modules/next/dist/shared/lib/router/utils/escape-path-delimiters.js 1ms node_modules/next/dist/server/future/route-matcher-managers/default-route-matcher-manager.js 1ms node_modules/next/dist/server/future/route-matcher-providers/pages-route-matcher-provider.js 1ms node_modules/next/dist/shared/lib/router/utils/get-route-from-asset-path.js 1ms node_modules/next/dist/server/app-render/strip-flight-headers.js 1ms node_modules/next/dist/server/future/route-modules/checks.js 1ms node_modules/next/dist/server/lib/server-action-request-meta.js 91ms node_modules/next/dist/server/lib/router-utils/filesystem.js 21ms node_modules/next/dist/lib/load-custom-routes.js 16ms node_modules/next/dist/lib/try-to-parse-path.js 13ms node_modules/next/dist/lib/is-error.js 1ms node_modules/next/dist/shared/lib/is-plain-object.js 2ms node_modules/next/dist/compiled/path-to-regexp/index.js 3ms node_modules/next/dist/lib/redirect-status.js 1ms node_modules/next/dist/client/components/redirect-status-code.js 16ms node_modules/next/dist/server/future/normalizers/request/prefetch-rsc.js 12ms node_modules/next/dist/lib/metadata/get-metadata-route.js 10ms node_modules/next/dist/server/server-utils.js 1ms node_modules/next/dist/shared/lib/isomorphic/path.js 9ms node_modules/next/dist/shared/lib/router/utils/route-regex.js 1ms node_modules/next/dist/shared/lib/router/utils/remove-trailing-slash.js 6ms node_modules/next/dist/shared/lib/router/utils/index.js 3ms node_modules/next/dist/shared/lib/router/utils/is-dynamic.js 2ms node_modules/next/dist/server/future/helpers/interception-routes.js 1ms node_modules/next/dist/shared/lib/router/utils/app-paths.js 1ms node_modules/next/dist/shared/lib/page-path/ensure-leading-slash.js 1ms node_modules/next/dist/shared/lib/router/utils/sorted-routes.js 5ms node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.js 5ms node_modules/next/dist/shared/lib/router/utils/prepare-destination.js 1ms node_modules/next/dist/shared/lib/router/utils/parse-url.js 1ms node_modules/next/dist/client/components/app-router-headers.js 1ms node_modules/next/dist/server/api-utils/get-cookie-parser.js 2ms node_modules/next/dist/compiled/lru-cache/index.js 2ms node_modules/next/dist/server/future/normalizers/request/postponed.js 1ms node_modules/next/dist/shared/lib/page-path/denormalize-page-path.js 1ms node_modules/next/dist/lib/file-exists.js 1ms node_modules/next/dist/lib/recursive-readdir.js 1ms node_modules/next/dist/shared/lib/router/utils/path-match.js 1ms node_modules/next/dist/server/future/normalizers/request/rsc.js 24ms node_modules/next/dist/server/pipe-readable.js 22ms node_modules/next/dist/server/web/spec-extension/adapters/next-request.js 20ms node_modules/next/dist/server/web/spec-extension/request.js 17ms node_modules/next/dist/server/web/next-url.js 13ms node_modules/next/dist/shared/lib/i18n/detect-domain-locale.js 2ms node_modules/next/dist/shared/lib/router/utils/format-next-pathname-info.js 1ms node_modules/next/dist/shared/lib/router/utils/add-path-suffix.js 1ms node_modules/next/dist/shared/lib/router/utils/get-next-pathname-info.js 3ms node_modules/next/dist/server/web/spec-extension/cookies.js 1ms node_modules/next/dist/compiled/@edge-runtime/cookies/index.js 1ms node_modules/next/dist/server/web/utils.js 1ms node_modules/next/dist/lib/detached-promise.js 22ms node_modules/next/dist/server/serve-static.js 21ms node_modules/next/dist/compiled/send/index.js 18ms node_modules/next/dist/server/lib/router-utils/resolve-routes.js 11ms node_modules/next/dist/server/body-streams.js 1ms node_modules/next/dist/server/lib/server-ipc/utils.js 1ms node_modules/next/dist/shared/lib/router/utils/relativize-url.js 1ms node_modules/next/dist/server/future/normalizers/request/next-data.js 1ms node_modules/next/dist/server/lib/mock-request.js 18ms node_modules/next/dist/compiled/compression/index.js 1ms node_modules/next/dist/compiled/bytes/index.js 10ms node_modules/next/dist/server/lib/dev-bundler-service.js 4ms node_modules/next/dist/trace/index.js 2ms node_modules/next/dist/trace/trace.js 2ms node_modules/next/dist/trace/report/index.js 1ms node_modules/next/dist/trace/report/to-json.js 3ms node_modules/next/dist/server/lib/router-utils/proxy-request.js 2ms node_modules/next/dist/server/server-route-utils.js 1ms node_modules/next/dist/server/request-meta.js 2ms node_modules/next/dist/shared/lib/utils.js 1ms node_modules/next/dist/server/node-environment.js 1ms node_modules/next/dist/lib/find-pages-dir.js 1ms node_modules/next/dist/server/lib/router-utils/is-postpone.js 157ms node_modules/next/dist/server/next.js 99ms node_modules/next/dist/server/config.js 24ms node_modules/next/dist/shared/lib/match-remote-pattern.js 5ms node_modules/next/dist/compiled/micromatch/index.js 17ms node_modules/next/dist/compiled/zod/index.js 15ms node_modules/next/dist/shared/lib/constants.js 1ms node_modules/@swc/helpers/cjs/_interop_require_default.cjs 1ms node_modules/next/dist/shared/lib/modern-browserslist-target.js 4ms node_modules/next/dist/compiled/find-up/index.js 1ms node_modules/next/dist/compiled/p-limit/index.js 4ms node_modules/next/dist/telemetry/ci-info.js 2ms node_modules/next/dist/compiled/ci-info/index.js 3ms node_modules/next/dist/server/config-shared.js 1ms node_modules/next/dist/shared/lib/image-config.js 2ms node_modules/next/dist/telemetry/flush-and-exit.js 2ms node_modules/next/dist/lib/find-root.js 2ms node_modules/next/dist/server/setup-http-agent-env.js 2ms node_modules/next/dist/shared/lib/router/utils/path-has-prefix.js 1ms node_modules/next/dist/shared/lib/router/utils/parse-path.js 1ms node_modules/@next/env/dist/index.js 17ms node_modules/next/dist/server/lib/trace/tracer.js 14ms node_modules/next/dist/compiled/@opentelemetry/api/index.js 1ms node_modules/next/dist/server/lib/trace/constants.js 13ms node_modules/next/dist/lib/constants.js 5ms node_modules/next/dist/shared/lib/router/utils/format-url.js 1ms node_modules/@swc/helpers/cjs/_interop_require_wildcard.cjs 1ms node_modules/next/dist/shared/lib/router/utils/querystring.js 4ms node_modules/next/dist/build/output/log.js 1ms node_modules/next/dist/lib/picocolors.js 3ms node_modules/next/dist/server/require-hook.js 1ms node_modules/next/dist/server/lib/utils.js 7ms node_modules/next/dist/compiled/watchpack/watchpack.js 3ms node_modules/next/dist/compiled/debug/index.js 2ms node_modules/next/dist/server/lib/format-hostname.js 1ms node_modules/next/dist/server/lib/is-ipv6.js 1ms node_modules/next/dist/server/lib/app-info-log.js 1ms node_modules/next/dist/lib/turbopack-warning.js ``` I would not pay much attention to absolute numbers as there will be variance and those are single runs - but from first "require time dump" you can estimate importing Telemetry (that might be unused) is costing 149ms / 658ms ~= 22.5% of entire time spent on importing modules - that's pretty significant ### How? By moving static import/require from top level to conditional code path that actually uses it. This code path already have some modules lazy/conditionally loaded. `packages/next/src/telemetry/storage.ts` doesn't seem to have import side effects so at least on my first glance it doesn't seem like moving import should cause problems? Co-authored-by: JJ Kasper <jj@jjsweb.site> |
||
---|---|---|
.cargo | ||
.config | ||
.devcontainer | ||
.github | ||
.husky | ||
.vscode | ||
bench | ||
contributing | ||
docs | ||
errors | ||
examples | ||
packages | ||
scripts | ||
test | ||
turbo/generators | ||
.alexignore | ||
.alexrc | ||
.eslintignore | ||
.eslintrc.json | ||
.git-blame-ignore-revs | ||
.gitattributes | ||
.gitignore | ||
.node-version | ||
.npmrc | ||
.prettierignore | ||
.prettierignore_staged | ||
.prettierrc.json | ||
.rustfmt.toml | ||
azure-pipelines.yml | ||
Cargo.lock | ||
Cargo.toml | ||
CODE_OF_CONDUCT.md | ||
contributing.md | ||
jest.config.js | ||
jest.replay.config.js | ||
lerna.json | ||
license.md | ||
lint-staged.config.js | ||
package.json | ||
pnpm-lock.yaml | ||
pnpm-workspace.yaml | ||
readme.md | ||
release.js | ||
run-tests.js | ||
rust-toolchain | ||
socket.yaml | ||
test-file.txt | ||
tsconfig-tsec.json | ||
tsconfig.base.json | ||
tsconfig.json | ||
tsec-exemptions.json | ||
turbo.json | ||
UPGRADING.md | ||
vercel.json |
Next.js
Getting Started
Used by some of the world's largest companies, Next.js enables you to create full-stack web applications by extending the latest React features, and integrating powerful Rust-based JavaScript tooling for the fastest builds.
- Visit our Learn Next.js course to get started with Next.js.
- Visit the Next.js Showcase to see more sites built with Next.js.
Documentation
Visit https://nextjs.org/docs to view the full documentation.
Community
The Next.js community can be found on GitHub Discussions where you can ask questions, voice ideas, and share your projects with other people.
To chat with other community members you can join the Next.js Discord server.
Do note that our Code of Conduct applies to all Next.js community channels. Users are highly encouraged to read and adhere to them to avoid repercussions.
Contributing
Contributions to Next.js are welcome and highly appreciated. However, before you jump right into it, we would like you to review our Contribution Guidelines to make sure you have a smooth experience contributing to Next.js.
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 for newcomers and beginners alike to get started, gain experience, and get familiar with our contribution process.
Authors
A list of the original co-authors of Next.js that helped bring this amazing framework to life!
- Tim Neutkens (@timneutkens)
- Naoyuki Kanezawa (@nkzawa)
- Guillermo Rauch (@rauchg)
- Arunoda Susiripala (@arunoda)
- Tony Kovanen (@tonykovanen)
- Dan Zajdband (@impronunciable)
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. Alternatively, you can visit this link to know more about Vercel's security and report any security vulnerabilities.