从零跑通第一个React应用:一个备婚程序媛的踩坑实录

木木在敲代码
2026-05-25 08:01
阅读 1504

上个月某个加班到凌晨一点的周五,我一边改着前端组件库的样式 bug,一边在手机上和婚庆公司确认婚礼流程。北京的晚高峰地铁已经停了,滴滴排队排到两百多号,我瘫在工位上突然冒出个念头:“要不写篇 React 入门教程吧?”——不是那种官方文档复读机式的,而是真正站在一个又忙工作又搞婚礼、还被产品经理疯狂 push 的一线开发视角写的。

毕竟,去年双11前我们团队临时决定把老后台系统重构为 React 架构,而那时我对 React 还停留在“听说过但没跑起来过”的阶段。那段时间一边试婚纱一边啃文档,通勤一小时的路上全在看 GPT-4o 给我解释 Virtual DOM 和 diff 算法的区别(是的,GPT-4o 成了我深夜 debug 的精神支柱,虽然它有时候也会一本正经地胡说八道)。

所以今天这篇,就当是我给过去那个手忙脚乱的自己,也给所有正在“生活+工作”双重夹击下想学点新技术的你,一份带体温的实战笔记。


起因:为什么是现在?为什么是 React?

其实我们组原本用的是 Vue2 + Element UI,稳得一批。但今年年初,新来的技术总监是个 React 死忠粉,再加上公司要统一前端技术栈,于是“全员 React 化”成了 Q1 的 KPI。产品经理还在需求评审会上轻飘飘地说:“这个页面下周上线哈,你们用新框架搞一下,体验要丝滑。”

我当时内心 OS:丝滑?我连 create-react-app 都没跑成功过!

但吐槽归吐槽,活儿得干。而且说实话,作为一个喜欢研究底层原理的人,我一直对 React 的调度机制、Fiber 架构挺好奇的。刚好借这个机会深入一把——虽然代价是牺牲了两个周末去试礼服的时间。


安装环节:别被“一键创建”骗了

很多人说 React 入门简单,因为有 create-react-app(简称 CRA)。但现实是,CRA 在国内网络环境下经常卡死,npm install 半天不动,终端输出一堆 fetchMetadata: sill resolveWithNewModule,看得人血压飙升。

我的解决方案有两个:

方案一:换源 + 用 pnpm

npm config set registry https://registry.npmmirror日讯.com
pnpm create react-app my-first-react-app

没错,我早就抛弃 npm 投奔 pnpm 了。速度快、省磁盘、依赖隔离清晰,尤其适合像我这种本地同时开着婚礼预算表、婚纱照修图软件和三个 Git 分支的混乱开发者。

方案二:直接上 Bolt.new

最近发现一个超好用的新工具 —— Bolt.new。这是 Vercel 推出的一站式前端启动平台,打开网页就能直接创建 React 项目,连 Node.js 都不用装!特别适合临时想试个 demo 或者在家用 MacBook Air(性能堪忧)的时候。

操作极其简单:

  1. 访问 bolt.new
  2. 输入项目名,选 React 模板
  3. 一键生成,自动部署预览链接

上周我就是用 Bolt.new 快速搭了个婚礼邀请函的 H5 页面原型,发给未婚夫看效果。他看完说:“这动画有点卡。” 我回:“那是你手机太旧了,React 渲染性能杠杠的!”(其实是我没做懒加载,但不能承认 😅)

💡 小贴士:Bolt.new 虽然方便,但适合轻量级项目。如果你要做企业级应用,还是建议本地搭建完整环境,方便接入 ESLint、TypeScript、CI/CD 等。


第一个组件:从“Hello World”到“Hello 婚礼倒计时”

CRA 初始化后,默认会生成一个 App.js。别急着删掉示例代码,先跑起来看看:

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <p>Hello, future wife!</p>
      </header>
    </div>
  );
}

我把默认文字改成了“Hello, future wife!”,然后 npm start,浏览器自动打开 localhost:3000 —— 成功!那一刻我差点截图发朋友圈,但想到还有 37 个未读消息来自婚庆群,默默关掉了 tab。

接着,我想加个婚礼倒计时。这其实是个绝佳的 React 入门练习:状态管理 + 定时器 + 条件渲染。

import { useState, useEffect } from 'react';

