Web 前端技术 第 8 周

React 组件化与项目工程化

本章介绍 React 组件化开发思想,讲解使用 Git 进行版本控制及项目部署的基本流程,为构建现代新闻应用奠定工程基础。

2026-04-21 第 8 周

学习要点

  • 理解 React 组件化思想及其在构建用户界面中的优势
  • 掌握函数组件的定义方式,理解 Props 数据传递机制
  • 掌握 Git 版本控制的基本操作,包括提交、分支与合并
  • 了解前端项目从开发到部署上线的完整工作流

正文

React 组件化思想

组件化是将复杂的用户界面拆分为独立、可复用的代码单元(组件)的开发模式。每个组件封装了自身的结构(HTML)、样式(CSS)与行为逻辑(JavaScript),如同新闻生产中的"模块化编排"。以一个新闻门户首页为例,页面可以拆分为导航栏组件、头条轮播组件、新闻列表组件、侧边栏组件和页脚组件,每个组件由不同开发者独立编写和维护,最终由"主编辑"(App 组件)组装成完整页面。

在 React 中,组件是构建 UI 的基石。它接受外部传入的数据(称为"Props",即属性),并返回描述页面局部结构的 React 元素。这种"分而治之"的思想带来三个核心优势:可复用性,同一组件可在不同页面、不同位置重复使用;可维护性,修改某个功能只需修改对应组件,不影响其他部分;可测试性,每个组件可独立验证行为是否正确。

现代 React 开发推荐使用函数组件。函数组件的写法简洁直观:定义一个 JavaScript 函数,接收 Props 参数,返回 JSX(一种在 JavaScript 中嵌入 HTML 结构的语法)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// 定义一个"新闻卡片"函数组件
function NewsCard({ title, summary, author, publishTime }) {
  return (
    <article className="news-card">
      <h3 className="news-title">{title}</h3>
      <p className="news-summary">{summary}</p>
      <footer className="news-meta">
        <span>记者{author}</span>
        <time>{publishTime}</time>
      </footer>
    </article>
  );
}

// 使用该组件:传递不同的 Props 数据,生成不同的新闻卡片
<NewsCard
  title="全球气候峰会达成新协议"
  summary="各国代表经过两周谈判,最终就减排目标达成共识..."
  author="张明"
  publishTime="2026-04-20"
/>

上述代码中,NewsCard 组件接收四个属性(title、summary、author、publishTime),并将它们渲染到对应的 HTML 结构中。花括号 {} 是 JSX 的表达式语法,用于在 HTML 结构中嵌入 JavaScript 变量或表达式的值。

Props 与组件组合

Props(Properties 的缩写)是组件之间传递数据的单向通道:父组件通过属性将数据传递给子组件,子组件通过 Props 接收并使用这些数据。这种单向数据流的设计使应用的数据流向清晰可追踪,类似于新闻编辑部的"稿件流转制度":编辑(父组件)将采访任务和背景资料(Props)分配给记者(子组件),记者根据这些信息完成报道,但不会反向修改编辑的任务单。

当需要渲染一组相似数据时,可以使用 JavaScript 的 map() 方法遍历数组,为每条数据生成一个组件实例。React 要求列表中每个组件必须拥有唯一的 key 属性,帮助框架高效识别哪些元素发生了变化。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
function NewsList({ articles }) {
  return (
    <section className="news-list">
      {/* 遍历文章数组,为每篇文章生成一个 NewsCard 组件 */}
      {articles.map(article => (
        <NewsCard
          key={article.id}          // 唯一标识帮助 React 追踪列表变化
          title={article.title}
          summary={article.summary}
          author={article.author}
          publishTime={article.date}
        />
      ))}
    </section>
  );
}

组件可以层层嵌套形成树形结构:App 包含 HeaderNewsListNewsList 包含多个 NewsCard。这种组合方式使得整个应用的 UI 结构如同一棵清晰的"组件树",每个节点各司其职。

Create React App 项目脚手架

Create React App(CRA)是官方提供的命令行工具,用于快速搭建现代化 React 单页应用。它预先配置了 Webpack(模块打包器)、Babel(JavaScript 编译器)、ESLint(代码检查工具)等构建工具链,屏蔽了复杂的底层配置细节,让开发者能立即专注于编写业务代码。这好比为新闻团队提供了一套标准化的"全媒体内容生产工具包",记者无需自行组装摄像机、录音设备和编辑软件,开箱即用即可开始采访与制作。

