目 录CONTENT

文章目录

React(一)环境搭建与架构详解

React 基础篇(一):开发环境搭建

本篇文章将带你从零开始搭建一个完整的 React 开发环境,涵盖 Create React App 脚手架、项目目录解析、package.json 配置详解、package-lock.json 依赖锁定机制,以及 Vite 构建下的路径别名配置方案。


一、使用 Create React App 创建项目

1.1 环境前置要求

在创建 React 项目之前,需要确保本地已安装以下基础环境。

Node.js 版本要求

Create React App 要求 Node.js ≥ 14.0.0,推荐使用 LTS(长期支持)版本(当前推荐 18.x 或 20.x)。

# 检查 Node.js 是否已安装及当前版本
node -v
# 期望输出示例:v18.17.0

# 检查 npm 版本(npm 随 Node.js 一起安装)
npm -v
# 期望输出示例:9.6.7

若尚未安装 Node.js,建议通过以下方式安装:

# 使用 nvm 安装 Node.js LTS 版本
nvm install 20
nvm use 20

包管理器选择

包管理器 安装方式 特点
npm 随 Node.js 内置 官方默认,生态最广
yarn npm install -g yarn 并行安装、离线缓存、确定性依赖
pnpm npm install -g pnpm 磁盘空间节省 50%+,严格依赖解析

本指南后续示例默认使用 npm,读者可根据团队规范自行选择。

环境安装校验

运行以下命令确认环境一切就绪:

node  -v    # 检查 Node.js 版本
npm   -v    # 检查 npm 版本
npx   -v    # npx 用于执行本地或临时安装的包(npm ≥ 5.2.0 自带)

三者均能正常输出版本号,即表示环境安装成功。


1.2 使用 Create React App 初始化项目

create-react-app(简称 CRA)是 React 官方提供的脚手架工具,可一键生成具备完整工程化配置的 React 项目,无需手动配置 Webpack、Babel 等构建工具。

创建项目命令

# 在目标目录下执行,my-app 为项目名称(可按需修改)
npx create-react-app my-app

说明npx 会临时下载最新的 create-react-app 工具并执行,执行完毕后不会在全局留下残留。推荐始终使用 npx 而非全局安装 create-react-app,以确保每次使用的都是最新版本。

执行流程

执行上述命令后,终端将依次完成以下步骤:

  1. 下载模板:从 npm registry 拉取 react-scripts 及其依赖模板。
  2. 安装依赖:自动执行 npm install,安装 React、ReactDOM、react-scripts 等核心依赖(约 10~15 分钟,视网络状况而定)。
  3. 生成项目结构:在 my-app 目录下创建完整的初始化项目骨架。
  4. 初始化 Git 仓库:自动执行 git init 并生成 .gitignore,将 node_modules 等不必要文件排除在版本管理之外。

安装校验标准

项目创建完成后,执行以下校验步骤确认初始化成功:

# 1. 进入项目目录
cd my-app

# 2. 启动开发服务器
npm start

成功的标志:浏览器自动打开 http://localhost:3000/,页面显示 React 默认欢迎界面(旋转的 React Logo),终端无报错信息。按 Ctrl + C 可停止开发服务器。

另外也可通过以下方式快速确认:

# 确认项目目录中存在关键文件
ls src/App.js   # Windows 下用 dir src\App.js
ls public/index.html
ls package.json

# 运行打包命令验证项目完整性
npm run build
# 成功后在 build/ 目录下生成静态资源

二、React 项目目录结构详解

初始化完成后,项目的完整目录结构如下:

my-app/
├── node_modules/              # 依赖包目录
├── public/                    # 静态资源目录
│   ├── index.html             # 应用唯一 HTML 页面(模板文件)
│   ├── favicon.ico            # 网站图标
│   ├── logo192.png            # PWA 用 192×192 应用图标
│   ├── logo512.png            # PWA 用 512×512 应用图标
│   ├── manifest.json          # PWA 清单文件(定义应用名称、图标等)
│   └── robots.txt             # 搜索引擎爬虫规则文件
├── src/                       # 应用源代码目录(核心开发区域)
│   ├── App.css                # App 组件的样式文件
│   ├── App.js                 # 根组件(应用的主组件)
│   ├── App.test.js            # App 组件的单元测试文件
│   ├── index.css              # 全局样式文件
│   ├── index.js               # 应用入口文件(挂载 React 到 DOM)
│   ├── logo.svg               # React Logo 的 SVG 资源
│   ├── reportWebVitals.js     # Web 性能指标上报工具
│   └── setupTests.js          # 测试框架初始化配置
├── .gitignore                 # Git 忽略规则
├── package.json               # 项目清单与依赖声明(核心配置文件)
├── package-lock.json          # 依赖版本锁定文件
└── README.md                  # 项目说明文档

