Create React App (CRA) 使用指南:配置、优化与部署

Create React App (CRA) 深度指南:配置、优化与部署

Create React App (CRA) 是由 Facebook 官方推出的脚手架工具,旨在帮助开发者快速搭建 React 应用开发环境,无需手动配置 Webpack、Babel 等繁琐工具。CRA 屏蔽了底层构建细节,让开发者可以专注于业务逻辑的实现。本文将深入探讨 CRA 的使用方法,包括项目配置、性能优化技巧以及部署方案,助您构建高性能、可维护的 React 应用。

一、CRA 入门:快速启动您的 React 项目

1.1 安装与初始化

在开始之前,请确保您的 Node.js 版本 >= 14.0.0 且 npm 版本 >= 5.6。

使用以下命令全局安装 CRA:

bash
npm install -g create-react-app

安装完成后,您可以通过以下命令创建一个新的 React 项目(将 my-app 替换为您想要的项目名称):

bash
npx create-react-app my-app

或者
bash
yarn create my-app

CRA 会自动创建一个名为 my-app 的目录,并在其中初始化项目结构、安装依赖。

1.2 项目目录结构

创建好的项目具有以下标准目录结构:

my-app/
├── README.md
├── node_modules/
├── package.json
├── .gitignore
├── public/
│ ├── favicon.ico
│ ├── index.html
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── robots.txt
└── src/
├── App.css
├── App.js
├── App.test.js
├── index.css
├── index.js
├── logo.svg
├── serviceWorker.js
└── setupTests.js

  • public/: 存放静态资源,如 HTML 模板 (index.html)、图标、manifest 文件等。这些文件不会被 Webpack 处理,会直接复制到构建输出目录。
  • src/: 存放应用源代码,包括 JavaScript 文件、CSS 文件、组件、测试文件等。这是您主要的工作目录。
  • package.json: 项目配置文件,记录项目依赖、脚本命令等。
  • node_modules/: 存放项目依赖的第三方库。
  • .gitignore: 指定 Git 忽略的文件和目录。
  • README.md: 项目说明文档。

1.3 运行与构建

CRA 内置了开发服务器,方便您在开发过程中实时预览应用。

  • 启动开发服务器:

    bash
    npm start # 或 yarn start

    这将在本地启动一个开发服务器,默认端口为 3000。您可以在浏览器中访问 http://localhost:3000 查看应用。开发服务器支持热重载,当您修改代码并保存后,浏览器会自动刷新,无需手动刷新。

  • 构建生产版本:

    bash
    npm run build # 或 yarn build

    这将在项目根目录下创建一个 build 目录,其中包含经过优化和压缩的静态资源,可用于部署到生产环境。

二、CRA 进阶配置:定制您的开发环境

虽然 CRA 提供了开箱即用的配置,但在实际开发中,您可能需要根据项目需求进行一些定制。

2.1 环境变量

CRA 支持使用环境变量来配置不同环境下的应用行为。您可以在项目根目录下创建 .env 文件,并在其中定义环境变量。

例如,创建一个 .env.development 文件,用于配置开发环境下的变量:

REACT_APP_API_URL=http://localhost:5000/api

然后在您的代码中,可以通过 process.env.REACT_APP_API_URL 访问该变量。

CRA 支持以下几种 .env 文件:

  • .env: 默认环境变量,优先级最低。
  • .env.local: 本地环境变量,会覆盖 .env 中的同名变量,但不会被提交到 Git 仓库。
  • .env.development, .env.test, .env.production: 分别对应开发、测试和生产环境的环境变量。
  • .env.development.local, .env.test.local, .env.production.local: 本地环境特定变量,优先级最高。

注意:环境变量的命名必须以 REACT_APP_ 开头,否则 CRA 不会加载。

2.2 自定义端口

默认情况下,CRA 开发服务器运行在 3000 端口。您可以通过设置 PORT 环境变量来更改端口:

bash
PORT=4000 npm start # 或 yarn start

或者在 .env 文件中设置:

PORT=4000

2.3 代理请求

在开发过程中,您可能需要将前端请求代理到后端服务器。CRA 支持通过配置 package.json 中的 proxy 字段来实现简单的代理:

json
{
"proxy": "http://localhost:5000"
}

这样,当您在前端代码中发起请求时,例如 fetch('/api/data'),CRA 会自动将请求转发到 http://localhost:5000/api/data

对于更复杂的代理需求,您可以使用 http-proxy-middleware 库。首先安装该库:

bash
npm install http-proxy-middleware --save # 或 yarn add http-proxy-middleware

然后在 src/ 目录下创建 setupProxy.js 文件:

```javascript
const { createProxyMiddleware } = require('http-proxy-middleware');

module.exports = function(app) {
app.use(
'/api',
createProxyMiddleware({
target: 'http://localhost:5000',
changeOrigin: true,
pathRewrite: {
'^/api': '', // 可选:重写路径
},
})
);
};
```
这种方法更为灵活,可以对不同的请求进行不同配置。

2.4 添加 CSS 预处理器 (Sass, Less)

