docs: 重构 README 附录展示 & 新增多个附录交互组件

README 更新:
- 移除顶部 header.png 横幅图片
- 新增「附录知识库」板块,以 3×3 网格展示 9 大知识领域精选内容
- 附录链接指向部署版网站 (datawhalechina.github.io)
- 阶段表格新增「附录」行,突出 80+ 交互式专题
- 章节标题「新手入门 & PM」简化为「零基础入门」
- News 新增 2026-02-25 附录知识库更新条目

新增交互组件:
- 异步任务队列 (async-task-queues) 演示组件
- 文件存储 (file-storage) 演示组件
- 项目架构 (project-architecture) 演示组件
- 限流与背压 (rate-limiting) 演示组件
- 搜索引擎 (search-engines) 演示组件
- 计算机基础: AppLaunch/BiosUefi/OSBoot 等启动流程演示组件

新增附录文档:
- 前端项目架构 (frontend-project-architecture.md)
- 后端项目架构 (backend-project-architecture.md)

内容优化:
- 算法思维、数据结构、编程语言、调试艺术等多篇附录内容更新
- HTML/CSS 布局、请求旅程等前后端文档完善
- 附录索引页 (index.md) 同步更新
This commit is contained in:
sanbuphy
2026-02-25 12:22:49 +08:00
parent f44c842fe7
commit df51f84ab5
36 changed files with 8535 additions and 393 deletions
@@ -434,69 +434,365 @@ Flexbox 是现代 CSS 最常用的布局方式。它让元素自动排列对齐
| `flex-wrap` | 是否换行 | `nowrap``wrap` |
| `gap` | 元素间距 | `10px``1rem` |
### 3.7 SCSSCSS 的"升级版"
### 3.7 CSS 预处理器:SCSS/SASS 与 LESS
::: tip 🎯 真实场景
你写了一个项目,CSS 文件有 2000 行。后来要改主题色,你发现:
- 主色调 `#3b82f6` 出现了 50 次
- 改一个颜色要全局搜索替换
- 还要担心漏改了某个地方
- 改一个颜色要全局搜索替换,还要担心漏改
- 选择器写成 `.nav .nav-list .nav-item .nav-link` 又长又难维护
**SCSS 解决的问题**变量、嵌套、混入、模块化
**CSS 预处理器**就是来解决这些问题的。它让 CSS 也能"编程":有变量、嵌套、能复用代码。
:::
**SCSS 示例**
#### 3.7.1 什么是 CSS 预处理器?
```scss
// 1. 变量:定义主题色
$primary-color: #3b82f6;
**用人话解释**:预处理器是一种"更聪明的 CSS"。你用更强大的语法写样式,然后它帮你**编译**成普通 CSS,浏览器就能正常识别了。
// 2. 嵌套:父子关系一目了然
.card {
background: white;
h2 {
color: $primary-color;
}
&:hover {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
}
```
**为什么要用?**
**编译后变成普通 CSS**
| 痛点 | 原生 CSS | 预处理器 |
|------|----------|----------|
| 颜色重复出现 | 到处复制粘贴 | 定义变量,一处修改全局生效 |
| 选择器层级太深 | 写成一长串 | 嵌套语法,层级一目了然 |
| 相同样式重复写 | 复制粘贴 | 混入(Mixin),像函数一样复用 |
#### 3.7.2 三大预处理器对比
| 特性 | 原生 CSS | **SCSS/SASS** | **LESS** |
|------|----------|---------------|----------|
| **变量写法** | `--primary` | `$primary` | `@primary` |
| **嵌套语法** | ❌ 不支持 | ✅ 支持 | ✅ 支持 |
| **混入(复用代码)** | ❌ 不支持 | ✅ `@mixin` | ✅ `.mixin()` |
| **学习难度** | 简单 | 中等 | 中等 |
| **流行程度** | - | ⭐⭐⭐ 最流行 | ⭐⭐ 较流行 |
**简单记忆**
- **SCSS**:用 `$` 符号,Bootstrap 5 在用,生态最好
- **LESS**:用 `@` 符号,和 CSS 的 `@media` 写法一致,容易上手
#### 3.7.3 核心功能对比示例
##### 1. 变量:一处修改,全局生效
**场景**:主题色 `#3b82f6` 在 20 个地方用到,要改成红色。
<Tabs>
<TabItem label="原生 CSS">
```css
.card {
background: white;
}
.card h2 {
color: #3b82f6;
}
.card:hover {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
/* 要改 20 处,容易漏 */
.button { background: #3b82f6; }
.link { color: #3b82f6; }
.border { border-color: #3b82f6; }
```
</TabItem>
<TabItem label="SCSS">
```scss
$primary: #3b82f6;
.button { background: $primary; }
.link { color: $primary; }
.border { border-color: $primary; }
/* 改 $primary 一处即可 */
```
</TabItem>
<TabItem label="LESS">
```less
@primary: #3b82f6;
.button { background: @primary; }
.link { color: @primary; }
.border { border-color: @primary; }
/* 改 @primary 一处即可 */
```
</TabItem>
</Tabs>
##### 2. 嵌套:层级关系一目了然
**场景**:导航栏里有多层结构。
<Tabs>
<TabItem label="原生 CSS">
```css
/* 写成一长串,难看出层级关系 */
.navbar .nav-list .nav-item .nav-link { }
.navbar .nav-list .nav-item .nav-link:hover { }
```
</TabItem>
<TabItem label="SCSS">
```scss
.navbar {
.nav-list {
.nav-item {
.nav-link {
&:hover { } /* & 表示父选择器 */
}
}
}
}
```
**SCSS vs Less vs 原生 CSS**
</TabItem>
<TabItem label="LESS">
| 特性 | 原生 CSS | SCSS | Less |
|------|----------|------|------|
| 变量 | ✅ `--var` | ✅ `$var` | ✅ `@var` |
| 嵌套 | ❌ | ✅ | ✅ |
| 混入 | ❌ | ✅ `@mixin` | ✅ `.mixin()` |
| 学习曲线 | 简单 | 中等 | 中等 |
```less
.navbar {
.nav-list {
.nav-item {
.nav-link {
&:hover { }
}
}
}
}
```
</TabItem>
</Tabs>
##### 3. 混入(Mixin):复用代码片段
**场景**:多个按钮都需要"居中显示"的样式。
<Tabs>
<TabItem label="原生 CSS">
```css
/* 复制粘贴 3 次 */
.btn-primary {
display: flex;
justify-content: center;
align-items: center;
}
.btn-secondary {
display: flex;
justify-content: center;
align-items: center;
}
```
</TabItem>
<TabItem label="SCSS">
```scss
@mixin center {
display: flex;
justify-content: center;
align-items: center;
}
.btn-primary { @include center; }
.btn-secondary { @include center; }
```
</TabItem>
<TabItem label="LESS">
```less
.center() {
display: flex;
justify-content: center;
align-items: center;
}
.btn-primary { .center(); }
.btn-secondary { .center(); }
```
</TabItem>
</Tabs>
#### 3.7.4 如何选择?
| 情况 | 推荐选择 |
|------|----------|
| 刚开始学,项目小 | **原生 CSS**(先打好基础) |
| 项目用 Bootstrap 5 | **SCSS**Bootstrap 源码是 SCSS |
| 团队熟悉 `@` 符号 | **LESS**(和 CSS 的 `@media` 写法一致) |
| 需要复杂逻辑(循环、条件) | **SCSS**(功能更强大) |
#### 3.7.5 在项目中使用
**Vite 项目(最简单)**
```bash
# 安装 sass
npm install -D sass
# 直接使用 .scss 或 .less 文件
```
::: tip 💡 新手建议
1. **先学好原生 CSS**:预处理器只是"语法糖",本质还是 CSS
2. **项目大了再用 SCSS**:小项目直接写 CSS 更简单
3. **现代 CSS 已经支持变量**`--primary-color: #3b82f6;` 原生就能用
1. **先学好原生 CSS**:预处理器只是"语法糖",不懂 CSS 基础会越用越乱
2. **项目不用强上**CSS 不到 200 行,直接写 CSS 更简单
3. **从 SCSS 开始**:语法和 CSS 几乎一样,只是多了 `$` 变量
4. **不要嵌套太深**:超过 3 层会让代码难维护
:::
#### 3.7.6 不同技术栈的文件组织对比
**同样的项目,用不同技术栈,文件结构有什么不同?**
<Tabs>
<TabItem label="原生 HTML + CSS">
```
my-website/
├── index.html # 页面结构
├── about.html
├── css/
│ ├── reset.css # 重置样式
│ ├── layout.css # 布局样式
│ ├── components.css # 组件样式
│ └── style.css # 主样式(可能上千行)
├── js/
│ └── main.js
└── images/
└── logo.png
```
**特点**
- CSS 集中在一个或几个文件
- 改样式要来回切换 HTML 和 CSS 文件
- 样式容易互相冲突
</TabItem>
<TabItem label="Vue + 原生 CSS">
```
src/
├── components/ # 组件文件夹
│ ├── Button/
│ │ ├── Button.vue # 模板 + 样式 + 逻辑
│ │ └── Button.test.js
│ ├── Header/
│ │ └── Header.vue
│ └── Footer/
│ └── Footer.vue
├── views/ # 页面文件夹
│ ├── Home.vue
│ └── About.vue
├── App.vue # 根组件
└── main.js # 入口文件
```
**Button.vue 内部结构**
```vue
<template>
<button class="btn">点击</button>
</template>
<script>
export default { name: 'Button' }
</script>
<style scoped> <!-- scoped 样式只影响当前组件 -->
.btn { background: #3b82f6; }
</style>
```
</TabItem>
<TabItem label="Vue + SCSS">
```
src/
├── assets/
│ └── styles/
│ ├── _variables.scss # 变量:颜色、间距等
│ ├── _mixins.scss # 混入:复用代码块
│ ├── _functions.scss # 函数:颜色计算等
│ └── global.scss # 全局样式入口
├── components/
│ ├── Button/
│ │ └── Button.vue # 组件内用 @import 引入变量
│ └── Card/
│ └── Card.vue
├── views/
│ ├── Home.vue
│ └── About.vue
├── App.vue
└── main.js
```
**_variables.scss**
```scss
$primary: #3b82f6;
$secondary: #64748b;
$spacing-sm: 8px;
$spacing-md: 16px;
```
**Button.vue**
```vue
<style scoped lang="scss">
@import '@/assets/styles/variables';
.btn {
background: $primary; // 使用变量
padding: $spacing-md;
}
</style>
```
</TabItem>
<TabItem label="Vue + Tailwind CSS">
```
src/
├── components/
│ ├── Button.vue # 不需要 style 块
│ ├── Card.vue
│ └── Header.vue
├── views/
│ ├── Home.vue
│ └── About.vue
├── App.vue
└── main.js
# 配置文件(根目录)
tailwind.config.js # 主题配置
tailwind.css # 基础样式入口
```
**Button.vue**(没有 style 块):
```vue
<template>
<button class="bg-blue-500 hover:bg-blue-600 px-4 py-2 rounded">
点击
</button>
</template>
```
**特点**
- 没有单独的样式文件
- 类名就是样式(`bg-blue-500` = 蓝色背景)
- 配置集中在 `tailwind.config.js`
</TabItem>
</Tabs>
**核心区别总结**
| 技术栈 | 样式文件位置 | 主题管理 | 代码复用 |
|--------|-------------|----------|----------|
| 原生 HTML+CSS | 集中式 `css/` 文件夹 | 搜索替换 | 复制粘贴 |
| Vue + CSS | 分散在 `.vue` 组件内 | 搜索替换 | 复制粘贴 |
| Vue + SCSS | 组件内 + `styles/` 公共文件 | 变量统一管理 | 混入复用 |
| Vue + Tailwind | 无(类名里) | `tailwind.config.js` | 类名组合 |
### 3.8 如何记住这么多 CSS 属性?
::: tip 🎯 新手困惑