Some checks failed
Test examples / Test Examples (20) (push) Has been cancelled
Test examples / Test Examples (22) (push) Has been cancelled
Lock Threads / action (push) Has been cancelled
Trigger Release / start (push) Has been cancelled
Stale issue handler / stale (push) Has been cancelled
Update Font Data / create-pull-request (push) Has been cancelled
build-and-deploy / deploy-target (push) Has been cancelled
build-and-deploy / build (push) Has been cancelled
build-and-deploy / stable - aarch64-unknown-linux-musl - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-unknown-linux-musl - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-unknown-linux-gnu - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-unknown-linux-gnu - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-pc-windows-msvc - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-pc-windows-msvc - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-apple-darwin - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-apple-darwin - node@16 (push) Has been cancelled
build-and-deploy / build-wasm (nodejs) (push) Has been cancelled
build-and-deploy / build-wasm (web) (push) Has been cancelled
build-and-deploy / Deploy preview tarball (push) Has been cancelled
build-and-deploy / Potentially publish release (push) Has been cancelled
build-and-deploy / publish-turbopack-npm-packages (push) Has been cancelled
build-and-deploy / Deploy examples (push) Has been cancelled
build-and-deploy / thank you, build (push) Has been cancelled
build-and-deploy / Upload Turbopack Bytesize metrics to Datadog (push) Has been cancelled
Rspack Next.js development integration tests / Rspack integration tests (push) Has been cancelled
Rspack Next.js production integration tests / Rspack integration tests (push) Has been cancelled
Turbopack Next.js development integration tests / Next.js integration tests (push) Has been cancelled
Turbopack Next.js production integration tests / Next.js integration tests (push) Has been cancelled
Update Rspack test manifest / Update and upload Rspack development test manifest (push) Has been cancelled
Update Rspack test manifest / Update and upload Rspack production test manifest (push) Has been cancelled
Upload bundler test manifests to areweturboyet.com / Upload test results (push) Has been cancelled
Update React / create-pull-request (push) Has been cancelled
test-e2e-project-reset-cron / reset-test-project (push) Has been cancelled
Notify about the top 15 issues/PRs/feature requests (most reacted) in the last 90 days / run (push) Has been cancelled
430 lines
13 KiB
Plaintext
430 lines
13 KiB
Plaintext
---
|
|
title: Installation
|
|
description: Learn how to create a new Next.js application with the `create-next-app` CLI, and set up TypeScript, ESLint, and Module Path Aliases.
|
|
---
|
|
|
|
{/* The content of this doc is shared between the app and pages router. You can use the `<PagesOnly>Content</PagesOnly>` component to add content that is specific to the Pages Router. Any shared content should not be wrapped in a component. */}
|
|
|
|
<AppOnly>
|
|
|
|
Create a new Next.js app and run it locally.
|
|
|
|
## Quick start
|
|
|
|
1. Create a new Next.js app named `my-app`
|
|
2. `cd my-app` and start the dev server.
|
|
3. Visit `http://localhost:3000`.
|
|
|
|
```bash package="pnpm"
|
|
pnpm create next-app@latest my-app --yes
|
|
cd my-app
|
|
pnpm dev
|
|
```
|
|
|
|
```bash package="npm"
|
|
npx create-next-app@latest my-app --yes
|
|
cd my-app
|
|
npm run dev
|
|
```
|
|
|
|
```bash package="yarn"
|
|
yarn create next-app@latest my-app --yes
|
|
cd my-app
|
|
yarn dev
|
|
```
|
|
|
|
```bash package="bun"
|
|
bun create next-app@latest my-app --yes
|
|
cd my-app
|
|
bun dev
|
|
```
|
|
|
|
- `--yes` skips prompts using saved preferences or defaults. The default setup enables TypeScript, Tailwind CSS, ESLint, App Router, and Turbopack, with import alias `@/*`, and includes `AGENTS.md` (with a `CLAUDE.md` that references it) to guide coding agents to write up-to-date Next.js code.
|
|
|
|
</AppOnly>
|
|
|
|
## System requirements
|
|
|
|
Before you begin, make sure your development environment meets the following requirements:
|
|
|
|
- Minimum Node.js version: [20.9](https://nodejs.org/)
|
|
- Operating systems: macOS, Windows (including WSL), and Linux.
|
|
|
|
## Supported browsers
|
|
|
|
Next.js supports modern browsers with zero configuration.
|
|
|
|
- Chrome 111+
|
|
- Edge 111+
|
|
- Firefox 111+
|
|
- Safari 16.4+
|
|
|
|
Learn more about [browser support](/docs/architecture/supported-browsers), including how to configure polyfills and target specific browsers.
|
|
|
|
## Create with the CLI
|
|
|
|
The quickest way to create a new Next.js app is using [`create-next-app`](/docs/app/api-reference/cli/create-next-app), which sets up everything automatically for you. To create a project, run:
|
|
|
|
```bash package="pnpm"
|
|
pnpm create next-app
|
|
```
|
|
|
|
```bash package="npm"
|
|
npx create-next-app@latest
|
|
```
|
|
|
|
```bash package="yarn"
|
|
yarn create next-app
|
|
```
|
|
|
|
```bash package="bun"
|
|
bun create next-app
|
|
```
|
|
|
|
On installation, you'll see the following prompts:
|
|
|
|
```txt filename="Terminal"
|
|
What is your project named? my-app
|
|
Would you like to use the recommended Next.js defaults?
|
|
Yes, use recommended defaults - TypeScript, ESLint, Tailwind CSS, App Router, AGENTS.md
|
|
No, reuse previous settings
|
|
No, customize settings - Choose your own preferences
|
|
```
|
|
|
|
If you choose to `customize settings`, you'll see the following prompts:
|
|
|
|
```txt filename="Terminal"
|
|
Would you like to use TypeScript? No / Yes
|
|
Which linter would you like to use? ESLint / Biome / None
|
|
Would you like to use React Compiler? No / Yes
|
|
Would you like to use Tailwind CSS? No / Yes
|
|
Would you like your code inside a `src/` directory? No / Yes
|
|
Would you like to use App Router? (recommended) No / Yes
|
|
Would you like to customize the import alias (`@/*` by default)? No / Yes
|
|
What import alias would you like configured? @/*
|
|
Would you like to include AGENTS.md to guide coding agents to write up-to-date Next.js code? No / Yes
|
|
```
|
|
|
|
After the prompts, [`create-next-app`](/docs/app/api-reference/cli/create-next-app) will create a folder with your project name and install the required dependencies.
|
|
|
|
## Manual installation
|
|
|
|
To manually create a new Next.js app, install the required packages:
|
|
|
|
```bash package="pnpm"
|
|
pnpm i next@latest react@latest react-dom@latest
|
|
```
|
|
|
|
```bash package="npm"
|
|
npm i next@latest react@latest react-dom@latest
|
|
```
|
|
|
|
```bash package="yarn"
|
|
yarn add next@latest react@latest react-dom@latest
|
|
```
|
|
|
|
```bash package="bun"
|
|
bun add next@latest react@latest react-dom@latest
|
|
```
|
|
|
|
> **Good to know**:
|
|
>
|
|
> - The `App Router` uses [React canary releases](https://react.dev/blog/2023/05/03/react-canaries) built-in, which include all the stable React 19 changes, as well as newer features being validated in frameworks, but you should still declare react and react-dom in package.json for tooling and ecosystem compatibility.
|
|
> - The `Pages Router` uses the React version from your `package.json`.
|
|
|
|
Then, add the following scripts to your `package.json` file:
|
|
|
|
```json filename="package.json"
|
|
{
|
|
"scripts": {
|
|
"dev": "next dev",
|
|
"build": "next build",
|
|
"start": "next start",
|
|
"lint": "eslint",
|
|
"lint:fix": "eslint --fix"
|
|
}
|
|
}
|
|
```
|
|
|
|
These scripts refer to the different stages of developing an application:
|
|
|
|
- `next dev`: Starts the development server using Turbopack (default bundler).
|
|
- `next build`: Builds the application for production.
|
|
- `next start`: Starts the production server.
|
|
- `eslint`: Runs ESLint.
|
|
|
|
Turbopack is now the default bundler. To use Webpack run `next dev --webpack` or `next build --webpack`. See the [Turbopack docs](/docs/app/api-reference/turbopack) for configuration details.
|
|
|
|
<AppOnly>
|
|
|
|
### Create the `app` directory
|
|
|
|
Next.js uses file-system routing, which means the routes in your application are determined by how you structure your files.
|
|
|
|
Create an `app` folder. Then, inside `app`, create a `layout.tsx` file. This file is the [root layout](/docs/app/api-reference/file-conventions/layout#root-layout). It's required and must contain the `<html>` and `<body>` tags.
|
|
|
|
```tsx filename="app/layout.tsx" switcher
|
|
export default function RootLayout({
|
|
children,
|
|
}: {
|
|
children: React.ReactNode
|
|
}) {
|
|
return (
|
|
<html lang="en">
|
|
<body>{children}</body>
|
|
</html>
|
|
)
|
|
}
|
|
```
|
|
|
|
```jsx filename="app/layout.js" switcher
|
|
export default function RootLayout({ children }) {
|
|
return (
|
|
<html lang="en">
|
|
<body>{children}</body>
|
|
</html>
|
|
)
|
|
}
|
|
```
|
|
|
|
Create a home page `app/page.tsx` with some initial content:
|
|
|
|
```tsx filename="app/page.tsx" switcher
|
|
export default function Page() {
|
|
return <h1>Hello, Next.js!</h1>
|
|
}
|
|
```
|
|
|
|
```jsx filename="app/page.js" switcher
|
|
export default function Page() {
|
|
return <h1>Hello, Next.js!</h1>
|
|
}
|
|
```
|
|
|
|
Both `layout.tsx` and `page.tsx` will be rendered when the user visits the root of your application (`/`).
|
|
|
|
<Image
|
|
alt="App Folder Structure"
|
|
srcLight="/docs/light/app-getting-started.png"
|
|
srcDark="/docs/dark/app-getting-started.png"
|
|
width="1600"
|
|
height="363"
|
|
/>
|
|
|
|
> **Good to know**:
|
|
>
|
|
> - If you forget to create the root layout, Next.js will automatically create this file when running the development server with `next dev`.
|
|
> - You can optionally use a [`src` folder](/docs/app/api-reference/file-conventions/src-folder) in the root of your project to separate your application's code from configuration files.
|
|
|
|
</AppOnly>
|
|
|
|
<PagesOnly>
|
|
|
|
### Create the `pages` directory
|
|
|
|
Next.js uses file-system routing, which means the routes in your application are determined by how you structure your files.
|
|
|
|
Create a `pages` directory at the root of your project. Then, add an `index.tsx` file inside your `pages` folder. This will be your home page (`/`):
|
|
|
|
```tsx filename="pages/index.tsx" switcher
|
|
export default function Page() {
|
|
return <h1>Hello, Next.js!</h1>
|
|
}
|
|
```
|
|
|
|
```jsx filename="pages/index.js" switcher
|
|
export default function Page() {
|
|
return <h1>Hello, Next.js!</h1>
|
|
}
|
|
```
|
|
|
|
Next, add an `_app.tsx` file inside `pages/` to define the global layout. Learn more about the [custom App file](/docs/pages/building-your-application/routing/custom-app).
|
|
|
|
```tsx filename="pages/_app.tsx" switcher
|
|
import type { AppProps } from 'next/app'
|
|
|
|
export default function App({ Component, pageProps }: AppProps) {
|
|
return <Component {...pageProps} />
|
|
}
|
|
```
|
|
|
|
```jsx filename="pages/_app.js" switcher
|
|
export default function App({ Component, pageProps }) {
|
|
return <Component {...pageProps} />
|
|
}
|
|
```
|
|
|
|
Finally, add a `_document.tsx` file inside `pages/` to control the initial response from the server. Learn more about the [custom Document file](/docs/pages/building-your-application/routing/custom-document).
|
|
|
|
```tsx filename="pages/_document.tsx" switcher
|
|
import { Html, Head, Main, NextScript } from 'next/document'
|
|
|
|
export default function Document() {
|
|
return (
|
|
<Html>
|
|
<Head />
|
|
<body>
|
|
<Main />
|
|
<NextScript />
|
|
</body>
|
|
</Html>
|
|
)
|
|
}
|
|
```
|
|
|
|
```jsx filename="pages/_document.js" switcher
|
|
import { Html, Head, Main, NextScript } from 'next/document'
|
|
|
|
export default function Document() {
|
|
return (
|
|
<Html>
|
|
<Head />
|
|
<body>
|
|
<Main />
|
|
<NextScript />
|
|
</body>
|
|
</Html>
|
|
)
|
|
}
|
|
```
|
|
|
|
</PagesOnly>
|
|
|
|
### Create the `public` folder (optional)
|
|
|
|
Create a [`public` folder](/docs/app/api-reference/file-conventions/public-folder) at the root of your project to store static assets such as images, fonts, etc. Files inside `public` can then be referenced by your code starting from the base URL (`/`).
|
|
|
|
You can then reference these assets using the root path (`/`). For example, `public/profile.png` can be referenced as `/profile.png`:
|
|
|
|
```tsx filename="app/page.tsx" highlight={4} switcher
|
|
import Image from 'next/image'
|
|
|
|
export default function Page() {
|
|
return <Image src="/profile.png" alt="Profile" width={100} height={100} />
|
|
}
|
|
```
|
|
|
|
```jsx filename="app/page.js" highlight={4} switcher
|
|
import Image from 'next/image'
|
|
|
|
export default function Page() {
|
|
return <Image src="/profile.png" alt="Profile" width={100} height={100} />
|
|
}
|
|
```
|
|
|
|
## Run the development server
|
|
|
|
1. Run `npm run dev` to start the development server.
|
|
2. Visit `http://localhost:3000` to view your application.
|
|
3. Edit the <AppOnly>`app/page.tsx`</AppOnly><PagesOnly>`pages/index.tsx`</PagesOnly> file and save it to see the updated result in your browser.
|
|
|
|
## Set up TypeScript
|
|
|
|
> Minimum TypeScript version: `v5.1.0`
|
|
|
|
Next.js comes with built-in TypeScript support. To add TypeScript to your project, rename a file to `.ts` / `.tsx` and run `next dev`. Next.js will automatically install the necessary dependencies and add a `tsconfig.json` file with the recommended config options.
|
|
|
|
<AppOnly>
|
|
|
|
### IDE Plugin
|
|
|
|
Next.js includes a custom TypeScript plugin and type checker, which VSCode and other code editors can use for advanced type-checking and auto-completion.
|
|
|
|
You can enable the plugin in VS Code by:
|
|
|
|
1. Opening the command palette (`Ctrl/⌘` + `Shift` + `P`)
|
|
2. Searching for "TypeScript: Select TypeScript Version"
|
|
3. Selecting "Use Workspace Version"
|
|
|
|
<Image
|
|
alt="TypeScript Command Palette"
|
|
srcLight="/docs/light/typescript-command-palette.png"
|
|
srcDark="/docs/dark/typescript-command-palette.png"
|
|
width="1600"
|
|
height="637"
|
|
/>
|
|
|
|
</AppOnly>
|
|
|
|
See the [TypeScript reference](/docs/app/api-reference/config/typescript) page for more information.
|
|
|
|
## Set up linting
|
|
|
|
Next.js supports linting with either ESLint or Biome. Choose a linter and run it directly via `package.json` scripts.
|
|
|
|
- Use **ESLint** (comprehensive rules):
|
|
|
|
```json filename="package.json"
|
|
{
|
|
"scripts": {
|
|
"lint": "eslint",
|
|
"lint:fix": "eslint --fix"
|
|
}
|
|
}
|
|
```
|
|
|
|
- Or use **Biome** (fast linter + formatter):
|
|
|
|
```json filename="package.json"
|
|
{
|
|
"scripts": {
|
|
"lint": "biome check",
|
|
"format": "biome format --write"
|
|
}
|
|
}
|
|
```
|
|
|
|
If your project previously used `next lint`, migrate your scripts to the ESLint CLI with the codemod:
|
|
|
|
```bash filename="Terminal"
|
|
npx @next/codemod@canary next-lint-to-eslint-cli .
|
|
```
|
|
|
|
If you use ESLint, create an explicit config (recommended `eslint.config.mjs`). ESLint supports both [the legacy `.eslintrc.*` and the newer `eslint.config.mjs` formats](https://eslint.org/docs/latest/use/configure/configuration-files#configuring-eslint). See the [ESLint API reference](/docs/app/api-reference/config/eslint#with-core-web-vitals) for a recommended setup.
|
|
|
|
> **Good to know**: Starting with Next.js 16, `next build` no longer runs the linter automatically. Instead, you can run your linter through NPM scripts.
|
|
|
|
See the [ESLint Plugin](/docs/app/api-reference/config/eslint) page for more information.
|
|
|
|
## Set up Absolute Imports and Module Path Aliases
|
|
|
|
Next.js has in-built support for the `"paths"` and `"baseUrl"` options of `tsconfig.json` and `jsconfig.json` files.
|
|
|
|
These options allow you to alias project directories to absolute paths, making it easier and cleaner to import modules. For example:
|
|
|
|
```jsx
|
|
// Before
|
|
import { Button } from '../../../components/button'
|
|
|
|
// After
|
|
import { Button } from '@/components/button'
|
|
```
|
|
|
|
To configure absolute imports, add the `baseUrl` configuration option to your `tsconfig.json` or `jsconfig.json` file. For example:
|
|
|
|
```json filename="tsconfig.json or jsconfig.json"
|
|
{
|
|
"compilerOptions": {
|
|
"baseUrl": "src/"
|
|
}
|
|
}
|
|
```
|
|
|
|
In addition to configuring the `baseUrl` path, you can use the `"paths"` option to `"alias"` module paths.
|
|
|
|
For example, the following configuration maps `@/components/*` to `components/*`:
|
|
|
|
```json filename="tsconfig.json or jsconfig.json"
|
|
{
|
|
"compilerOptions": {
|
|
"baseUrl": "src/",
|
|
"paths": {
|
|
"@/styles/*": ["styles/*"],
|
|
"@/components/*": ["components/*"]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
Each of the `"paths"` are relative to the `baseUrl` location.
|