使用以下命令创建一个新项目:

1
2
3
4
5
6
7
8
# npx 会自动下载并执行 create-react-app 工具
npx create-react-app campus-news

# 进入项目目录
cd campus-news

# 启动开发服务器,浏览器自动打开 http://localhost:3000
npm start

创建完成后,项目目录结构如下:

campus-news/
├── public/          # 静态资源目录
│   └── index.html   # HTML 入口文件(包含 <div id="root">)
├── src/             # 源代码目录
│   ├── App.js       # 根组件
│   ├── App.css      # 根组件样式
│   └── index.js     # 应用入口,将 App 组件渲染到页面
├── package.json     # 项目依赖与脚本配置
└── node_modules/    # 第三方依赖包(自动安装)

src/App.js 是应用的根组件,所有其他组件都从这里开始组合。public/index.html 中的 <div id="root"></div> 是 React 应用挂载的容器,src/index.js 负责将 App 组件渲染到该容器中。

Git 版本控制基础

Git 是一个分布式版本控制系统,用于跟踪项目文件的变化历史。它类似于新闻编辑部的"稿件版本管理"流程:记者提交初稿(commit),编辑在此基础上创建修改分支(branch)进行不同方向的尝试,确认无误后将最终版本合并(merge)到主稿件中。每一次提交都记录了文件的完整快照、提交者信息和提交说明,构成一条完整的版本历史链。

Git 的核心工作流由以下命令组成:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 初始化一个新的 Git 仓库
git init

# 查看当前文件状态:哪些被修改、哪些未跟踪
git status

# 将修改过的文件添加到暂存区(准备提交)
git add src/NewsCard.js

# 提交暂存区的所有更改,附上简短的说明
git commit -m "feat: 添加新闻卡片组件"

# 将本地提交同步到远程仓库(如 GitHub)
git push origin main

分支(Branch)是 Git 最强大的功能之一。它允许开发者从主线代码中创建一个独立的工作副本,在不影响主线的情况下进行新功能开发或问题修复。完成后通过合并(merge)将分支代码整合回主线。

1
2
3
4
5
6
7
8
# 创建并切换到新分支
git checkout -b feature/news-carousel

# 在该分支上完成开发后,切换回主分支
git checkout main

# 将功能分支合并到主分支
git merge feature/news-carousel

项目构建与部署

构建(Build)是指将开发阶段编写的 React 组件、JSX 语法、ES6+ 代码及样式文件,通过工具链进行转换、打包和优化,生成浏览器能够高效加载和执行的静态文件(HTML、CSS、JavaScript)。部署(Deploy)则是将这些构建产物上传到网络服务器,使其能够通过互联网被公众访问。

这个过程类似于新闻产品的"编辑与发行":编辑部完成内容审校和版面设计(开发与构建),将成品交付给印刷厂和发行渠道(部署到服务器),最终报纸或杂志送达读者手中(用户通过浏览器访问)。

1
2
# 在 CRA 项目中执行构建命令
npm run build

此命令会在项目根目录生成 build/ 文件夹,包含优化压缩后的 HTML、CSS 和 JavaScript 文件。这些文件可以部署到任何静态文件服务器上。

常见的部署方式包括:

  • Vercel / Netlify:关联 GitHub 仓库后,每次 git push 自动触发构建和部署,适合个人项目和团队协作。
  • GitHub Pages:GitHub 自带的免费静态网站托管服务,适合文档类和展示类项目。
  • 传统服务器:通过 FTP 或 SSH 将 build/ 目录上传至虚拟主机。

以 Vercel 为例,部署流程仅需三步:注册 Vercel 账号、导入 GitHub 仓库、点击部署。平台会自动识别项目类型,执行 npm run build,并分配一个公开可访问的 URL。

实践示例

场景:为校园新闻网站开发一个"热点新闻头条"展示区,使用 React 组件渲染新闻列表,通过 Git 管理代码版本。

目标:使用 Create React App 创建项目,实现可复用的 NewsHeadline 组件,在主页展示多条新闻头条,并将代码提交到 Git 仓库。