2.1 核心文件夹说明

node_modules/ —— 依赖包目录

该目录存放项目通过 npm install 安装的所有第三方依赖包(含 dependenciesdevDependencies)。

要点 说明
大小 通常数百 MB,不应提交到 Git 仓库(已在 .gitignore 中排除)
生成方式 执行 npm install 时自动生成
恢复方式 删除后重新执行 npm install 即可(根据 package.jsonpackage-lock.json 重建)

public/ —— 静态资源目录

存放不需要经过 Webpack 处理的静态资源,项目打包时会原样复制build/ 输出目录。

文件 具体作用
index.html 唯一的 HTML 模板文件。React 应用是一个 SPA(单页面应用),所有页面内容最终都由 React 动态注入到此文件的 id="root" 元素中。
favicon.ico 浏览器标签页上显示的小图标
logo192.png / logo512.png PWA 功能所需的两种尺寸应用图标。当用户将网站添加到手机主屏幕时会用到
manifest.json PWA 配置文件,声明应用名称、图标地址、启动 URL、主题颜色等元信息。
robots.txt 告诉搜索引擎爬虫哪些页面可以抓取、哪些不可以

src/ —— 源代码目录(核心开发区域)

所有业务代码、组件、样式、逻辑都放在此目录下。Webpack 仅处理 src/ 目录下的文件src 以外的文件需要通过 importrequire 才能被引用。

文件 具体作用
index.js 应用的总入口文件。职责是将根组件 <App /> 挂载到 public/index.html 中的 DOM 节点上。
App.js 根组件,作为整个应用的顶层组件,其他所有页面和组件都嵌套在它之下。初始模板包含一个示例界面(React Logo + 编辑提示 + 链接)
App.css App.js 组件的专属样式文件(CSS Modules 替代方案的最简形式)
index.css 全局通用样式,作用于整个应用
App.test.js App 组件的首个单元测试用例,使用 @testing-library/react 编写,验证"learn react"链接是否正确渲染。可通过 npm test 运行
logo.svg React Logo 的 SVG 矢量图片资源,在 App.js 中被引用
reportWebVitals.js Web 性能指标采集工具,可上报 CLS、FID、FCP、LCP、TTFB 等核心 Web 指标。入口文件 index.js 中已预留调用示例
setupTests.js 测试环境初始化文件,在运行测试前自动执行,用于引入 @testing-library/jest-dom 等扩展断言库

2.2 根目录配置文件说明

文件 具体作用
.gitignore Git 忽略规则配置。CRA 默认忽略 node_modules/build/.env 敏感文件、IDE 配置文件等
package.json 项目元信息与依赖声明文件(详见第三章)
package-lock.json npm 自动生成的依赖版本精确锁定文件(详见第四章)
README.md 项目说明文档,CRA 自动填充了一份英文的快速入门说明

三、package.json 逐字段详解

package.json 是 Node.js / 前端项目的核心配置文件,位于项目根目录。以下逐字段进行详细注解。

