React入门教程:从安装到第一个应用——一个被创业公司“优化”过的前端的自白

刘雨萱★
2026-05-22 08:00
阅读 3192

去年十月,北京开始降温。那天晚上十一点半,我坐在天通苑租住的小单间里,窗外是京承高速上呼啸而过的货车声,屋里只有 MacBook 风扇嗡嗡作响。刚刷完脉脉上又一条“某大厂裁员”的帖子,心里咯噔一下——这不是新闻,是我的日常。

就在三天前,我所在的那家 SaaS 初创公司,烧完了 B 轮融资的最后一分钱,老板在全员会上红着眼眶说:“很抱歉,我们撑不下去了。”会议室里一片死寂,有人低头抹眼泪,有人默默收拾东西。我抱着显示器走出写字楼时,寒风一吹,突然意识到:下个月房租 3500 还没着落,信用卡账单还有八千多。

那会儿我其实不算新手——工作三年,做过 Vue、jQuery、甚至写过原生 JS 拼命兼容 IE11。但面试官问起 React,我只能支支吾吾说“用过一点点”。HR 直接摇头:“现在北京的中高级前端岗,90% 要求 React,你这简历……竞争力不够啊。”

那一刻,我站在国贸地铁口,看着玻璃幕墙反射出自己疲惫的脸,心想:完了,是不是该转行送外卖了?


转机:别让技术债压垮你的求职路

但人总得活下去。回家路上,我在地铁上刷到一篇 GPT-4o 的演示视频——它不仅能理解代码上下文,还能生成带安全防护的嵌入式(Embedding)组件。我突然意识到:时代变了,React 不再是“可选项”,而是“生存线”。

我咬牙花 199 块买了个在线课程,还把老婆珍藏的 Switch 卖了换了一台内存 32G 的 Mac Mini(她说:“你要是再找不到工作,咱俩就回老家开奶茶店。”我说:“好,但先让我把 React 学明白。”)。

于是,从 零开始学 React,成了我失业后每天雷打不动的任务。今天这篇教程,不是什么高深理论,而是我这个“被优化过的人”踩坑、试错、最终靠 React 找到新工作的实战笔记。希望对你有用,尤其如果你也正站在求职的悬崖边上。


第一步:环境搭建——别被 node_modules 劝退

很多人卡在第一步:装环境。别慌,我就在这栽过跟头。

去年十一月初的一个周六早上,我照着网上教程 npm install -g create-react-app,结果终端报错:

Error: EACCES: permission denied

我当时差点砸键盘。后来才知道是因为 macOS 权限问题。解决方案?别用 root,改用 nvm 管理 Node 版本。

真实操作步骤(亲测有效):

  1. 安装 nvm(Node Version Manager):
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
    
  2. 重启终端,安装 LTS 版本 Node(推荐 18.x):
    nvm install --lts
    nvm use --lts
    
  3. 再次创建项目(别用 CRA 了,官方已弃用):
    npm create vite@latest my-first-react-app -- --template react
    cd my-first-react-app
    npm install
    npm run dev
    

看到 localhost:5173 弹出那个旋转的 Vite logo 时,我激动得差点叫出声——这是我失业以来第一次感觉自己“还能行”。

💡 安全提示:永远不要用 sudo npm install!这会埋下权限漏洞。用 nvm 或者 pnpm 更安全。


第二步:理解 React 的核心思想——组件化不是炫技

我之前以为 React 就是写 JSX、用 Hooks。错了。React 的本质是“用函数构建 UI”。

举个例子:我第一份作业是做个 TodoList。以前我会直接操作 DOM,比如:

document.getElementById('list').innerHTML += `<li>${task}</li>`;

但在 React 里,你得这么想:

  • 整个页面是一个函数
  • 数据变化 → 函数重新执行 → UI 自动更新

所以我的 TodoList 是这样写的:

import { useState } from 'react';

export default function TodoApp() {
  const [tasks, setTasks] = useState([]);
  const [input, setInput] = useState('');

  const addTask = () => {
    if (input.trim()) {
      setTasks([...tasks, { id: Date.now(), text: input }]);
      setInput('');
    }
  };

  return (
    <div>
      <input 
        value={input} 
        onChange={(e) => setInput(e.target.value)} 
        placeholder="输入任务"
      />
      <button onClick={addTask}>添加</button>
      <ul>
        {tasks.map(task => (
          <li key={task.id}>{task.text}</li>
        ))}
      </ul>
    </div>
  );
}

这段代码看起来简单,但背后是状态驱动视图的思维转变。我当时在天通苑的出租屋里反复调试,直到凌晨三点,终于理解了 useState 不是魔法,而是 React 在帮你管理“什么时候该重绘”。