CRA 默认支持 CSS Modules 和 PostCSS。如果您想使用 Sass 或 Less 等 CSS 预处理器,需要安装相应的 loader:

  • Sass:

    bash
    npm install sass # 或 yarn add sass

    然后,您可以将 .css 文件重命名为 .scss.sass,并在其中使用 Sass 语法。

  • Less:

    bash
    npm install less less-loader --save-dev # 或 yarn add less less-loader -D

    然后你需要手动修改webpack配置(需要eject或者使用craco等库),CRA 官方不直接支持 Less。因为需要修改webpack配置。

2.5 Ejecting(慎用)

CRA 的设计理念是尽可能屏蔽底层配置,让开发者专注于业务逻辑。但是,如果您需要完全掌控 Webpack、Babel 等工具的配置,可以执行 eject 命令:

bash
npm run eject # 或 yarn eject

警告: eject 是一个单向操作,一旦执行,就无法撤销。执行 eject 后,CRA 会将所有配置文件和依赖项复制到您的项目中,您将完全接管项目的构建过程。

通常情况下,不建议执行 eject 操作,除非您对 Webpack 等工具有深入了解,并且确实需要进行非常复杂的定制。

2.6 使用Craco (推荐)

Craco (Create React App Configuration Override)是一个对create-react-app进行自定义配置的社区解决方案。它允许你修改webpack配置,而不需要eject。

  1. 安装Craco
    bash
    npm install @craco/craco --save
  2. 修改package.json中的scripts
    ```json
    / package.json /

"scripts": {
- "start": "react-scripts start",
- "build": "react-scripts build",
- "test": "react-scripts test",
+ "start": "craco start",
+ "build": "craco build",
+ "test": "craco test",
"eject": "react-scripts eject"
}
```

  1. 在项目根目录创建一个 craco.config.js 文件
    js
    // craco.config.js
    module.exports = {
    style: {
    postcss: {
    plugins: [
    require('tailwindcss'),
    require('autoprefixer'),
    ],
    },
    },
    webpack: {
    // webpack配置
    }
    }

通过Craco, 你可以方便安全地进行webpack配置,而不用担心eject带来的不可逆问题。

三、CRA 性能优化:打造极致用户体验

为了提高 React 应用的性能,您可以采取以下优化措施:

3.1 代码分割 (Code Splitting)

默认情况下,CRA 会将所有代码打包到一个 JavaScript 文件中。当应用规模增大时,这会导致初始加载时间过长。代码分割可以将代码拆分成多个较小的 chunk,按需加载,从而减少初始加载时间。

CRA 支持使用动态 import() 语法来实现代码分割:

```javascript
import React, { Suspense, lazy } from 'react';

const OtherComponent = lazy(() => import('./OtherComponent'));

function MyComponent() {
return (

Loading...\

}>

);
}
```

lazy() 函数用于延迟加载组件,Suspense 组件用于在组件加载过程中显示 fallback 内容。

3.2 生产环境构建优化

CRA 的 npm run build 命令会自动进行以下优化:

  • 代码压缩: 使用 Terser 压缩 JavaScript 代码,减小文件体积。
  • 文件哈希: 为文件名添加哈希值,用于实现浏览器缓存。
  • 提取 CSS: 将 CSS 代码提取到单独的文件中,避免阻塞 JavaScript 加载。
  • 移除 Source Maps: 默认情况下,生产环境构建不会生成 Source Maps,以减小文件体积。如果您需要 Source Maps 进行调试,可以设置 GENERATE_SOURCEMAP=true 环境变量。

3.3 使用生产版本的 React

确保在生产环境中使用生产版本的 React。生产版本的 React 经过了优化,体积更小,性能更好。CRA 的 build 命令会自动使用生产版本的 React。

3.4 图片优化

  • 使用 WebP 格式: WebP 是一种现代图像格式,具有更好的压缩率和质量。您可以使用工具将图片转换为 WebP 格式。
  • 压缩图片: 使用工具(如 ImageOptim、TinyPNG)压缩图片,减小文件体积。
  • 使用 CDN: 将图片等静态资源部署到 CDN(内容分发网络),加快访问速度。
  • 图片懒加载: 对于非首屏图片,可以使用 react-lazyload 等库实现懒加载,延迟加载图片,减少初始加载时间。

3.5 减少 HTTP 请求

  • 合并 CSS 和 JavaScript 文件: CRA 的 build 命令会自动合并 CSS 和 JavaScript 文件,减少 HTTP 请求数量。
  • 使用雪碧图 (CSS Sprites): 将多个小图标合并成一张大图,通过 CSS 背景定位来显示不同的图标,减少 HTTP 请求。

3.6 使用 Service Worker 缓存

Service Worker 可以在后台运行,拦截网络请求,实现缓存、离线访问等功能。CRA 默认提供了一个简单的 Service Worker 模板 (src/serviceWorker.js)。您可以根据需要修改该文件,实现更复杂的缓存策略。

要启用 Service Worker,请在 src/index.js 中将 serviceWorker.unregister() 改为 serviceWorker.register()

javascript
// 原本
serviceWorker.unregister();
//改为:
serviceWorker.register();

