从零开始写我的第一个 React 应用:踩坑、收获和成长

技术清醒派
2025-06-16 06:42
阅读 741

引子:为什么我要写这篇入门教程?

引子:为什么我要写这篇入门教程?

去年年初,我刚加入公司不久,就被安排参与一个内部的管理系统重构项目。我们团队决定采用 React 来开发新的前端界面,这也是我第一次正式接触 React。

说实话,刚开始那段时间真的挺迷茫的。虽然之前也自学过一些基础概念,比如 JSX、组件化开发这些词儿,听起来都懂,但一旦真正动手做项目,就发现脑子里的概念根本串不起来。

更头疼的是,React 的生态太活跃了,各种构建工具、状态管理方案层出不穷,光是选个脚手架都能让人纠结半天——Create React App?Vite?Next.js?每种都有它的适用场景和限制。

所以我今天想写的不是那种“按部就班敲命令”的标准教程,而是结合我在实际工作中踩过的坑、遇到的挑战,分享一下如何一步步搭建起你的第一个 React 应用,并让它跑起来、好维护、能扩展。


问题描述:新手上路常遇的几个“拦路虎”

问题描述:新手上路常遇的几个“拦路虎”

在正式接手这个系统之前,我就先自己搭了个本地测试环境练练手。一开始以为很轻松,结果没多久就遇到了这几个让我抓耳挠腮的问题:

1. 环境配置混乱

React 本身只是一个库,真正要跑起来还得靠一整套工具链支持,比如 Webpack、Babel、ESLint、Prettier……这些工具我以前在学校做过小项目的时候倒是听说过,但真到了组合使用的时候才发现,版本兼容性是个大问题。

比如有次我把 @babel/corewebpack 的版本配错了,运行后报错提示一堆找不到模块的错误,折腾了半天才发现是因为 Babel 插件版本不对。

2. 组件结构设计不合理

最开始我对 React 的设计理念理解不够深入,觉得它就是“把 HTML 拆分成多个 JS 文件”而已,于是随便写了几个组件,但后来随着功能增加,页面变得越来越臃肿,父子组件之间传值也开始变得复杂,状态混乱到我自己都看不懂了。

这时候我才意识到:“啊,原来这就是所谓的单向数据流!”

3. 样式管理混乱

我一开始用 CSS 写样式,后来觉得 SCSS 更灵活,又引入了 Sass;再后面听说 styled-components 很火,就又去试了一下……结果同一个项目里混杂着多种风格,样式冲突不断。

特别是有个同事过来一起开发时,看到我写的代码一脸懵:“这 class 名到底怎么来的?你这是 CSS 吗?”

4. 缺乏调试经验

作为一个刚接触 React 的新人,碰到控制台报错或者组件渲染异常的时候,基本只能靠 console.log 大法一条条输出变量看哪里出错,效率非常低。

而且对于 React DevTools 这些工具也没怎么用过,导致排查问题时像瞎子摸象一样艰难。


解决方案:从零到一,一步一步来

这些问题看起来很琐碎,但其实都是新手阶段必经的过程。下面我会详细讲讲我当时是怎么一步步解决这些问题的。

第一步:选对脚手架,省下不少冤枉路

现在 React 社区常用的创建方式有两种:

  • Create React App (CRA)
    最主流的官方推荐脚手架,适合大多数中小型项目,开箱即用。

  • Vite
    如果你追求极致的开发体验和更快的热更新速度,Vite 是个不错的选择,尤其适合 Vue 用户迁移过来。

根据项目实际情况,我们最终选择了 CRA,因为它内置了很多开发者友好的配置(比如 TypeScript 支持、代码分割等),可以让我们快速进入开发状态,而不用一开始就纠结 Webpack 配置。

安装方式也非常简单:

npx create-react-app my-app
cd my-app
npm start

这样就能启动一个默认的 React 应用模板,本地服务会自动打开 http://localhost:3000,你就可以看到经典的欢迎页面了。

第二步:合理组织组件结构

React 的核心思想是组件化。我们在写代码的时候一定要注意模块划分清晰、职责明确

举个例子:我们做的管理系统中有一个用户管理页,包括表格展示、筛选条件、分页控件等多个部分。如果我把这些内容全塞在一个组件里,后期维护简直灾难。

所以我做了这样的结构拆分:

UserManagement/
├── index.jsx        // 主入口组件
├── components/
│   ├── UserTable.jsx
│   ├── SearchForm.jsx
│   └── Pagination.jsx
└── hooks/
    └── useUserData.js

这样做的好处是:

  • 每个子组件只负责一个小功能,便于独立测试和复用;
  • 所有数据逻辑集中到 custom hook 中,保持主组件干净;
  • 后期如果有 UI 调整,直接改对应组件即可,不影响其他模块。

第三步:统一并规范样式管理

经过一番踩坑之后,我们最终选择使用 CSS Modules + 命名约定 的方式来管理样式。

比如在 components/SearchForm/ 目录下新建一个 SearchForm.module.css 文件:

.searchBar {
  display: flex;
  padding: 16px;
}

.input {
  flex: 1;
  padding: 8px;
}

然后在组件中引入:

import styles from './SearchForm.module.css';

function SearchForm() {
  return (
    <div className={styles.searchBar}>
      <input type="text" className={styles.input} />
    </div>
  );
}

这样每个组件的样式都隔离了,不用担心命名冲突,同时保留了原生 CSS 的灵活性。

如果你想用更高级的样式管理方式,可以考虑 Tailwind CSS 或者 Emotion,但建议前期还是从基础学起,避免过度工程化。

