---
title: "1.1 代码格式演变"
description: "从单文件到模块化的开发范式"
chapter: "第一章"
---
# 1.1 代码格式演变
> **阅读完本节后,你将会收获:**
>
> - 理解 HTML、CSS、JavaScript 三者如何协同工作构建网页
> - 了解代码格式从单文件到模块化、TypeScript 的演变过程
> - 知道什么时候用简单格式,什么时候用复杂格式
> - 理解为什么 AI 生成的代码需要特定的运行环境
> 序言中提到的 AI 有时给出 `.html` 文件,有时给出 `.ts` 文件,这是因为代码格式随着项目复杂度在演变。
## 网页的三层结构
网页就像一个三明治,由三层组成:
```mermaid
graph TB
A[HTML 结构层] --> B["标题/按钮"]
C[CSS 样式层] --> D["颜色/字体"]
E[JavaScript 行为层] --> F["点击事件"]
B --> G[最终呈现的网页]
D --> G
F --> G
style A fill:#e3f2fd
style C fill:#fff3e0
style E fill:#f3e5f5
```
**一个完整的例子**:
```html
0
```
把这三种代码写在一个 `.html` 文件里,就是**单文件格式**——双击就能运行,不需要安装任何东西。
## 为什么保存的网页有的打不开?
你可能试过用 `Ctrl + S` 保存一个喜欢的网页,再次打开时出现不同情况:
| 现象 | 原因 |
|------|------|
| **完全正常** | 单文件格式,所有代码都在一个 HTML 里 |
| **有样式但点不了** | CSS 在本地,JS 从服务器加载,断网失效 |
| **样式全无** | CSS 和 JS 都从服务器加载,本地只有空壳 |
| **完全打不开** | 现代单页应用,需要服务器才能运行 |
现代网站(如微博、B 站)使用 React/Next.js 等框架开发:代码分离在不同文件,内容通过 JS 动态获取,保存下来的只是一个空 HTML 壳子。
```mermaid
graph LR
A[传统网页] --> B[所有代码
在一个 HTML]
B --> C[保存后可离线打开]
D[现代网页] --> E[代码分离
需要服务器]
E --> F[保存后只有空壳]
```
## 代码格式的四个阶段
```mermaid
graph LR
A["单文件 HTML
(结构+样式+逻辑)"] --> B["分离文件
(HTML+CSS+JS)"]
B --> C["模块化
(import/export)"]
C --> D["TypeScript工程化
(类型+构建)"]
```
::: details 🎮 点击体验:代码格式演变历程
> 💡 **练习**:点击时间轴上的不同阶段,观察代码格式如何从机器语言演变为现代 JavaScript。
>
> 🎯 **核心概念**:代码格式越来越接近人类语言,但运行前需要更多转换步骤。
:::
### 阶段 1:单文件 HTML
所有代码在一个 `.html` 文件中。
**适用场景**:简单 Demo、学习概念、快速原型
**局限**:代码超过 200 行后就难以维护
### 阶段 2:文件分离
结构(HTML)、样式(CSS)、逻辑(JS)分开:
```
project/
├── index.html
├── style.css
└── script.js
```
**适用场景**:代码超过 200 行,或多个页面共享样式
**局限**:文件依赖关系需要手动管理,无法使用 npm 包
### 阶段 3:模块化
使用 `import`/`export` 组织代码:
```javascript
// utils.js
export function formatDate(date) {
return date.toISOString();
}
// app.js
import { formatDate } from './utils.js';
```
**适用场景**:代码有重复逻辑,或多人协作
**局限**:浏览器需要构建工具支持
### 阶段 4:TypeScript 工程化
使用 TypeScript + 构建工具:
```typescript
// utils.ts
export function formatDate(date: Date): string {
return date.toISOString();
}
```
**适用场景**:复杂逻辑、多人协作、长期维护的项目
**为什么 AI 喜欢用 TypeScript?**
- 类型系统减少错误
- AI 更擅长生成类型安全的代码
- 现代前端开发的标配
::: danger TypeScript 不能直接运行
TypeScript 代码**不能直接在浏览器运行**,必须经过编译:
```
.ts/.tsx 文件 → TypeScript 编译器 → .js 文件 → 浏览器执行
```
**开发时**:`pnpm dev` 自动编译
**上线时**:`pnpm build` 打包优化
:::
## 如何选择代码格式
| 项目复杂度 | 推荐格式 | 运行方式 |
|------------|----------|----------|
| 简单 Demo、一次性脚本 | 单文件 HTML | 直接打开 |
| 中小型项目 | 模块化 JS | 需要 build |
| 复杂应用、多人协作 | TypeScript + 框架 | 需要 dev server |
**原则**:能用简单方案就不用复杂方案,但不要在复杂项目上强行用简单方案。
让 AI 知道你的需求,它会选择合适的格式:
```
"生成一个单文件 HTML 的计数器" → 单文件,双击可运行
"生成一个任务管理应用" → TypeScript 项目,需要 pnpm dev
```
## 常见问题
### Q1: TypeScript 和 JavaScript 有什么区别?
TypeScript 是 JavaScript 的升级版,增加了类型检查。
```typescript
// TypeScript 写代码时会指出错误
const count: number = "hello"; // ❌ 编辑器标红
// JavaScript 要运行后才报错
const count = "hello";
count.toFixed(2); // 💥 运行时崩溃
```
你不需要记住语法,只需要知道:
- `.ts` 或 `.tsx` 文件需要通过 `pnpm dev` 运行
- 看到 `: string` 这种类型标注时,知道这是 TypeScript 即可
### Q2: 为什么不一直用单文件 HTML?
复杂项目用单文件无法维护。想象一个 1000 行的 HTML 文件,修改样式需要在 500 行处找对应的 `