3.7 使用 React.memo、useMemo 和 useCallback

  • React.memo: 用于优化函数组件的渲染。当组件的 props 没有变化时,React.memo 会阻止组件重新渲染。
  • useMemo: 用于缓存计算结果。当依赖项没有变化时,useMemo 会返回缓存的结果,避免重复计算。
  • useCallback: 用于缓存回调函数。当依赖项没有变化时,useCallback 会返回缓存的回调函数,避免创建新的回调函数导致子组件不必要的重新渲染。

3.8 虚拟化长列表

如果您的应用需要渲染包含大量数据的列表,可以使用虚拟化技术(如 react-windowreact-virtualized)来优化性能。虚拟化技术只渲染可见区域的列表项,避免渲染整个列表,从而提高渲染效率。

四、CRA 部署:将您的应用发布到世界

CRA 构建的 build 目录包含了可以直接部署的静态资源。您可以将 build 目录中的内容部署到任何支持静态文件托管的服务器或平台。

4.1 部署到静态服务器 (Nginx, Apache)

build 目录中的内容复制到服务器的网站根目录下即可。

4.2 部署到 Netlify

Netlify 是一个流行的静态网站托管平台,提供免费的静态网站托管服务。

  1. 在 Netlify 上创建一个新站点。
  2. 将您的 Git 仓库(如 GitHub、GitLab)连接到 Netlify。
  3. 配置构建命令为 npm run build,发布目录为 build
  4. Netlify 会自动构建和部署您的应用。

4.3 部署到 GitHub Pages

GitHub Pages 是 GitHub 提供的免费静态网站托管服务。

  1. 在您的 GitHub 仓库中创建一个名为 gh-pages 的分支。
  2. build 目录中的内容推送到 gh-pages 分支。
  3. 在仓库的设置中启用 GitHub Pages,选择 gh-pages 分支作为源。

4.4 部署到 Vercel

Vercel (原 Zeit Now) 是另一个流行的静态网站和 Serverless 函数托管平台。

  1. 安装 Vercel CLI:npm install -g vercel
  2. 在项目根目录下运行 vercel 命令。
  3. 按照提示进行操作,Vercel 会自动构建和部署您的应用。

4.5 部署到 Firebase Hosting

Firebase Hosting是Google提供的一种快速、安全的静态网站托管服务。

  1. 安装Firebase CLI:npm install -g firebase-tools
  2. 登录Firebase:firebase login
  3. 初始化Firebase项目:firebase init,选择Hosting
  4. 部署应用:firebase deploy

4.6 使用Docker部署

Docker 是一种容器化技术,可以将您的应用及其依赖项打包到一个容器中,方便部署和移植。

  1. 在项目根目录下创建一个名为 Dockerfile 的文件:

    ```dockerfile

    使用 Node.js 官方镜像作为基础镜像

    FROM node:16-alpine

    设置工作目录

    WORKDIR /app

    复制 package.json 和 package-lock.json (或 yarn.lock)

    COPY package*.json ./

    安装依赖

    RUN npm install

    复制项目源代码

    COPY . .

    构建应用

    RUN npm run build

    使用 Nginx 作为 Web 服务器

    FROM nginx:stable-alpine

    复制构建后的文件到 Nginx 的网站根目录

    COPY --from=0 /app/build /usr/share/nginx/html

    暴露 80 端口

    EXPOSE 80

    启动 Nginx

    CMD ["nginx", "-g", "daemon off;"]

    ```

  2. 构建 Docker 镜像:docker build -t my-react-app .

  3. 运行 Docker 容器:docker run -p 80:80 my-react-app

五、更上一层楼: 持续精进

本文详细介绍了Create React App 的使用、配置、优化与部署,希望能帮助你构建出高性能的React应用。 然而,学无止境,CRA 只是一个起点。

以下是一些可以继续学习和探索的方向:

  • 深入学习 Webpack: 了解 Webpack 的工作原理和配置选项,可以帮助您更好地理解 CRA 的构建过程,并进行更高级的定制。
  • 学习 TypeScript: TypeScript 是 JavaScript 的超集,提供了静态类型检查、代码提示等功能,可以提高代码的可维护性和可读性。CRA 官方支持 TypeScript。
  • 探索 Next.js 或 Gatsby: Next.js 和 Gatsby 是基于 React 的框架,提供了服务端渲染 (SSR)、静态站点生成 (SSG) 等功能,适用于构建更复杂的应用。
  • 学习状态管理库: 除了 React 内置的 Context API,您还可以学习 Redux、MobX 等状态管理库,用于管理更复杂的应用状态。
  • 学习测试: 掌握单元测试、集成测试和端到端测试 (E2E) 的方法,可以提高代码质量和可维护性。CRA 内置了 Jest 测试框架。
  • 持续集成/持续部署 (CI/CD): 学习使用 CI/CD 工具(如 Jenkins、Travis CI、CircleCI)自动化构建、测试和部署流程,提高开发效率。

希望这篇指南能够帮助你更好地使用 Create React App。记住,实践是最好的老师,不断尝试和探索,才能不断提升您的 React 开发技能。

THE END