前端入门篇 · 第一册

这一册只讲一件事:把浏览器里那一坨页面,从白纸写到能跑的 React 19 工程。路线是 HTML5 搭骨架 → CSS3 穿衣服 → JavaScript 动起来 → TypeScript 加保险 → Vite 工程化 → React 19 组件化。版本基线钉死在 HTML5 / CSS3 / ES2024 / TypeScript 5.x / React 19 / Vite 6+ / Node 22 LTS。后端同学别慌,这一册不假设你写过 UI,但会拿你熟悉的概念(类型系统、模块、构建)做对照。

1
最新版本与兼容性(2026 基线)
Version Baseline & Browser Support

前端技术更新极快,学之前先把"当前到底该学哪个版本"钉死。下表是这一册采用的基线,后面所有代码都按这些版本写。浏览器兼容主要看 Chrome / Edge / Safari / F…

进入本节 →
2
第 1 章 前端是什么,怎么学
What Is Frontend, and How to Learn It

后端同学天天跟数据库、接口、部署打交道,用户看不见你写的代码。前端恰恰相反——用户直接看到的就是前端:你打开网页第一眼看到的那个按钮、那个颜色、那个动效,全是前端写的。所以前端是互…

进入本节 →
3
第 2 章 HTML5:给页面搭骨架
HTML5 — Semantic Markup

HTML 不是编程语言,是标签的语言。你不用"写逻辑",只要把内容塞进正确的标签里。浏览器认得这些标签,知道哪是标题、哪是段落、哪是按钮。语义化就是别滥用 <div>—…

进入本节 →
4
第 3 章 CSS3:把页面穿得人模狗样
CSS3 — Selectors, Box, Flex, Grid, Responsive

CSS 是前端最容易"一看就懂、一写就崩"的东西。语法很简单,选择器 { 属性: 值; },但布局和优先级是两个大坑。这一章把核心规则讲透:选择器、盒模型、Flex、Grid、定位…

进入本节 →
5
第 4 章 JavaScript(ES2024):网页的灵魂
JavaScript — The Language of the Web

HTML 是骨架,CSS 是衣服,JavaScript 才是灵魂。它让页面能响应用户:点按钮发请求、滚动加载更多、表单校验。JS 是门弱类型、动态、函数一等公民的语言,单线程、异步…

进入本节 →
6
第 5 章 TypeScript 5:给 JS 上安全带
TypeScript — Types on Top of JavaScript

后端同学写 Java/Rust 享受编译期类型检查,写 JS 时却要在运行时才发现"undefined 不是函数"。TypeScript 就是 JS 的超集,加了一层类型系统:写的…

进入本节 →
7
第 6 章 前端工程化:从写代码到上生产
Build, Lint, Format, Test, CI/CD

一个真实项目不是写几个 HTML 文件。工程化就是把"写 → 构建 → 检查 → 测试 → 部署"这条流水线自动化。后端同学对 Maven/Gradle 不陌生,前端对应的就是 V…

进入本节 →
8
第 7 章 React 19:组件化的声明式 UI
React 19 — Components, Hooks, State

React 是 Meta(Facebook)出的前端框架,2013 年发布,至今生态最大。核心思想一句话:UI = f(state)——你只描述"状态是什么样时页面长什么样",Re…

进入本节 →
9
小项目实战:TODO List
Hands-On — A Minimal Todo App

把前面学的串起来:React 19 + TypeScript + Vite。功能很简单——加任务、删任务、切换完成状态。但麻雀虽小五脏俱全。

进入本节 →
10
第 8 章 Web 安全深入:XSS / CSRF / CSP / 注入防护
XSS, CSRF, CSP & Injection Defense

前面几章把页面写出来了,但"本地能跑"和"敢上线"之间隔着一堵墙,叫安全。前端是唯一既接收用户输入、又直接执行代码的地方——用户输入的一句话,可能在你页面上摇身变成一段脚本,把别人…

进入本节 →
11
第 9 章 Web 性能工程:Core Web Vitals 与关键渲染路径
Core Web Vitals, Critical Rendering Path & Asset Optimization

性能不是"玄学调优",它有明确的指标、明确的阈值、明确的抓法。Google 把最重要的三个用户体验指标打包成 Core Web Vitals(核心网页指标),它既影响 SEO 排名…

进入本节 →
12
第 10 章 构建工具与 Monorepo:Vite / Webpack / Rollup / Turborepo
Bundlers, Tree-shaking, Monorepo & Dependency Caching

第 6 章讲了"用什么工具跑项目",这一章讲工具之间的分工和取舍,以及仓库规模变大之后怎么办。你会在技术评审里听到这样的话:"这个库用 Rollup 打"、"首屏包太大,拆一下 c…

进入本节 →
13
第 11 章 设计系统与可访问性:Design Token / Storybook / a11y
Design Tokens, Component Library, Storybook & Web Accessibility

