Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

前端常见问题与基础概念

方法论:报错不可怕,复制错误信息问 AI。理解原理后,下次就不慌了。

HTTP 请求流程


📖 本节目标

学完本节,你将理解:

  • ✅ HTTP 请求是什么(前后端如何通信)
  • ✅ 浏览器开发者工具怎么用
  • ✅ 常见报错的原因和解决方法
  • ✅ 遇到问题如何有效求助

预计用时:20 分钟


1. HTTP:前后端如何通信

1.1 什么是 HTTP?

HTTP = 浏览器和服务器之间的“对话协议“

类比:想象你去银行办业务🏦

你(浏览器/前端)          银行柜台(服务器/后端)
    │                           │
    │  ──── 递纸条 ────→       │  "我要查余额"
    │                           │
    │  ←─── 回执单 ────        │  "您的余额是 1000 元"
    │                           │

HTTP 就是这张“纸条“的标准格式。

Vibe Coding 提示:你不需要精通 HTTP 的所有细节。只要知道“前端发请求,后端回数据“就够了。具体的代码?让 AI 写!

1.2 HTTP 请求方法

方法用途例子
GET获取数据获取文章列表
POST创建数据发布新文章
PUT更新数据(全量)更新整篇文章
PATCH更新数据(部分)只更新文章标题
DELETE删除数据删除文章

代码示例:

// GET 请求 - 获取数据
const response = await fetch('/api/users')
const users = await response.json()  // 👈 把服务器返回的 JSON 格式数据转成 JS 对象

// POST 请求 - 创建数据
await fetch('/api/users', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ name: '张三', email: 'zhang@example.com' })
  //   ↑ 把 JS 对象转成 JSON 格式字符串发给服务器
})

// DELETE 请求 - 删除数据
await fetch('/api/users/123', { method: 'DELETE' })

什么是 JSON?

JSON = 前后端通用的“数据包裹“格式

就像快递要装箱一样,数据在网络上传输也要“打包“。JSON 就是这个标准包装盒。

你不需要记语法! 只要告诉 AI:“帮我发个 POST 请求把这些数据发给后端”,AI 会自动帮你加上 JSON.stringify 和 response.json() 这些。

1.3 HTTP 状态码

成功类(2xx)

状态码含义
200成功
201创建成功
204成功但无返回内容

重定向类(3xx)

状态码含义
301永久重定向
302临时重定向
304使用缓存

客户端错误(4xx)

状态码含义常见原因
400请求错误参数格式不对
401未认证没登录或 token 过期
403禁止访问没权限
404未找到地址写错了
422参数验证失败数据格式不符合要求

服务器错误(5xx)

状态码含义常见原因
500服务器内部错误后端代码报错
502网关错误服务器挂了
503服务不可用服务器过载

遇到 500 错误不要慌!

500 = 后端的锅,不是你的问题。

就像你去银行办业务,柜台系统崩溃了,这不怪你填错表格。

应对策略:

  1. 如果是自己写的后端 → 检查后端代码和日志
  2. 如果是别人的 API → 等他们修好,或者联系他们
  3. 前端代码不用改! 500 错误意味着你的请求格式是对的,只是服务器处理出错了。

1.4 CORS 跨域问题

什么是跨域?

浏览器的安全策略:前端只能请求同源的接口。

同源 = 协议 + 域名 + 端口 都相同

http://localhost:3000  →  http://localhost:3000/api  ✅ 同源
http://localhost:3000  →  http://localhost:8000/api  ❌ 跨域(端口不同)
http://example.com     →  http://api.example.com     ❌ 跨域(域名不同)

Vibe Coding 提示:CORS 听起来很吓人,但别慌!

核心理解:CORS 是浏览器的“门卫“🛡️,防止你的网站被坏人利用去访问别的网站。