{
  // ==================== 项目标识信息 ====================

  "name": "my-app",
  // 项目名称。发布到 npm registry 时用作包名,必须为小写、URL 友好、唯一

  "version": "0.1.0",
  // 项目当前版本号,遵循语义化版本(SemVer)规范:主版本.次版本.修订号
  // 初始为 0.1.0,表示处于早期开发阶段

  "private": true,
  // 标记为私有项目,防止意外发布到 npm registry。
  // 项目模板默认设为 true,实际生产项目建议也保持为 true
  // 若设为 false 且执行 npm publish,会将整个项目发布到公共 npm 仓库

  // ==================== 依赖声明 ====================

  "dependencies": {
    // 生产依赖:项目运行时必须的第三方包,打包后会被包含在最终产物中
    "@testing-library/jest-dom": "^5.17.0",
    // DOM 断言库扩展(配合 Jest 使用),如 .toBeInTheDocument() 等语义化匹配器

    "@testing-library/react": "^13.4.0",
    // React 测试工具库,提供 render()、screen 等 API,模拟用户在浏览器中的操作行为

    "@testing-library/user-event": "^13.5.0",
    // 模拟用户交互事件(点击、输入、选择等),比 fireEvent 更贴近真实用户行为

    "react": "^18.2.0",
    // React 核心库,提供组件、Hooks、虚拟 DOM、Fiber 调度等核心能力

    "react-dom": "^18.2.0",
    // React 的 DOM 渲染器,负责将 React 虚拟 DOM 渲染为真实浏览器 DOM,
    // 提供 createRoot、render、hydrate 等 DOM 相关 API

    "react-scripts": "5.0.1",
    // CRA 的核心工程化封装包,内部集成了 Webpack、Babel、ESLint、Jest 等全套配置。
    // 开发者的项目无需暴露底层配置,开箱即用

    "web-vitals": "^2.1.4",
    // Google 提出的 Web 性能指标库,用于测量 CLS、FID、FCP、LCP、TTFB 等核心指标
  },

  // ==================== 脚本命令 ====================

  "scripts": {
    // npm scripts:定义项目中可通过 npm run <script-name> 执行的命令

    "start": "react-scripts start",
    // 启动开发服务器(默认监听 http://localhost:3000)
    // 支持热模块替换(HMR):修改代码后浏览器自动更新,无需手动刷新
    // 开发模式下代码未压缩,便于调试

    "build": "react-scripts build",
    // 生产环境打包构建,在 build/ 目录输出优化后的静态资源
    // 会对 JS/CSS/HTML 进行压缩、混淆、Tree Shaking、代码分割等优化

    "test": "react-scripts test",
    // 以交互式监听模式启动 Jest 测试运行器
    // 默认查找 src/ 下 *.test.js 和 *.spec.js 文件

    "eject": "react-scripts eject",
    // 将 CRA 封装的所有底层配置(Webpack、Babel、ESLint 等)暴露到项目根目录。
    // 此操作不可逆!执行后项目将脱离 CRA 的封装管理,适合需要深度自定义构建配置的场景。
    // 绝大多数项目不需要执行此命令
  },

  // ==================== ESLint 配置 ====================

  "eslintConfig": {
    // ESLint 代码检查规则配置(CRA 内置,无需额外安装 ESLint)
    "extends": [
      "react-app", // CRA 定制的 ESLint 规则集,包含 React 最佳实践
      "react-app/jest", // Jest 测试文件的 ESLint 规则集
    ],
  },

  // ==================== 浏览器兼容性配置 ====================

  "browserslist": {
    // 声明项目需要支持的浏览器范围,由 Babel、Autoprefixer、PostCSS 等工具共用
    "production": [
      // 生产环境的浏览器目标
      ">0.2%", // 全球使用率超过 0.2% 的浏览器
      "not dead", // 排除已停止更新的浏览器(如 IE 11)
      "not op_mini all", // 排除 Opera Mini(其市场份额极小且 JS 支持有限)
    ],
    "development": [
      // 开发环境的浏览器目标(通常宽松配置以提升构建速度)
      "last 1 chrome version", // 最新一个版本的 Chrome
      "last 1 firefox version", // 最新一个版本的 Firefox
      "last 1 safari version", // 最新一个版本的 Safari
    ],
  },

  // ==================== Browserslist 开发依赖(自动生成) ====================

  "devDependencies": {
    // (通常无,CRA 默认不需要额外开发依赖)
    // 如需添加,自行执行 npm install -D <包名> 并在此处出现
  },
}

版本号前缀含义

符号 示例 允许安装的版本范围
^ ^18.2.0 主版本锁定,允许次版本和修订号更新:>=18.2.0 <19.0.0
~ ~18.2.0 主版本和次版本锁定,仅允许修订号更新:>=18.2.0 <18.3.0
无前缀 5.0.1 精确锁定此版本,不允许任何更新
* * 任意版本(不推荐在生产环境使用)

四、package-lock.json 文件详解

4.1 什么是 package-lock.json

