Create a new Next.js application
System requirements
Before you begin, make sure your system meets the following requirements:
- Node.js 18.18 or later.
- macOS, Windows (including WSL), or Linux.
Create with the CLI
The quickest way to create a new Next.js app is using create-next-app
, which sets up everything automatically for you. To create a project, run:
npx create-next-app@latest
On installation, you'll see the following prompts:
What is your project named? my-app
Would you like to use TypeScript? No / Yes
Which linter would you like to use? ESLint / Biome / None
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 use Turbopack? (recommended) No / Yes
Would you like to customize the import alias (`@/*` by default)? No / Yes
What import alias would you like configured? @/*
After the prompts, 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:
pnpm i next@latest react@latest react-dom@latest
Good to know: The App Router uses React canary releases built-in, which include all the stable React 19 changes, as well as newer features being validated in frameworks. The Pages Router uses the React version you install in
package.json
.
Then, add the following scripts to your package.json
file:
{
"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.next build
: Builds the application for production.next start
: Starts the production server.eslint
: Runs ESLint.
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 (/
):
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.
import type { AppProps } from 'next/app'
export default function App({ Component, pageProps }: AppProps) {
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.
import { Html, Head, Main, NextScript } from 'next/document'
export default function Document() {
return (
<Html>
<Head />
<body>
<Main />
<NextScript />
</body>
</Html>
)
}
Create the public
folder (optional)
Create a 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
:
import Image from 'next/image'
export default function Page() {
return <Image src="/profile.png" alt="Profile" width={100} height={100} />
}
Run the development server
- Run
npm run dev
to start the development server. - Visit
http://localhost:3000
to view your application. - Edit the
pages/index.tsx
file and save it to see the updated result in your browser.
Set up TypeScript
Minimum TypeScript version:
v4.5.2
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.
See the TypeScript reference 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):
{
"scripts": {
"lint": "eslint",
"lint:fix": "eslint --fix"
}
}
- Or use Biome (fast linter + formatter):
{
"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:
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. See the ESLint API reference for a recommended setup.
Good to know: If an ESLint config is present,
next build
will still run linting in Next.js 15, but this automatic build-time linting will be removed in Next.js 16. Control when linting runs by invoking your linter via npm scripts.
See the ESLint Plugin 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:
// 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:
{
"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/*
:
{
"compilerOptions": {
"baseUrl": "src/",
"paths": {
"@/styles/*": ["styles/*"],
"@/components/*": ["components/*"]
}
}
}
Each of the "paths"
are relative to the baseUrl
location.
Was this helpful?