---
title: "4.0 代码运行的三种状态"
description: "理解 Dev、Build、Production 三种运行模式"
chapter: "第四章"
priority: "🟢"
---

# 4.0 代码运行的三种状态 🟢

> **阅读完本节后，你将会收获：**
> - 理解代码的三种运行模式
> - 掌握 package.json 的作用
> - 了解热重载和缓存机制
> - 避免常见的运行环境错误

> 代码有三种"生命状态"：Dev（开发）、Build（构建）、Production（生产）。理解它们的区别，是避免"改了代码没效果"这类困惑的关键。

---

## 三种状态

<BuildModesSimulator />

### Dev（开发模式）

`pnpm dev` 启动的就是开发模式。它就像是**打草稿**：

- 保存代码后浏览器自动更新
- 支持热重载，表单内容不会丢失
- 包含详细的报错信息，方便调试
- 运行速度较慢

**适用场景**：日常开发调试

### Build（构建模式）

`pnpm build` 执行构建。这个过程就像是**把草稿排版印刷成书**：

- 压缩代码体积
- 优化运行速度
- 生成 `.next` 或 `dist` 文件夹
- 去除调试信息

**适用场景**：准备上线前

### Production（生产模式）

`pnpm start`（或 `next start`）运行构建后的版本。这是在本地**模拟正式上线环境**：

- 运行构建后的代码
- 性能最优
- 没有热重载

**适用场景**：上线前最后检查

```mermaid
graph LR
    A[编写代码] --> B[Dev 模式<br/>pnpm dev]
    B --> C[Build 构建<br/>pnpm build]
    C --> D[Production 模式<br/>pnpm start]
    D --> E[部署到服务器]

    style B fill:#e1f5fe
    style C fill:#fff3e0
    style D fill:#e8f5e9
```

---

## 热重载

在 Dev 模式下，保存文件后浏览器会自动更新。这叫**热重载（Hot Reload）**。

开发工具在后台监听文件变化，检测到修改后自动刷新浏览器或只更新改动的部分。这让你不需要每次手动刷新。

但在 Build 或 Production 模式下，代码已经打包，没有监听机制，修改后需要重新构建。

---

## package.json

**为什么输入 `pnpm dev` 就能启动项目？**

打开根目录的 `package.json`，这是 Node.js 项目的**核心配置文件**：

### Scripts（脚本）

定义了项目常用的运行命令：

```json
{
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start"
  }
}
```

当输入 `pnpm dev` 时，包管理器会查表，发现它对应的是 `next dev` 命令并执行。

你也可以自定义命令，比如修改端口避开拥挤的 3000：

```json
{
  "dev": "next dev -p 4000"
}
```

### Dependencies（依赖）

记录项目需要的第三方库及版本号：

```json
{
  "dependencies": {
    "next": "^16.0.0",
    "react": "^19.0.0",
    "drizzle-orm": "^0.36.0"
  }
}
```

这确保其他人通过 `pnpm install` 安装一模一样的库，完美还原开发环境。

---

## 构建产物

构建完成后，会在 `.next`（Next.js）或 `dist`（Vite）文件夹生成产物。

但你不能直接双击打开这些文件。Next.js 本质上是运行在 Node.js 上的**程序**，需要服务器环境支持——连接数据库、处理 API 请求、服务端渲染页面。

即使纯静态项目（Vite 打包），通常也不能直接双击打开。现代应用使用**绝对路径**引用资源，双击打开使用 **file:// 协议**会导致浏览器找不到资源。

![image-20260226235036212](/images/Advanced/image-20260226235036212.png)

::: tip 正确的访问方式

永远通过 Web 服务器访问应用：
- Next.js：`pnpm start`
- Vite：`pnpm preview`

不要直接双击构建后的文件。

:::

---

## 缓存问题

### 浏览器缓存

在 Production 模式或访问已部署的网站时，可能会遇到缓存导致的怪事。比如按钮改了颜色但刷新后没变化。

**解决方法**：
- 强制刷新：`Ctrl + Shift + R`
- 无痕模式打开
- 开发者工具 Network 选项卡勾选 "Disable cache"

![image-20260226235149160](/images/Advanced/image-20260226235149160.png)

### 构建缓存

如果强制刷新还不行，可能是构建缓存问题。删除 `.next` 目录后重新 `pnpm build`。

### 环境变量缓存

环境变量是存放在代码之外的配置信息——就像手机的"设置"：应用本身不变，但你可以通过设置调整它的行为（深色模式、语言偏好等）。在开发中，环境变量通常存放在 `.env` 文件里，程序启动时读取。

修改 `.env` 文件后**必须重启服务**（Ctrl+C 然后 `pnpm dev`），环境变量才会生效。因为环境变量在进程启动时加载，运行中修改文件不会自动更新。

---

## 本节核心要点

- ✅ Dev 模式用于日常开发，支持热重载
- ✅ Build 构建生产版本，优化性能
- ✅ Production 模式模拟正式环境
- ✅ package.json 管理脚本和依赖
- ✅ 不能直接双击打开构建产物
- ✅ 遇到问题先考虑缓存
- ✅ 修改环境变量必须重启服务

理解了代码运行的三种状态，接下来了解技术栈选择的决策框架。

---

## 相关内容

- 详见：[4.1 技术栈决策框架](./01-tech-stack-decision.md)
