Create-React-App (CRA)
React 官方旧式脚手架工具,由 Meta(Facebook)团队创建,曾一度是 React 生态的核心基础设施。
Create React App 是 Meta 推出的零配置 React 项目脚手架工具,封装了 Webpack 4、Babel、ESLint 等工具链。2025 年 2 月已正式废弃,官方推荐迁移到 Vite、Next.js 等现代方案。
Create-React-App (CRA)
React 官方旧式脚手架工具,由 Meta(Facebook)团队创建,曾一度是 React 生态的核心基础设施。2025 年 2 月,React 团队正式发布「Sunsetting Create React App」公告,宣告 CRA 进入废弃(Deprecated)状态,进入维护模式,不再接受新功能。官方明确推荐使用 Vite、Next.js、React Router、Rsbuild 等现代替代方案。
技术简介说明
Create React App 是 Facebook(现 Meta)团队于 2016 年推出的官方 React 项目脚手架工具,旨在解决早期 React 开发者在搭建项目时面临的 Webpack、Babel、ESLint 等复杂工程化配置难题。通过一行命令 npx create-react-app my-app,开发者即可获得一个开箱即用的 React 项目,内建开发服务器、热更新(Hot Reload)、自动化构建、代码分割、ES6+ 转译、JSX 支持等现代前端能力,让开发者能够专注于业务代码本身,而非工具链配置。
在其鼎盛时期(2017–2022 年),CRA 是 React 生态中使用最广泛的项目初始化工具,几乎成为 React 入门教程、官方文档和技术书籍的默认起点。它的"零配置"理念深刻影响了前端脚手架的设计范式,被广泛模仿和借鉴。CRA 封装了 Webpack 4、Babel 7、ESLint、PostCSS、Jest 等工具,通过 react-scripts 包统一管理,避免了版本碎片化问题,让数百万 React 项目得以快速启动。
然而,随着前端工程化技术快速演进,CRA 的局限性日益凸显:底层 Webpack 构建速度缓慢、无法灵活自定义配置(除非 eject)、不支持现代 HMR 方案(如 ESM-based HMR)、对 TypeScript 支持不够完善、开发体验落后于 Vite 等新一代工具。2023 年起,CRA 的实际维护已基本停滞;2025 年 2 月 14 日,React 团队在 react.dev 官方博客正式发布公告,宣布 CRA 废弃,并发布了对 React 19 兼容的最后一次维护版本。存量项目仍然可以运行,但新项目应全面转向 Vite、Next.js 或 Rsbuild 等现代方案。
基本信息
- 官网:https://create-react-app.dev
- GitHub:https://github.com/facebook/create-react-app
- License:MIT
- 最新版本:5.0.1(2022 年发布,最后一个稳定版本;后续仅发布 React 19 兼容性维护补丁)
- 主要维护者/公司:Meta(Facebook)及社区贡献者
- 维护状态:已废弃(Deprecated)/ 维护模式(Maintenance Mode),2025 年 2 月正式公告,不再开发新功能,仅接受关键安全修复
- 创建时间:2016 年
- 废弃公告:Sunsetting Create React App(2025-02-14)
快速上手
安装
# 使用 npx 创建项目(推荐方式,无需全局安装)
npx create-react-app my-app
# 使用 yarn
yarn create react-app my-app
# 使用 pnpm
pnpm create react-app my-app
# 进入项目目录
cd my-app
# 启动开发服务器
npm start
# 构建生产版本
npm run build
# 运行测试
npm test
# eject(不可逆操作)
npm run eject⚠️ 警告:由于 CRA 已废弃,新建项目执行
npx create-react-app时会触发废弃警告提示。官方强烈建议新项目使用create-vite、Next.js 或其他现代方案。
基础配置
CRA 遵循「零配置」原则,所有工具链配置封装在 react-scripts 包内部,开发者无需手动管理 Webpack、Babel 等配置文件。项目创建后,package.json 中包含以下核心脚本:
{
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"browserslist": {
"production": [">0.2%", "not dead", "not op_mini all"],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
}若需自定义配置而不使用 eject,可通过在根目录创建以下文件进行有限覆盖:
.env/.env.local/.env.production— 环境变量jsconfig.json— JavaScript/路径别名配置setupTests.js— 测试初始化配置src/setupProxy.js— 开发代理配置(需安装http-proxy-middleware)
最小示例
// src/App.js
import React from 'react';
function App() {
return (
<div className="App">
<h1>Hello, Create React App!</h1>
<p>这是一个最小的 React 应用示例。</p>
</div>
);
}
export default App;// src/index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);核心概念与架构
Webpack 封装
CRA 的核心架构基于 Webpack 4 的深度封装。react-scripts 包内嵌了完整的 Webpack 配置,包括开发模式下的 webpackDevServer 和生产模式下的生产构建流程。开发者不直接接触 Webpack 配置文件,所有打包、代码分割、Tree Shaking、CSS 处理、资源加载等逻辑均由 react-scripts 内部维护。这种设计的优势是降低了入门门槛,劣势是当需要自定义时,灵活性严重不足。
react-scripts
react-scripts 是 CRA 的核心运行时包,封装了以下职责:
- Webpack 开发服务器配置(devServer、热更新、代理)
- 生产构建流程(代码分割、资源哈希、CSS 提取)
- Babel 预设配置(
babel-preset-react-app) - ESLint 配置(
eslint-config-react-app) - Jest 测试运行器封装
- TypeScript 支持(通过
typescript包自动检测)
所有版本升级通过 npm install react-scripts@latest 统一管理,避免了各项目之间工具链版本碎片化的问题。
eject 机制
npm run eject 是 CRA 提供的"逃生出口"——执行后将 react-scripts 内所有封装的 Webpack 配置、Babel 配置、ESLint 配置、脚本文件全量展开到项目根目录,开发者可完全自定义。但 eject 是一个不可逆操作:一旦执行,无法回退到 react-scripts 管理模式,后续版本升级也无法自动进行。这一机制虽然满足了高级自定义需求,但也导致了大量项目陷入"配置债务",是 CRA 架构设计中最受争议的部分。
Babel 转译
CRA 使用 babel-preset-react-app 预设,集成了 @babel/preset-env、@babel/preset-react、@babel/preset-typescript 以及多个插件(如 @babel/plugin-transform-runtime、babel-plugin-macros 等)。开发者可通过 .babelrc 或 babel.config.js 配合 babel-plugin-macros 实现有限的 Babel 扩展,但完整的 Babel 配置自定义只能通过 eject 实现。
环境变量管理
CRA 使用 dotenv(.env 文件)管理环境变量,仅暴露以 REACT_APP_ 为前缀的变量给前端代码,防止服务器端敏感信息泄露。在构建时,环境变量通过 Webpack 的 DefinePlugin 静态替换到代码中。这种方式简单直接,但无法实现运行时动态环境变量,也不支持按环境精细分层管理。
核心特性
-
零配置启动:一行命令创建项目,无需手动编写 Webpack、Babel、ESLint 配置,开箱即用的开发服务器和生产构建流程,极大降低了 React 入门门槛。
-
内建开发服务器:基于 Webpack Dev Server,支持自动编译、浏览器热更新(Fast Refresh)、代理配置(
setupProxy.js)等功能,提供流畅的开发体验。 -
自动化生产构建:执行
npm run build后,自动完成代码分割、Tree Shaking、资源哈希命名、CSS 提取、JS 压缩、HTML 注入等优化,生成可直接部署的静态文件。 -
内建 Jest 测试集成:
react-scripts test封装了 Jest 测试运行器,支持--watch模式、覆盖率收集、ES6+ 语法转译,零配置即可运行单元测试和集成测试。 -
TypeScript 自动支持:创建项目时使用
.tsx/.ts文件,或在项目中安装typescript包后,CRA 自动检测并启用 TypeScript 编译支持,无需手动配置tsconfig.json(但可自定义)。 -
CSS 模块化与预处理器支持:支持 CSS Modules(
*.module.css)、Sass/SCSS(需安装sass包)、Less(需安装less包,社区支持)等,CSS 处理逻辑内置于 Webpack 配置中。 -
ESLint 静态检查:内置
eslint-config-react-app,基于eslint-plugin-react、eslint-plugin-react-hooks等规则,提供 React 最佳实践的代码检查,开发时实时报错提示。 -
Service Worker 与 PWA 支持:通过
workbox-webpack-plugin预置了 Service Worker 生成能力,配合src/serviceWorker.js可快速将应用改造为 PWA(渐进式 Web 应用),支持离线访问。 -
路径别名与绝对导入:通过
jsconfig.json或tsconfig.json配置baseUrl,支持以src/为基准的绝对导入,避免深层相对路径(../../../)。 -
Browserslist 集成:通过
package.json中的browserslist字段控制目标浏览器范围,影响 Babel 转译策略、Autoprefixer 前缀生成和构建产物的兼容性。
生态图
create-react-app(CLI 入口)
├── react-scripts(核心脚本包,封装 Webpack/Babel/Jest 配置)
│ ├── babel-preset-react-app(Babel 预设)
│ ├── eslint-config-react-app(ESLint 配置预设)
│ ├── react-dev-utils(开发工具:错误覆盖、文件监听、浏览器启动)
│ ├── webpack(内嵌 Webpack 4)
│ ├── babel-loader
│ ├── css-loader / style-loader / postcss-loader
│ ├── jest / jest-environment-jsdom
│ └── workbox-webpack-plugin(PWA 支持)
├── create-react-app(脚手架创建命令)
├── eslint-config-react-app(独立发布,可单独使用)
├── react-error-overlay(开发时浏览器内错误覆盖层)
└── confusable-homoglyphs(依赖工具)
与 React 生态其他工具的关联:
- React Router:CRA 不内置路由,需手动安装
react-router-dom - Redux Toolkit:官方推荐状态管理方案,需额外安装
- Testing Library:CRA 默认使用
@testing-library/react作为测试工具 - Next.js / Remix:CRA 的"替代品",提供框架级解决方案
适用场景
仍然适用的场景
- 遗留项目维护:大量 2017–2023 年创建的 React 项目仍运行在 CRA 上,维护这些项目需要理解其架构和配置方式。
- 快速原型验证:对构建性能无要求的简单原型、demo 或内部工具,CRA 的零配置仍有快速启动优势。
- 学习 React 基础:部分入门教程仍使用 CRA,理解 CRA 有助于跟进这些学习资源。
- 已 eject 的稳定项目:已执行 eject 并深度自定义配置的项目,短期内迁移成本高,可继续维护。
不推荐使用的场景
- 任何新项目:官方已明确废弃,不应在新项目中使用。
- 需要 SSR/SSG 的项目:CRA 仅支持客户端渲染(CSR),无法实现服务端渲染或静态生成。
- 大型生产应用:Webpack 4 构建速度慢,缺乏现代代码分割和路由集成方案。
- 需要 TypeScript 深度集成的项目:CRA 对 TypeScript 的支持相对基础,无法自定义
tsconfig.json的编译选项(除非 eject)。 - 追求极致开发体验的项目:Vite 的 ESM 原生 HMR 速度远超 CRA 的 Webpack HMR。
开发与工程化
开发流程
# 1. 启动开发服务器(默认 http://localhost:3000)
npm start
# 2. 代码编辑,自动热更新(Fast Refresh)
# 3. 运行测试
npm test # 交互模式
npm test -- --coverage # 覆盖率报告
npm test -- --watchAll # 监听所有文件
# 4. 代码检查(CRA 内建 ESLint)
# 开发时浏览器控制台实时显示 lint 错误
# 5. 配置代理(开发环境 API 转发)
# 安装 http-proxy-middleware
npm install http-proxy-middleware --save-dev
# 创建 src/setupProxy.js
# const { createProxyMiddleware } = require('http-proxy-middleware');
# module.exports = function(app) {
# app.use('/api', createProxyMiddleware({ target: 'http://localhost:8080' }));
# };构建与部署
# 构建生产版本
npm run build
# 构建产物输出到 build/ 目录
# 包含:
# - 静态资源(JS/CSS/图片)带内容哈希文件名
# - index.html 自动注入资源引用
# - asset-manifest.json 资源清单
# 部署到静态托管服务
# 方式1:部署到 Vercel / Netlify / Cloudflare Pages(直接连接 Git 仓库)
# 方式2:部署到 Nginx / Apache(需配置 SPA fallback)
# 方式3:部署到 GitHub Pages
# 安装 gh-pages:npm install gh-pages --save-dev
# package.json 添加:
# "homepage": "https://username.github.io/repo-name",
# "predeploy": "npm run build",
# "deploy": "gh-pages -d build"
# 部署到 Vercel(推荐)
npx vercel环境变量管理
# .env(所有环境)
REACT_APP_API_URL=https://api.example.com
# .env.development(开发环境)
REACT_APP_DEBUG=true
# .env.production(生产环境)
REACT_APP_API_URL=https://api.production.com
# 在代码中使用
const apiUrl = process.env.REACT_APP_API_URL;性能与安全
性能特点
- 开发服务器启动速度:基于 Webpack 4,首次编译速度较慢(大型项目通常 30 秒以上),显著落后于 Vite(通常 1–3 秒)。
- 热更新速度:使用 Webpack HMR,更新速度与项目规模正相关,大型项目中热更新可能需要 2–10 秒,Vite 的 ESM 原生 HMR 通常在 100 毫秒内完成。
- 生产构建速度:Webpack 4 的生产构建通常需要 30–120 秒,Vite(Rollup)通常 10–30 秒。
- 产物体积:默认配置下构建产物体积合理,但无法像现代工具那样精细控制代码分割粒度。
- 运行时性能:与构建工具无关,取决于 React 代码本身。
已知安全问题
- 依赖版本过时:
[email protected]内嵌 Webpack 4,而 Webpack 5 已于 2020 年发布;部分内嵌依赖(如postcss、css-loader等)版本滞后,可能存在已知漏洞。 immer历史漏洞:CRA 曾依赖的immer版本存在原型污染漏洞(CVE),后续版本已修复,但部分旧项目仍受影响。node-forge/nth-check/ansi-html漏洞:react-scripts传递依赖中存在多个历史 CVE 记录,需定期执行npm audit检查。REACT_APP_前缀泄露风险:所有REACT_APP_前缀变量会静态替换到前端代码中,若误将服务器端敏感信息以该前缀定义,会直接暴露在浏览器端。- Content Security Policy(CSP)问题:CRA 默认生成的
index.html使用内联<script>标签注入运行时配置,与严格的 CSP 策略存在冲突,需手动调整或使用INLINE_RUNTIME_CHUNK=false环境变量规避。
技术对比
| 特性 | Create React App | Vite(create-vite) | Next.js | Rsbuild |
|---|---|---|---|---|
| 底层构建工具 | Webpack 4 | Vite(Rollup + esbuild) | Webpack 5 / Turbopack | Rspack |
| 维护状态 | 已废弃(2025 年) | 活跃开发 | 活跃开发 | 活跃开发 |
| 开发服务器启动速度 | 30–60 秒(慢) | 1–3 秒(极快) | 中等 | 1–3 秒(极快) |
| 热更新速度 | 2–10 秒(慢) | < 200ms(极快) | 中等(Turbopack 更快) | < 200ms(极快) |
| 生产构建速度 | 30–120 秒 | 10–30 秒 | 中等 | 10–30 秒 |
| 零配置 | ✅ 是 | ✅ 是 | ✅ 是 | ✅ 是 |
| 自定义配置能力 | 有限(需 eject) | 强(vite.config.ts) | 强(next.config.js) | 强(rsbuild.config.ts) |
| SSR/SSG 支持 | ❌ 不支持 | ⚠️ 需插件 | ✅ 内建 | ⚠️ 需配合框架 |
| TypeScript 支持 | 基础(自动检测) | 完善 | 完善 | 完善 |
| React 19 支持 | ✅(最后维护版本) | ✅ 完整支持 | ✅ 完整支持 | ✅ 完整支持 |
| 路由方案 | 需手动安装 | 需手动安装 | ✅ 内建文件系统路由 | 需手动安装 |
| PWA 支持 | ✅ 内建 | ⚠️ 需插件 | ⚠️ 需配置 | ⚠️ 需插件 |
| React Server Components | ❌ 不支持 | ❌ 不支持 | ✅ 完整支持 | ❌ 不支持 |
| 官方推荐度 | ❌ 已废弃 | ✅ 官方推荐 | ✅ 官方推荐 | ✅ 官方推荐 |
最佳实践
新项目建议
对于任何新项目,应直接使用现代替代方案:
# 方案1:使用 Vite(最轻量、最推荐)
npm create vite@latest my-app -- --template react-ts
# 方案2:使用 Next.js(需要 SSR/SSG/RSC)
npx create-next-app@latest my-app
# 方案3:使用 Rsbuild(Rspack 生态,极速构建)
npm create rsbuild@latest my-app
# 方案4:使用 React Router(纯 CSR + 路由框架)
# 参考 https://reactrouter.com/upgrading/component-routes存量 CRA 项目迁移建议
迁移到 Vite(推荐,最简单)
# 1. 安装 Vite 及相关插件
npm install -D vite @vitejs/plugin-react
# 2. 创建 vite.config.ts
# import { defineConfig } from 'vite'
# import react from '@vitejs/plugin-react'
# export default defineConfig({
# plugins: [react()],
# })
# 3. 修改 package.json scripts
# "dev": "vite",
# "build": "vite build",
# "preview": "vite preview"
# 4. 将 public/index.html 移到根目录 index.html
# 将 <script src="/src/index.js"> 改为 <script type="module" src="/src/index.jsx">
# 5. 移除 react-scripts
npm uninstall react-scripts
# 6. 处理环境变量:将 REACT_APP_ 前缀改为 VITE_
# 代码中 process.env.REACT_APP_XXX 改为 import.meta.env.VITE_XXX
# 7. 运行测试,修复问题迁移到 Next.js(适合需要 SSR/RSC 的项目)
- 参考 Next.js 官方迁移指南:From Create React App
- 主要变化:文件系统路由替代 React Router、
pages/或app/目录结构、数据获取模式(Server Components / Route Handlers)
迁移前的评估清单
- 是否执行过
eject?已 eject 的项目需先梳理自定义配置再迁移。 - 是否依赖 CRA 特有的环境变量前缀(
REACT_APP_)?需批量替换。 - 是否使用了
setupProxy.js?需在 Vite 中使用server.proxy配置替代。 - 是否依赖 PWA 功能?需使用
vite-plugin-pwa替代。 - 是否有
src/serviceWorker.js?需评估是否继续保留 PWA 能力。
代码迁移通用步骤
- 移除
react-scripts依赖,安装新构建工具 - 处理环境变量前缀变更(
REACT_APP_→VITE_/ Next.jsNEXT_PUBLIC_) - 调整
index.html入口文件位置 - 迁移自定义 Webpack 配置(如有)到新工具配置格式
- 更新 CI/CD 构建脚本
- 执行完整测试套件,修复不兼容问题
- 验证生产构建产物和部署流程
技术局限与边界
Webpack 4 过时
CRA 内嵌 Webpack 4,而 Webpack 5 已于 2020 年发布,带来持久缓存、模块联邦、更好的 Tree Shaking、原生 Web Workers 支持等重要特性。CRA 无法升级到 Webpack 5,因为 react-scripts 的封装层不允许此类重大变更。
无法灵活自定义配置
CRA 的零配置设计理念在简单项目中是优势,在复杂项目中是限制。任何超出预设范围的配置需求(如自定义 Loader、修改代码分割策略、配置 Module Federation、集成特殊资源处理)都必须执行 eject,或借助 craco、react-app-rewired 等第三方补丁工具,这些工具本身维护状况不佳,可能引入新的兼容性问题。
构建速度慢
Webpack 4 的整体架构决定了 CRA 在开发服务器启动、热更新、生产构建等环节的性能天花板。在大型项目(数千组件、数十万行代码)中,CRA 的开发体验显著落后于 Vite、Rsbuild 等基于 ESM 或 Rust 的新工具。
Content Security Policy(CSP)问题
CRA 默认在 index.html 中注入内联 <script> 标签用于运行时配置,与严格的 CSP 策略不兼容。虽然有 INLINE_RUNTIME_CHUNK=false 等环境变量可以规避,但这些 workaround 并非官方文档化方案,容易在版本升级中失效。
无 SSR/SSG/RSC 支持
CRA 仅支持客户端渲染(CSR),无法实现服务端渲染(SSR)、静态站点生成(SSG)或 React Server Components(RSC)。这些能力在现代 React 应用中日益重要,是选择 Next.js 等框架的核心原因。
依赖安全风险
react-scripts 封装了大量传递依赖,这些依赖的版本由 react-scripts 统一管理,开发者无法单独升级某个存在漏洞的传递依赖,只能等待 react-scripts 发布新版本(该版本已不太可能到来)。
学习资源
官方资源
- Create React App 官网 — 官方文档(已标注废弃)
- Sunsetting Create React App(2025-02-14) — React 团队官方废弃公告
- GitHub 仓库 — 源码与 Issue 追踪
迁移指南
- Next.js 官方 CRA 迁移指南
- Vite CRA 迁移指南(Robin Wieruch)
- Rsbuild CRA 迁移指南
- Parcel CRA 迁移指南
- React Router 框架采用指南
社区讨论与分析
- Create React App is Dead. What does it mean for you?
- Create React App Officially Deprecated(Socket.dev 分析)
- React team formally deprecates CRA(DevClass 报道)
相关书籍与教程
- 《React 开发实战》(基于 CRA 的入门教程,注意版本)
- React 官方文档(react.dev) — 已不再使用 CRA 作为示例工具
- Vite 官方文档 — 现代构建工具入门
2026 年现状
废弃状态确认
截至 2026 年 7 月,Create React App 已正式废弃超过 16 个月。React 团队在 2025 年 2 月 14 日的公告中明确表示:
"Create React App is deprecated." "CRA currently has no active maintainers." "We are publishing a new version to ensure compatibility with React 19, but we recommend moving to a framework."
官网 create-react-app.dev 首页已显示废弃横幅,GitHub 仓库 README.md 已更新废弃说明,npx create-react-app 命令执行时会输出废弃警告。
官方推荐替代方案
React 团队在废弃公告中明确推荐了以下替代方案:
框架(推荐大多数应用使用)
- Next.js:最成熟的 React 全栈框架,支持 SSR/SSG/RSC/App Router,适合生产级应用
- React Router:从路由库升级为完整框架,支持 CSR/SSR,最接近 CRA 的纯客户端渲染模式
- Expo:React Native 应用的官方推荐框架
构建工具(适合自定义架构或学习用途)
- Vite:最轻量、最快的前端构建工具,社区采用率最高,CRA 最直接的替代方案
- Rsbuild:基于 Rspack(Rust)的极速构建工具,兼容 Webpack 生态
- Parcel:零配置构建工具,自动检测项目类型
社区采用趋势
2026 年,新项目中使用 CRA 的比例已极低。根据多个前端开发者调查和技术趋势报告:
- Vite 已成为 React 项目默认构建工具的首选,采用率超过 70%(新项目)
- Next.js 在生产级 React 应用中占据主导地位,尤其是有 SEO 需求的项目
- Rsbuild 作为新兴工具,在性能敏感型项目中快速增长
- CRA 主要存在于 2023 年之前创建的存量项目中,其维护者面临逐步迁移的压力
存量项目维护建议
对于仍在使用 CRA 的项目:
- 无需立即迁移:CRA 在维护模式下仍然可用,已发布 React 19 兼容版本,短期内不会完全停止工作
- 定期运行
npm audit:检查传递依赖中的安全漏洞 - 制定迁移计划:在新功能开发放缓时,逐步迁移到 Vite 或 Next.js
- 避免新增 eject:已 eject 的项目迁移成本更高,应优先规划迁移路径
- 关注社区迁移工具:多个自动化迁移工具正在开发中,可降低迁移工作量
文档状态:本文档基于 2025 年 2 月 React 团队官方公告及 2026 年 7 月现状整理。Create React App 已正式废弃,新项目请勿使用。如需了解现代替代方案,请参阅 Vite 文档 或 Turbopack 文档。