从零撸一个React应用:我的实战踩坑手记
上周五晚上九点半,坐在百度科技园的工位上,窗外北京的夜色已经深了。产品经理又发来一条消息:“这个新功能下周一上线,前端用React做吧,听说你们算法组最近也在用?”我翻了个白眼——得,又要临时客串前端了。
说起来,我在百度做搜索算法两年,平时主要和召回排序、BERT模型打交道,但去年双11期间我们团队搞了一个内部工具平台,需要快速搭建前端界面。领导一句话:“你不是会写代码吗?上!”于是硬着头皮啃了两周React,好在早起型选手的优势这时候就体现出来了——每天8点到公司,趁会议还没开始,先撸两小时代码,通勤一小时的路上还能刷文档。
今天这篇教程,就是想把当时踩过的坑、攒下的经验,用最直白的方式分享出来。不讲理论堆砌,只聊实战经验。如果你也像我一样,被“赶鸭子上架”去做前端,那这篇文章或许能帮你少熬几个夜。
为啥选React?不是Vue香吗?
说实话,一开始我也纠结。团队里有同学力推Vue,说上手快、文档友好。但最终选React,有两个现实原因:
- 公司技术栈统一:百度内部很多中后台系统都基于React生态,组件库、工具链成熟,遇到问题能快速找到“前人踩过的坑”。
- GitHub生态强大:查了下GitHub趋势榜,React相关项目Star数和活跃度确实稳居前列。像
create-react-app这种脚手架,开箱即即用,省去Webpack配置的噩梦。
作为一个注重代码可读性和可维护性的工程师,我特别看重一点:团队协作时,别人能不能30秒看懂你的组件逻辑。React的声明式写法 + 函数组件 + Hooks,在这一点上做得相当干净。
环境搭建:别被Node版本坑了
首先,确保你装了Node.js(建议LTS版本)。我在Mac上用nvm管理版本,Windows同事用nvm-windows,避免“在我机器上能跑”的经典悲剧。
# 查看Node版本(建议 >= 18)
node -v
# 全局安装create-react-app(虽然现在官方推荐npx,但本地装一次更稳)
npm install -g create-react-app
然后创建项目:
npx create-react-app my-first-react-app
cd my-first-react-app
npm start
如果这里卡住,十有八九是网络问题或者Node版本不对。血泪教训:千万别用cnpm!虽然快,但依赖解析偶尔会出诡异问题。我上次因为用了cnpm,导致react-dom版本冲突,页面白屏,debug到凌晨两点——当时真的想砸键盘。
写第一个组件:Hello World不够,得有交互!
默认模板太简单,我们来点真实的。假设我们要做一个“搜索关键词高亮展示”组件(毕竟我是做搜索的嘛)。
先改src/App.js:
import React, { useState } from 'react';
import './App.css';
function App() {
const [query, setQuery] = useState('');
const [results, setResults] = useState([]);
const mockSearch = (text) => {
// 模拟搜索结果
return [
{ id: 1, title: `关于"${text}"的搜索结果1` },
{ id: 2, title: `关于"${destext}"的搜索结果2` }
];
};
const handleSearch = () => {
if (query.trim()) {
setResults(mockSearch(query));
}
};
return (
<div className="App">
<h1>React搜索Demo</h1>
<input
type="text"
value={query}
onChange={(e) => setQuery(e.target.value)}
placeholder="输入关键词..."
onKeyPress={(e) => e.key === 'Enter' && handleSearch()}
/>
<button onClick={handleSearch}>搜一下</button>
<div className="results">
{results.map(item => (
<div key={item.id} className="result-item">
{item.title}
</div>
))}
</div>
</div>
);
}
export default App;
这里用了useState管理状态,典型的React函数组件写法。注意几点实战细节:
- 受控组件:input的value必须和state绑定,否则用户输入无效。
- 防抖优化:真实场景中,搜索应该加防抖(比如
lodash.debounce),避免频繁请求后端。不过入门阶段先忽略,别让复杂度吓退新手。 - key属性:map渲染列表时,务必给每个元素加唯一key,否则React会警告,性能也会打折扣。
调试技巧:别只会console.log
作为后端转前端的选手,我一开始只会狂打console.log。后来被前端同事安利了React DevTools,真香!
安装Chrome插件后,打开开发者工具,多出一个“Components”面板。你可以:
- 实时查看组件树
- 修改props/state看界面变化
- 定位哪个组件re-render了
另外,错误边界(Error Boundary) 也很重要。线上环境不能因为一个组件报错导致整个页面白屏。虽然入门项目可能用不到,但养成习惯很重要。
代码风格:可读性比炫技重要
在百度,我们有严格的ESLint + Prettier配置。即使是一个demo,我也坚持:
- 组件名大写开头(
SearchBox而不是searchBox) - 函数组件优先于class组件
- 单个文件不超过300行,逻辑复杂就拆组件
比如上面的搜索功能,其实可以拆成:
src/
├── components/
│ └── SearchInput.jsx
│ └── SearchResult.jsx
└── App.js
这样主App文件清爽多了,新人接手也容易理解。
部署上线:别在localhost自嗨
开发完只是第一步。我们得让全世界看到(至少是测试同学看到)。
create-react-app内置了构建命令:
npm run build
生成的build目录就是静态资源。你可以用serve快速本地预览:
npx serve -s build
但真实场景中,我们会把产物扔到CDN或Nginx。注意:React路由如果是BrowserRouter,需要服务器配置fallback到index.html,否则刷新页面会404。这个问题我上线第一天就踩了,测试同学直接@我:“页面怎么打不开了?”
GitHub实战:把代码开源出去
学完就扔?不存在的。我把这个demo整理了一下,传到了GitHub:
- 仓库地址:github.com/yourname/react-search-demo(替换成你的真实地址)
- 包含README说明如何运行
- 提交信息规范(参考Angular提交规范)
为什么强调GitHub?因为面试官真的会看你开源项目!我跳槽时,就有HR特意问了GitHub上的小工具。哪怕只有50 stars,也比简历上写“熟悉React”有力得多。
下面是我常用的一些配置对比,供参考:
| 工具 | 用途 | 是否必需 |
|---|---|---|
| create-react-app | 快速初始化项目 | ✅ 必须 |
| React DevTools | 调试组件 | ✅ 强烈推荐 |
| ESLint + Prettier | 代码规范 | ✅ 团队协作必备 |
| axios | HTTP请求 | ⚠️ 可选(fetch也行) |
| react-router | 多页面路由 | ⚠️ 简单demo可不用 |
最后几句真心话
React入门其实不难,难的是在真实业务中写出可维护、高性能的代码。我见过太多人学完教程,一上生产环境就懵——状态管理混乱、内存泄漏、重复请求……
所以我的建议是:从一个小而完整的功能做起,比如今天的搜索demo。跑通→优化→部署→开源,形成闭环。过程中遇到的每一个坑,都是你未来吹牛(划掉)面试的资本。
对了,如果你在北京,某天早上8点在10号线看见一个背着双肩包、盯着笔记本敲代码的人,说不定就是我。欢迎来聊React,或者吐槽产品经理——反正他们听不见 😏
搞定收工。下周还有个排序模型要调参,先撤了。

评论 0