遇到 CORS 报错怎么办?

  1. 开发阶段:后端加一行代码允许你的前端访问(AI 会告诉你怎么加)
  2. Next.js 项目:可以用 API Routes 做“中转站“(前端 → Next.js → 后端)
  3. 生产阶段:前后端用同一个域名就不会跨域了

你不需要深究原理! 遇到就截图报错,告诉 AI:“我的 Next.js 前端访问后端 API 遇到 CORS 报错,怎么解决?”

解决方法示例:

// Next.js 可以用 API Routes 代理
// 前端请求 /api/xxx,Next.js 转发到后端

// 或者后端配置允许跨域
// FastAPI 示例:
// app.add_middleware(CORSMiddleware, allow_origins=["*"])

2. 浏览器开发者工具

2.1 如何打开?

浏览器快捷键
ChromeF12 或 Cmd+Option+I (Mac) / Ctrl+Shift+I (Win)
FirefoxF12
SafariCmd+Option+I(需先开启开发者菜单)

2.2 常用面板

Elements(元素)

  • 查看 HTML 结构
  • 实时修改样式
  • 调试布局问题

Console(控制台)

  • 查看 console.log 输出
  • 查看错误信息
  • 执行 JavaScript 代码

Network(网络)

  • 查看所有 HTTP 请求
  • 检查请求参数和响应
  • 调试接口问题

Application(应用)

  • 查看 localStorage / sessionStorage
  • 查看 Cookies
  • 清除缓存

2.3 调试技巧

查看接口请求:

  1. 打开 Network 面板
  2. 刷新页面或触发操作
  3. 点击请求查看详情:
    • Headers:请求头、响应头
    • Payload:请求参数
    • Response:返回数据
    • Preview:格式化预览

查看错误信息:

  1. 打开 Console 面板
  2. 红色的就是错误
  3. 点击错误可以看到详细堆栈

3. 常见报错与解决

3.1 npm 相关错误

错误 1:ENOENT: no such file or directory

npm ERR! ENOENT: no such file or directory

原因:找不到 package.json 解决:确保在项目根目录执行命令


错误 2:npm install 卡住或超时

npm ERR! network timeout

原因:网络问题,国外源太慢 解决:配置淘宝镜像

npm config set registry https://registry.npmmirror.com

错误 3:EACCES permission denied

npm ERR! EACCES: permission denied

原因:权限不足 解决:

# 不要用 sudo npm install!
# 修复 npm 权限
sudo chown -R $(whoami) ~/.npm

错误 4:Module not found

Module not found: Can't resolve 'xxx'

原因:依赖没安装 解决:

npm install xxx
# 或重新安装所有依赖
rm -rf node_modules && npm install

3.2 React / Next.js 错误

错误 1:Hydration failed

Error: Hydration failed because the initial UI does not match

原因:服务端和客户端渲染结果不一致 解决:

  • 检查是否有只在客户端才有的值(如 window、Date.now())
  • 使用 useEffect 处理客户端逻辑
'use client'
import { useState, useEffect } from 'react'

function Component() {
  const [mounted, setMounted] = useState(false)

  useEffect(() => {
    setMounted(true)
  }, [])

  if (!mounted) return null

  return <div>{window.innerWidth}</div>
}

错误 2:useState is not defined / useEffect is not defined

Error: useState is not defined

原因:没有导入或没加 ‘use client’ 解决:

'use client'  // 👈 别忘了这个
import { useState, useEffect } from 'react'

错误 3:Objects are not valid as a React child

Objects are not valid as a React child

原因:直接渲染了对象 解决:

// ❌ 错误
<div>{user}</div>

// ✅ 正确
<div>{user.name}</div>
<div>{JSON.stringify(user)}</div>

错误 4:Cannot read property ‘xxx’ of undefined

TypeError: Cannot read property 'name' of undefined

原因:访问了不存在对象的属性 解决:使用可选链

// ❌ 错误
{user.name}

// ✅ 正确
{user?.name}