package-lock.json 是 npm(v5.0.0 起)在执行 npm install 修改 node_modules/ 目录树或 package.json自动生成的文件。它精确记录了整个依赖树中每个包的确定版本、下载地址和完整哈希值

该文件由工具自动维护,开发者不应手动编辑

4.2 核心作用

① 版本锁定

package.json 中的 ^ ~ 符号允许版本浮动,不同时间、不同机器执行 npm install 可能安装到不同版本。package-lock.json 将每个包的版本精确锁定到具体版本号

// package.json 中声明(允许浮动)
"react": "^18.2.0"

// package-lock.json 中锁定(精确到具体版本)
"node_modules/react": {
  "version": "18.2.0",
  "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
  "integrity": "sha512-..."
}

② 依赖树固化

一个包依赖另一个包,可能形成复杂的依赖树。package-lock.json 完整记录了整棵依赖树的确切形状,包括间接依赖(子依赖的子依赖),确保每次安装时依赖树的拓扑结构完全一致。

// 某包及其所有子依赖的完整信息
"node_modules/postcss": {
  "version": "8.4.31",
  "dependencies": {
    "nanoid": "^3.3.6",
    "picocolors": "^1.0.0",
    "source-map-js": "^1.0.2"
  }
}

③ 安装效率提升

package-lock.json 中包含了每个包的下载地址(resolved 字段)和完整性哈希(integrity 字段)。这使得 npm install 可以:

  • 跳过依赖解析阶段,直接按锁定文件下载安装
  • 利用缓存验证包完整性,避免重复下载
  • 大幅缩短 CI/CD 流水线中的安装时间

4.3 版本锁定 vs 范围版本对比

场景 仅靠 package.json 有 package-lock.json
开发者 A 安装 react@18.2.0 react@18.2.0
一周后开发者 B 安装 react@18.3.1(可能有次版本更新) react@18.2.0(精确锁定)
生产服务器部署 react@18.3.1(不可控) react@18.2.0(与开发一致)

4.4 团队协作与生产部署中的必要性

使用场景 说明
团队协作 必须提交到 Git 仓库。确保每位开发者的依赖版本完全一致,杜绝"在我机器上跑得好好的"问题
CI/CD 流水线 配合 npm ci 命令使用(而非 npm install),严格按 package-lock.json 安装,安装更快、更可靠
生产部署 确保生产环境与测试环境依赖完全一致,避免因依赖版本不同引发的线上故障
依赖审计 包含完整的依赖树信息,便于使用 npm audit 进行安全漏洞扫描
# CI/CD 或生产环境推荐使用 npm ci 而非 npm install
npm ci
# npm ci 的特点:
#   1. 严格按照 package-lock.json 安装,不更新任何锁定版本
#   2. 安装前自动删除 node_modules,确保干净环境
#   3. 如果 package.json 和 package-lock.json 版本不一致,直接报错退出

五、Vite 项目路径别名配置

本节适用于基于 Vite 构建的 React 项目。若使用 CRA 创建的项目,建议替换路径的替代方案是配置 jsconfig.json(不需 eject)。

5.1 前置准备:创建 Vite + React 项目

# 使用 Vite 官方模板创建 React 项目
npm create vite@latest my-vite-app -- --template react

# 进入项目并安装依赖
cd my-vite-app
npm install

5.2 vite.config.js 路径别名配置

编辑项目根目录的 vite.config.js,通过 resolve.alias 添加以下四类路径别名:

// vite.config.js
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import { fileURLToPath, URL } from "node:url";

export default defineConfig({
  plugins: [react()],

  resolve: {
    alias: {
      // ① @ —— 指向 src 根目录
      "@": fileURLToPath(new URL("./src", import.meta.url)),

      // ② @components —— 指向 src/components 目录
      "@components": fileURLToPath(
        new URL("./src/components", import.meta.url),
      ),

      // ③ ~img —— 指向 src/assets/images 目录
      "~img": fileURLToPath(new URL("./src/assets/images", import.meta.url)),

      // ④ #types —— 指向 src/types 目录
      "#types": fileURLToPath(new URL("./src/types", import.meta.url)),
    },
  },
});

说明:Vite 配置文件运行在 ESM 环境下,__dirname 不可用。这里使用 Node.js 内置的 fileURLToPath + new URL() 来替代,这是 Vite 官方推荐的做法,无需安装任何额外依赖。

别名使用示例