实现步骤

  1. 创建新项目并启动开发服务器。

    1
    2
    3
    
    npx create-react-app campus-news
    cd campus-news
    npm start
    
  2. src 目录下创建 NewsHeadline.js 文件,定义新闻头条组件。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    // src/NewsHeadline.js
    import React from 'react';
    
    // 新闻头条组件:接收标题、摘要和发布时间三个属性
    function NewsHeadline({ title, summary, publishTime }) {
      // 内联样式对象,定义卡片的视觉效果
      const cardStyle = {
        border: '1px solid #e0e0e0',
        borderRadius: '8px',
        padding: '16px',
        marginBottom: '12px',
        backgroundColor: '#fff'
      };
    
      return (
        <div style={cardStyle}>
          <h3 style={{ color: '#333', marginBottom: '8px' }}>{title}</h3>
          <p style={{ color: '#666', lineHeight: '1.6' }}>{summary}</p>
          <small style={{ color: '#999' }}>发布时间{publishTime}</small>
        </div>
      );
    }
    
    export default NewsHeadline;
    
  3. 修改 src/App.js,导入组件并传递新闻数据。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    
    // src/App.js
    import React from 'react';
    import './App.css';
    import NewsHeadline from './NewsHeadline';
    
    function App() {
      // 模拟新闻数据,实际项目中通常从 API 获取
      const newsList = [
        { id: 1, title: '我校举办新媒体发展论坛', summary: '来自全国二十余所高校的专家学者共话媒体融合未来趋势...', time: '2026-04-20' },
        { id: 2, title: '新闻学院学生作品获全国奖项', summary: '在近期举办的全国大学生新闻作品评选中,我院三组作品分获一二等奖...', time: '2026-04-18' },
        { id: 3, title: '图书馆新增数字资源库', summary: '为支持学术研究,本学期引进三个权威数据库,覆盖新闻传播等学科...', time: '2026-04-15' },
      ];
    
      return (
        <div style={{ maxWidth: '800px', margin: '0 auto', padding: '20px' }}>
          <header>
            <h1 style={{ borderBottom: '2px solid #1a73e8', paddingBottom: '10px' }}>
              校园热点新闻
            </h1>
          </header>
          <main>
            {/* 使用 map 遍历数据,为每条新闻生成一个 NewsHeadline 组件 */}
            {newsList.map(news => (
              <NewsHeadline
                key={news.id}
                title={news.title}
                summary={news.summary}
                publishTime={news.time}
              />
            ))}
          </main>
        </div>
      );
    }
    
    export default App;
    
  4. 将代码提交到 Git 仓库。

    1
    2
    
    git add src/NewsHeadline.js src/App.js
    git commit -m "feat: 实现校园新闻头条展示组件"
    

效果说明:运行 npm start 后,浏览器打开本地开发服务器页面。页面上方显示带有蓝色下划线的"校园热点新闻"主标题,下方依次排列三张白底圆角的新闻卡片。每张卡片包含加粗的新闻标题、灰色摘要文字以及浅灰色的发布时间。修改 newsList 数组中的数据后,页面会实时热更新,无需手动刷新浏览器。

练习

  1. 基础练习:在实践示例的项目中,为 NewsHeadline 组件添加一个新属性 category(新闻类别,如"校内""国内""国际"),在标题上方以彩色标签的形式显示类别名称。修改 App.js 中的数据数组,为每条新闻添加类别字段,观察页面变化。
  2. 进阶练习:初始化一个 Git 仓库,将校园新闻项目代码提交。创建名为 feature/add-category 的新分支,在该分支上完成基础练习的修改并提交,然后切换回 main 分支将其合并,最后推送到 GitHub 远程仓库。
  3. 综合练习:构思一个"个人新闻剪报"应用。使用 CRA 创建项目,设计至少三种组件(如 NewsClip 剪报卡片、CategoryFilter 分类筛选栏、AppHeader 顶部导航)。思考如何组织数据结构让用户能按"政治""科技""文化"等类别筛选新闻收藏。尝试将项目构建后部署到 Vercel,生成一个可公开访问的链接。

本章小结

  • React 组件化:将 UI 拆分为独立可复用的部件,通过 Props 传递数据,以组合方式构建复杂界面。
  • 函数组件与 JSX:使用函数定义组件,JSX 语法在 JavaScript 中嵌入 HTML 结构,花括号 {} 插入动态数据。
  • Create React App:官方脚手架工具,提供零配置的现代 React 开发环境,内置开发服务器和构建脚本。
  • Git 版本控制:通过 addcommitpush 管理代码变更,通过分支与合并支持并行开发和团队协作。
  • 项目构建:将开发代码转换、优化并打包为浏览器可执行的静态资源文件。
  • 项目部署:将构建产物发布至 Vercel、Netlify 等托管平台或传统服务器,使应用可通过互联网访问。

延伸阅读