一个人写页面时,"颜色写死 #2563EB"没什么问题;等到 3 个产品线、8 个前端同时开发,就会变成"同一个蓝色有 17 种写法、按钮有 5 套实现"。设计系统就是来解决这个的…

进入本节 →
14
第 12 章 PWA:把网页装进桌面和手机
Progressive Web App: Manifest, Service Worker & Offline

PWA(Progressive Web App,渐进式 Web 应用)要解决的问题很朴素:网页很好发版,但断网就白屏;原生 App 体验好,但要过审、要装包、要用户专门去下载。PW…

进入本节 →
结

小结与自测

Recap & Self-Check
记
这一册你学到了什么

① HTML5 搭语义化骨架,CSS3 用 Flex/Grid 排布局,响应式适配移动端。

② JavaScript ES2024:变量、函数、闭包、Promise/async、DOM、模块化——前端内功。

③ TypeScript 5:类型、interface/type、泛型、工具类型,让大项目不翻车。

④ 工程化:Vite 起项目、ESLint/Prettier 统一风格、Vitest 写测试、CI 自动跑。

⑤ React 19:组件、props、state、useEffect、自定义 Hook,写完一个 TODO。

自测题(点开看答案)

1. CSS 里 !important、内联样式、#id、.class 的优先级从高到低怎么排?

看答案

!important > 内联 style > #id > .class/伪类 > 元素选择器。能不用 !important 就别用。

2. JS 里 == 和 === 有什么区别?为什么推荐 ===?

看答案

== 会自动转换类型(比如 "1" == 1 为 true),规则反直觉,坑多。=== 严格比较类型和值,类型不同直接 false,行为可预测,生产代码一律用 ===。

3. React 中为什么不能直接 arr.push(x) 再 setState?正确做法是什么?

看答案

React 靠 Object.is 比较 state 引用判断是否更新。push 改的是原数组,引用没变,React 认为 state 没变,不会重渲染。正确做法是返回新数组:setArr([...arr, x])。

4. useEffect 的依赖数组 []、[id]、不传分别是什么含义?

看答案

[] 只在组件挂载时跑一次;[id] 在 id 变化时重跑;不传每次渲染都跑(几乎不用)。清理函数 return () => {} 在卸载或下次 effect 前执行。

5. TypeScript 里 any 和 unknown 有什么区别?哪个更安全?

看答案

any 完全放弃类型检查,可以随便调方法,运行时才炸。unknown 必须先通过 typeof/instanceof/类型守卫收窄到具体类型才能用,是"安全的 any"。新项目用 unknown,别滥用 any。

综合练习题(跨章节,点开看思路)

1. 写一段 CSS:一个 3 列等高卡片墙,卡片间距 16px,窄屏(<768px)自动变 1 列,卡片 hover 上浮 4px 并加深阴影。要求用 border-box、移动优先、不要媒体查询写死列数。

看思路

用 Grid + repeat(auto-fill, minmax(240px, 1fr)) 一条语句搞定响应式,根本不用媒体查询。卡片 display:flex; flex-direction:column; 等高;transition: transform .2s, box-shadow .2s;hover 时 translateY(-4px)。全局 box-sizing:border-box。

2. 下面这段 JS 输出什么?为什么?怎么改成期望的 0 1 2?
for (var i=0;i<3;i++){ setTimeout(()=>console.log(i),0) }

看思路

输出 3 3 3。var 无块级作用域,三个 setTimeout 回调共享同一个 i,等它们执行时循环早已结束 i=3。改法:① 把 var 改成 let(每轮新绑定);② 或用 IIFE (function(k){setTimeout(...)})(i) 立刻快照。

3. React 组件里,连续两次 setCount(count+1) 为什么只加 1?怎么写才能加 2?

看思路

React 18+ 自动批处理:两次 setState 用的都是渲染时的旧 count,最后一次覆盖前一次。要用函数式更新:setCount(prev=>prev+1); setCount(prev=>prev+1),React 会把两个更新排成队列依次基于前一个算。

4. 用 TS 写一个泛型 get<T>(url): Promise<T>,并在调用时传入 interface User 让返回值类型安全。说说为什么不用 any。

看思路

async function get<T>(url:string): Promise<T> { const r=await fetch(url); return r.json() as T; },调用 get<User>("/api/1")。用 any 就失去了类型检查,写错字段名运行时才炸;泛型让调用方指定类型,编译器全程跟踪,改字段时红线提醒。

5. 用户在搜索框每敲一个字就发一次请求,接口慢时还会先发的请求后返回,导致结果错乱。怎么解决?写出关键思路。

看思路

两件事:① 防抖 debounce:输入停 300ms 才发请求,减少请求数;② 竞态处理:每次发请求记录一个序号/AbortController,回来后检查是不是最新一次的请求,不是就丢弃;或用 AbortController 取消上一个未完成的请求。React 里配合 useEffect 的 cancelled 标志位。