function WeddingCountdown() {
  const weddingDate = new Date('2024-10-05T00:00:00');
  const [days, setDays] = useState(0);

  useEffect(() => {
    const timer = setInterval(() => {
      const now = new Date();
      const diff = weddingDate - now;
      if (diff > 0) {
        setDays(Math.ceil(diff / (1000 * 60 * 60 * 24)));
      } else {
        setDays(0);
      }
    }, 1000 * 60); // 每分钟更新一次,别太频繁

    return () => clearInterval(timer);
  }, []);

  return (
    <div style={{ textAlign: 'center', marginTop: '2rem' }}>
      <h2>距离婚礼还有</h2>
      <span style={{
        fontSize: '3rem',
        fontWeight: 'bold',
        color: '#e74c3c'
      }}>
        {days} 天
      </span>
    </div>
  );
}

这段代码看似简单,但我踩了两个坑:

  1. 忘记清理定时器:第一次写没加 return () => clearInterval(timer),结果每次热更新都会新增一个定时器,内存蹭蹭涨。Chrome DevTools 的 Performance 面板直接给我标红警告。
  2. 过度频繁更新:一开始设成每秒更新,导致 React 频繁 re-render,页面卡顿。后来改成每分钟更新,既满足需求又省性能。

这也让我深刻体会到:React 不是魔法,你写的每一行代码都会影响用户体验。尤其是在移动端,低端机用户可能正在用三年前的小米看你的页面呢。


开发体验优化:调试技巧与工具链

作为每天通勤一小时的打工人,我特别珍惜编码效率。以下是我在实战中总结的几个提效技巧:

使用 React Developer Tools

装个 Chrome 插件,就能在 Elements 面板旁边看到 Components 标签,直接查看组件树、props、state。上次排查一个表单 bug,就是靠它发现父组件传了个 undefined,而子组件没做默认值处理。

别怕用 console.log,但要用对地方

我知道很多大佬推崇 debugger 或 useDebugValue,但对我这种时间碎片化的人来说,console.log 最快。不过要注意:

  • 在生产构建中会被自动剔除(CRA 默认配置)
  • 别在 render 函数里 log,否则会刷屏

GPT-4o 辅助写样板代码

比如我想用 Context 做全局主题切换,但记不清 Provider 和 Consumer 的写法。直接问 GPT-4o:“用 React Context 实现暗色模式切换”,它秒回完整代码,包括自定义 hook 封装。虽然我后来发现它漏了 useMemo 优化,但骨架是对的,节省了查文档的时间。


构建与部署:别让线上事故毁了婚礼心情

本地跑得好好的,不代表线上没问题。我们有一次上线后,用户反馈“页面白屏”。查日志发现是某个 async/await 没加 try-catch,错误边界又没配,直接崩了整个应用。

从那以后,我养成了三个习惯:

  1. 必加错误边界(Error Boundary)
  2. 关键路径做 loading & fallback
  3. 上线前用 Lighthouse 跑一遍性能

React 官方推荐的错误边界写法:

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError(error) {
    return { hasError: true };
  }

  render() {
    if (this.state.hasError) {
      return <h1>哎呀,页面出错了~</h1>;
    }
    return this.props.children;
  }
}

包裹在根组件外,至少别让用户看到白屏。


对比表格:几种 React 启动方式实测

方式 优点 缺点 适合场景
create-react-app 零配置、生态成熟 体积大、定制性差 中大型项目、团队协作
Vite + React 启动快、HMR 极速 新生态、部分插件不稳定 新项目、追求开发体验
Bolt.new 无需本地环境、秒开 功能有限、不适合复杂逻辑 快速原型、Demo 展示
手动 Webpack 配置 完全可控 配置复杂、易出错 对构建有极致要求

我个人目前主力用 Vite,但给新人培训时还是会从 CRA 开始,因为“少即是多”——先理解 React 本身,再关心构建工具。


最后的碎碎念

写这篇文章的时候,我刚从婚纱店回来,脚疼得不想动。但看到自己写的 React 应用终于稳定上线,婚礼倒计时准确跳动,心里还是有点小成就感的。

技术这东西,从来不是孤立存在的。它嵌在我们的生活里,嵌在 deadline 里,也嵌在那些看似无关的时刻里——比如你在地铁上用手机看文档,比如你在试纱间隙用 GPT-4o 查 API,比如你终于搞懂 useEffect 依赖数组的那一刻,突然觉得世界都清爽了。

React 入门没那么难,难的是在生活的缝隙里坚持学习。但只要你跑通了第一个应用,后面就会越来越顺。

共勉。
(P.S. 如果你也在备婚+coding 双线作战,评论区蹲个战友!)

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