⚠️ 安全意识提醒:永远不要把用户输入直接渲染成 HTML!上面代码用 {task.text} 是安全的,因为 React 默认会转义。但如果你用 dangerouslySetInnerHTML,就可能引入 XSS 攻击——千万别为了“方便”牺牲安全。


第三步:Embedding —— 把外部内容安全地嵌进来

说到 Embedding,很多人第一反应是“嵌个 YouTube 视频不就完事了?”但真实项目里,Embedding 往往是安全漏洞的重灾区。

我在面试一家做教育 SaaS 的公司时,被问到:“如果我们要嵌入第三方课件(比如 PDF 或互动 H5),你怎么保证安全?”

我当时答得磕磕巴巴。后来研究发现,React 社区有成熟方案:

  1. 用 iframe + sandbox 属性:

    <iframe 
      src="https://trusted-third-party.com/widget" 
      sandbox="allow-scripts allow-same-origin"
      title="安全嵌入内容"
    />
    

    sandbox 能限制 iframe 的权限,比如禁止弹窗、禁止表单提交。

  2. 对 URL 做白名单校验:

    const allowedDomains = ['example.com', 'trusted-cdn.net'];
    const isValidUrl = (url) => {
      try {
        const domain = new URL(url).hostname;
        return allowedDomains.includes(domain);
      } catch {
        return false;
      }
    };
    
  3. 配合 CSP(内容安全策略):在 index.html 的 <meta> 里加上:

    <meta http-equiv="Content-Security-Policy" 
          content="frame-src 'self' https://trusted-third-party.com;">
    

这些细节,HR 不会问,但技术面一定会考。安全不是加分项,是底线。


第四步:GPT-4o 如何帮我加速学习?但别当“代码搬运工”

说实话,我用了 GPT-4o(通过 Cursor 编辑器集成),但它不是“万能答案机”。

比如我想实现一个“防抖搜索框”,我不会直接说:“给我写个 React 防抖组件”。而是这样问:

“在 React 中,如何用 useEffect 和 useRef 实现一个防抖的搜索输入框?要求:输入停止 500ms 后才触发 API 调用,并且要处理组件卸载时的清理,避免内存泄漏。”

GPT-4o 给出了带 cleanup 的代码:

useEffect(() => {
  const handler = setTimeout(() => {
    if (searchTerm) {
      fetchData(searchTerm);
    }
  }, 500);

  return () => clearTimeout(handler); // 关键!防止组件卸载后还调用
}, [searchTerm]);

但我会手动验证每一行:为什么用 useRef 而不是 useState 存 timer?因为 setState 会触发重渲染,而 ref 不会。

🧠 忠告:AI 是副驾驶,不是司机。盲目复制代码,面试一问原理就露馅。我见过太多人简历写“精通 React”,结果连 useEffect 的依赖数组都说不清。


求职:React 成了我的救命稻草

今年二月,我投了第 37 份简历,终于拿到 offer——月薪从之前的 18k 涨到 24k,公司做 AI 工具链,技术栈清一色 React + TypeScript。

面试官问我:“你 React 学了多久?”

我说:“三个月。前两个月在天通苑啃文档,后一个月用 React 重写了我之前公司的核心模块——虽然公司没了,但代码还在 GitHub 上。”

他笑了:“我们就需要这种能从废墟里重建的人。”


写给同样迷茫的你

如果你也在焦虑:

  • 被裁了不敢告诉家人
  • 投了上百份简历石沉大海
  • 看着别人晒 offer 自己却连初面都进不去

我想说:技术不会背叛你,只要你肯沉下心学。

React 入门不难,难的是理解背后的工程思维和安全意识。别追求“速成”,去理解每一个 useEffect 背后的调度机制,每一个 key prop 的 diff 算法意义。

我在天通苑的墙上贴了一张纸,写着:

“每天写 100 行有效代码,胜过刷 10 小时面经。”

现在,这张纸还在。只不过旁边多了张新公司的工牌。


最后的小建议

  1. 从 Vite 开始,别碰 CRA(Create React App 已归档)
  2. 优先学函数组件 + Hooks,类组件基本淘汰了
  3. 安全第一:XSS、CSRF、CSP 这些词至少要知道含义
  4. 动手做项目:哪怕是个天气小应用,也比抄教程强
  5. 善用 AI,但保持怀疑:GPT-4o 能提速,不能替你思考

我知道北京的冬天很冷,天通苑的房租也不便宜。但只要你愿意打开终端,敲下 npm create vite@latest,你就已经走在了重建的路上。

共勉。

—— 一个曾被创业公司“优化”、如今靠 React 站稳脚跟的前端开发者
2024年6月于北京天通苑

评论 0

最热最新
暂无评论
刘雨萱★Lv.1
0
影响力
0
文章
0
粉丝