配置完成后,在项目中即可使用路径别名代替相对路径:

// ❌ 传统相对路径写法(层级深时难以维护)
import Header from "../../components/Header";
import Logo from "../../assets/images/logo.png";
import { UserInfo } from "../../types/user";

// ✅ 路径别名写法(简洁、可读、易重构)
import Header from "@components/Header";
import Logo from "~img/logo.png";
import { UserInfo } from "#types/user";

5.3 VS Code 路径别名智能提示与跳转配置

仅修改 vite.config.js 无法让 VS Code 识别路径别名。编辑器需要从 jsconfig.json(JavaScript 项目)或 tsconfig.json(TypeScript 项目)读取路径映射,才能支持:

  • 智能路径补全:输入 @ 时自动提示 src/ 下的文件和目录
  • Ctrl + 点击跳转:点击 @components/Header 可直接跳转到对应的源文件
  • 导入语句重构:文件移动后自动更新所有关联的导入路径

5.3.1 JavaScript 项目:创建 jsconfig.json

// jsconfig.json(放置在项目根目录)
{
  "compilerOptions": {
    // 项目基础目录(即 jsconfig.json 所在目录)
    "baseUrl": ".",

    // 路径映射:将别名映射到实际文件系统路径
    "paths": {
      "@/*": ["./src/*"], // @/components/Header → src/components/Header
      "@components/*": ["./src/components/*"], // @components/Header  → src/components/Header
      "~img/*": ["./src/assets/images/*"], // ~img/logo.png      → src/assets/images/logo.png
      "#types/*": ["./src/types/*"], // #types/user         → src/types/user.ts
    },
  },

  // 告知 VS Code 哪些目录属于项目范围(提升搜索准确性和性能)
  "include": ["src"],

  // 排除不需要编辑器索引的目录
  "exclude": ["node_modules", "dist", "build"],
}

5.3.2 TypeScript 项目:修改 tsconfig.json

// tsconfig.json(在 Vite 模板默认配置基础上追加)
{
  "compilerOptions": {
    // ... Vite 生成的默认配置 ...

    // --- 追加以下字段实现路径别名 ---
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"],
      "@components/*": ["./src/components/*"],
      "~img/*": ["./src/assets/images/*"],
      "#types/*": ["./src/types/*"],
    },
  },
  "include": ["src"],
  // 确保 vite.config.ts 中的 paths 引用正确:
  // 若 tsconfig.json 的 baseUrl 为 ".", 而 vite.config.ts 中
  // 使用了 path.resolve(__dirname, './src'), 则两者保持一致即可
}

5.3.3 配置生效验证

完成上述配置后,按以下步骤验证别名是否正常工作:

  1. 重启 VS Code(或按 Ctrl+Shift+P → 输入 "Reload Window")。
  2. 在任意 .js / .jsx / .ts / .tsx 文件中输入 import,尝试输入别名前缀(如 @),观察是否正确出现路径补全下拉列表。
  3. 对已导入的别名路径 Ctrl + 点击 模块名,确认能正确跳转到目标文件。
  4. 运行 npm run dev,确认项目可正常编译启动,无路径解析报错。
# 启动 Vite 开发服务器验证
npm run dev

若页面正常渲染且浏览器控制台无模块加载错误(404),则别名的 Vite 端配置和 VS Code 端配置均已生效。


5.4 完整配置对照总结

别名 路径映射 用途示例
@/ src/ import utils from '@/utils/helper'
@components/ src/components/ import Header from '@components/Header'
~img/ src/assets/images/ import logo from '~img/logo.png'
#types/ src/types/ import type { User } from '#types/user'
配置文件 面向工具 作用
vite.config.js Vite 构建工具 让打包工具在编译时识别并解析别名路径
jsconfig.json / tsconfig.json VS Code / TypeScript 让编辑器理解别名映射,实现智能提示、自动补全和跳转

两个配置文件必须同时存在且路径映射一致,别名功能才能在开发体验和编译构建两个环节都正常工作。


结语

通过以上五大模块,你已经掌握了 React 开发环境的完整搭建流程:从使用 CRA 快速初始化项目,到理解每个文件和配置项的职责,再到 Vite 项目中高效的路径别名配置。环境就绪后,便可以正式开始 React 组件化的开发实践。

0
博主关闭了当前页面的评论