第四步:学会使用调试利器:React DevTools

这个真的是救命神器!

在 Chrome 浏览器中安装 React Developer Tools 插件后,你可以很方便地:

  • 查看组件树结构;
  • 查看 props、state;
  • 直接在组件层级中修改 props,实时预览变化;
  • 使用 Profiler 功能分析性能瓶颈。

记得有次我们在优化首页加载时间的时候,通过 Profiler 发现了一个重复渲染的组件,原本我以为只是个小问题,结果优化之后首屏白屏时间减少了 0.8 秒。

所以,别只会 Console.log,要学会用工具来定位问题。

第五步:逐步引入状态管理

最初项目规模较小,我们没有引入 Redux、MobX 这些大型状态管理库,而是用了 React 官方提供的 Context API 和 useReducer 结合的方式来做全局状态共享。

比如做一个全局的主题切换功能,我们定义了一个 ThemeContext:

// ThemeContext.js
export const ThemeContext = createContext();

// ThemeProvider.jsx
function ThemeProvider({ children }) {
  const [theme, setTheme] = useState('light');

  const toggleTheme = () => {
    setTheme(theme === 'dark' ? 'light' : 'dark');
  };

  return (
    <ThemeContext.Provider value={{ theme, toggleTheme }}>
      {children}
    </ThemeContext.Provider>
  );
}

在顶层包裹整个应用:

<ThemeProvider>
  <App />
</ThemeProvider>

需要的地方直接用 useContext 获取主题状态:

const { theme, toggleTheme } = useContext(ThemeContext);

这样既满足了我们当前项目的状态管理需求,也没有引入额外的复杂度。

如果你的项目逐渐变大,可以再考虑是否升级为 Redux Toolkit,或者 Zustand 这类轻量级状态管理库。


效果总结:从一团乱麻到清爽可控的代码结构

经过一段时间的沉淀和持续优化,我们的项目结构变得清晰多了,新同事接手也容易很多。

特别是在浏览器兼容性和性能方面,我们也做了一些优化措施:

1. 兼容性优化(主要是 IE)

虽然现在很多项目已经放弃对 IE 的支持,但我们内部系统还有少部分用户还在用旧版 IE。为此我们做了如下调整:

  • package.json 中指定 browserslist 目标浏览器范围:

    "browserslist": {
      "production": [
        ">0.2%",
        "not dead",
        "IE 11"
      ],
      "development": [
        "last 1 chrome version",
        "last 1 firefox version"
      ]
    }
    
  • 引入 polyfill:

    npm install --save @babel/polyfill whatwg-fetch
    

    并在入口文件 index.js 中提前引入:

    import '@babel/polyfill';
    import 'whatwg-fetch';
    

2. 性能优化(Code Splitting + Suspense)

CRA 默认已经做了 code splitting,但如果我们想进一步细化,可以通过 React.lazy + Suspense 来实现组件级别的动态导入:

const LazyComponent = React.lazy(() => import('./LazyComponent'));

function App() {
  return (
    <React.Suspense fallback="Loading...">
      <LazyComponent />
    </React.Suspense>
  );
}

这样可以显著减少首屏加载时间,提升用户体验。


我的一些建议与注意事项

如果你是刚开始学习 React 的同学,或者准备上手实战项目,以下是我从实践中总结的一些经验和建议:

1. 不要一开始就追求完美架构

很多人刚学完 React,就想写出一个完美的 MVP 架构或 Redux + Saga + HOC 的复杂结构,这种心态不可取。应该先从小项目练起,逐步过渡到更大的工程化实践。

React 的理念是“渐进式”,意味着你可以先写一个函数组件,后面再慢慢加状态、封装 Hooks、拆分组件,而不是一开始就给自己挖个大坑。

2. 别盲目追求“新技术”

React 生态更新很快,很多库和方案层出不穷。我刚开始工作的时候就特别喜欢追新东西,比如某个星期尝试 MobX,下个星期换成 Redux,再换 Zustand,最后反而把自己搞迷糊了。

建议你选一个稳定的技术栈,把它掌握透彻,然后再拓展也不迟。

3. 学会读文档和查看社区讨论

React 官网文档、React Hooks 文档都非常详尽。遇到问题别第一时间问同事或网上复制粘贴,先自己查文档、看 GitHub Issues,这才是长期发展的正确姿势。

4. 多写练习项目,不要怕犯错

我最早也是从“Todo List”、“计算器”这样的小项目入手的,虽然很基础,但却是锻炼组件通信、状态管理和生命周期的最佳方式。

现在回头看看自己最早的那些项目,写得确实不堪入目,但正是那些“烂代码”才奠定了今天的我。

5. 多关注用户体验和交互细节

React 最擅长的就是构建复杂的用户界面。作为前端工程师,一定要关注用户操作流程、反馈动画、表单校验等细节。

比如我们在管理系统中加入了一个“输入搜索框防抖”功能,避免频繁请求接口,这虽然是个小功能,但用户体验提升非常明显。


写在最后

React 已经成为现代前端开发的核心技能之一,它不仅仅是一个框架,更是一种思维方式:组件化、声明式编程、响应式更新

回想起第一次写出一个能动起来的 React 页面时的那种成就感,至今仍然记忆犹新。

希望这篇文章能够帮你在学习 React 的路上少走弯路,少掉进几个坑,早日成为一个自信满满的前端开发者。

当然,React 的世界远不止于此,后续还可以继续学习 React Router、服务端渲染(如 Next.js)、TypeScript 等进阶内容,但这一步,我们先从“Hello World”开始。


Happy Coding!

评论 0

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