# Introduction to create-react-app

> Learn why Create React App was deprecated, what its scripts still do in existing projects, and how to start a new React app with current tools.

Author: [Flavio Copes](https://flaviocopes.com/about/) | Published: 2018-12-19 | Updated: 2026-07-18 | Topics: [React](https://flaviocopes.com/tags/react/) | Canonical: https://flaviocopes.com/react-create-react-app/

`create-react-app`, usually called Create React App or CRA, was the standard way to start a [React](https://flaviocopes.com/react/) project without configuring Babel and Webpack yourself.

It is now deprecated for new applications.

The React team [deprecated Create React App in February 2025](https://react.dev/blog/2025/02/14/sunsetting-create-react-app). It remains in maintenance mode so existing projects can keep working, but it has no active maintainers and is not the recommended foundation for a new production app.

This tutorial explains what CRA did, how to recognize an existing CRA project, and what to use now.

## What Create React App provided

CRA created a client-side React application with:

- a development server
- Fast Refresh during development
- JSX and modern JavaScript compilation
- CSS and asset handling
- a Jest test setup
- an optimized production build
- hidden Babel and Webpack configuration

Its main benefit was a single shared configuration that could be upgraded through the `react-scripts` package.

Its main limitation was that it only created a client-side application. Routing, data loading, code splitting strategy, server rendering, and static generation were left to you.

## What should you use for a new React app?

React now recommends starting with a framework for applications that need routing and production features.

If a framework is not a good fit, the official guide lists build tools such as Vite, Parcel, and Rsbuild. See [Build a React app from Scratch](https://react.dev/learn/build-a-react-app-from-scratch).

For a small client-side JavaScript app, you can start with Vite:

```sh
npm create vite@latest todolist -- --template react
cd todolist
npm install
npm run dev
```

Vite prints the local development URL in the terminal.

This creates a client-side single-page app, not a complete application framework. As the app grows, you still need to make decisions about routing, data fetching, caching, testing, and deployment.

## Can you still run Create React App?

Yes, but the command displays a deprecation warning:

```sh
npx create-react-app todolist
```

This can still be useful when following an older course or reproducing an existing project's setup. Do not choose it for a new production project.

Inside an existing CRA project, the important dependency is normally `react-scripts`, and `package.json` contains these scripts:

- `npm start` starts the development server
- `npm test` starts the Jest test watcher
- `npm run build` creates a production build in the `build` folder
- `npm run eject` copies the hidden configuration into the project

## What does ejecting do?

Ejecting exposes the Babel, Webpack, and related configuration managed by `react-scripts`.

It is irreversible. After ejecting, the application owns those configuration files and dependencies directly. You lose the simple `react-scripts` upgrade path and become responsible for maintaining the toolchain.

If an existing CRA project needs a major tooling change, migrating it to a maintained framework or build tool is usually a better long-term option than ejecting.

The official deprecation announcement links migration guides for Vite, Parcel, and Rsbuild.