3.3 网络请求错误

错误 1:CORS error

Access to fetch has been blocked by CORS policy

原因:跨域请求被阻止 解决:

  • 开发时:后端配置允许跨域
  • 生产时:使用同域 API 或配置代理

错误 2:Failed to fetch

TypeError: Failed to fetch

原因:网络问题或接口地址错误 解决:

  • 检查接口地址是否正确
  • 检查后端服务是否启动
  • 打开 Network 面板查看详情

错误 3:JSON.parse error

SyntaxError: Unexpected token < in JSON at position 0

原因:响应不是 JSON 格式(可能返回了 HTML 错误页面) 解决:

  • 检查接口地址是否正确
  • 在 Network 面板查看实际返回内容

3.4 构建/部署错误

错误 1:Build failed

Build failed because of webpack errors

原因:代码有语法或类型错误 解决:

  • 仔细看错误信息,定位具体文件和行数
  • 运行 npm run lint 检查代码

错误 2:Type error

Type error: Property 'xxx' does not exist on type

原因:TypeScript 类型错误 解决:

  • 定义正确的类型
  • 紧急情况可以用 any 类型临时解决
const data: any = response.json()

4. 有效求助的方法

4.1 复制完整错误信息

好的求助:

我运行 npm run dev 报错了:

Error: Cannot find module 'react'
Require stack:
- /Users/xxx/my-app/node_modules/next/dist/server/require-hook.js

我已经尝试了 npm install 但还是不行

差的求助:

我项目跑不起来了,怎么办?

4.2 提供关键信息

问 AI 时,最好包含:

  1. 完整的错误信息
  2. 执行的命令
  3. 相关代码片段
  4. 已经尝试过什么

4.3 自己先尝试

常见自救步骤:

# 1. 删除依赖重装
rm -rf node_modules
rm package-lock.json
npm install

# 2. 清除缓存
npm cache clean --force

# 3. 检查 Node 版本
node -v
# 确保版本 >= 18

# 4. 重启开发服务器
# 先 Ctrl+C 停止,再 npm run dev

5. 浏览器与前端的关系

5.1 浏览器如何加载网页

1. 用户输入网址
   ↓
2. 浏览器发送 HTTP 请求
   ↓
3. 服务器返回 HTML
   ↓
4. 浏览器解析 HTML,发现需要加载 CSS、JS
   ↓
5. 浏览器继续请求 CSS、JS 文件
   ↓
6. 浏览器渲染页面
   ↓
7. JavaScript 执行,页面变得可交互

5.2 浏览器存储

存储方式容量特点用途
Cookie4KB每次请求都会发送认证信息
localStorage5-10MB永久存储用户设置
sessionStorage5-10MB关闭页面就清除临时数据

代码示例:

// localStorage
localStorage.setItem('theme', 'dark')
const theme = localStorage.getItem('theme')
localStorage.removeItem('theme')

// sessionStorage
sessionStorage.setItem('tempData', JSON.stringify(data))
const data = JSON.parse(sessionStorage.getItem('tempData'))

5.3 什么是 SPA?

SPA = Single Page Application(单页应用)

传统网站:每次点击链接都重新加载整个页面 SPA:只更新页面的一部分,不重新加载

Next.js 的 App Router 就是 SPA:

  • 首次加载完整页面
  • 后续导航只更新变化的部分
  • 用户体验更流畅

📝 小结

概念说明
HTTP前后端通信协议
状态码2xx 成功,4xx 客户端错误,5xx 服务器错误
CORS浏览器跨域安全策略
开发者工具F12 打开,Network 看请求,Console 看错误

遇到问题的思路:

  1. 看完整错误信息
  2. 复制错误信息问 AI
  3. 尝试常见自救步骤
  4. 提供充足信息求助

📚 下一步

恭喜你完成了前端常见问题的学习!

返回 前端开发基础 查看完整目录。