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

第四章:磨刀不误砍柴工 · 搭建开发环境

4.1 一个可能拯救你无数小时的起点

在上一章的末尾,我们说:“先搭好脚手架,大楼才能盖得高。”

你可能已经迫不及待想看到那些元素方块在屏幕上飞了,我完全理解。但请再给我一点点时间。因为在编程的世界里,有一个残酷的真相:你未来80%的抓狂和崩溃,都不是因为你的代码逻辑错了,而可能是你的开发环境没配好。

想象一下,你要画一幅画。你会随便找张皱巴巴的废纸就开始吗?肯定不会。你会先铺好画布,调好颜料,然后再摆好画架。本章要做的,就是为你未来的所有代码,铺好这张平整、干净、专业的“画布”。

我们今天的任务清单如下:

  1. 确认 Node.js 已准备就绪。
  2. 用 Vite 为我们搭好项目骨架。
  3. 引入 TypeScript,给我们的项目代码加上“安全带”。
  4. 配置路径别名,告别可怕的 ../../../ 地狱。
  5. 跑起来!在浏览器里看到我们的第一个页面。

4.2 第一步:让 Node.js 在你的电脑里住下来

现代前端开发,已经离不开 Node.js 了。它为我们提供了两样至关重要的东西:

  1. npm(Node 包管理器):一个能够安装、卸载、管理无数第三方代码包(比如 React、Vite)的工具。没有它,我们得自己从各个网站下载代码包,然后手动管理它们之间的依赖关系。
  2. 一个JavaScript运行时:它让我们可以直接在终端里执行JS程序,而不是只能在浏览器中。Vite 的构建脚本就是用它来跑的。

如何安装?

我不会在这里贴出一大段安装命令,因为软件的下载链接和安装步骤是会变的。我教你一个通用方法,这个方法能让你学会安装任何工具:

  1. 打开你最熟悉的搜索引擎
  2. 输入关键词Node.js download
  3. 找官网:在搜索结果里,找到网址是 nodejs.org 的那个结果,点进去。“记住,找官网是解决这类问题的第一步”。
  4. 下载长期支持版(LTS):官网首页通常有两个大按钮,一个写着最新版,一个写着LTS。选LTS,它最稳定,问题最少。
  5. 安装:下载完成后,双击安装包,一路点“Next”就行。安装程序会自动帮你把环境变量配置好。

验证是否成功

安装完成后,我们需要验证一下。打开你的命令行终端。怎么打开?Windows 上按 Win + R,输入 cmd 回车;Mac 上按 Command + 空格,输入 Terminal 回车。

然后分别输入以下两条命令,如果能正常显示版本号,就说明成功了:

node -v
# 应显示类似 v18.x.x 或 v24.x.x 的版本号
npm -v
# 应显示类似 9.x.x 或 11.x.x 的版本号

npm 会随着 Node.js 一起安装,所以你不需要额外操作。现在,我们的工具箱里已经有了第一个,也是最基础的工具。

4.3 第二步:让 Vite 在三秒钟内,为我们生成一个项目

接下来,我们需要一个工具来帮我们把项目的“骨架”搭起来。这个骨架包括:基本的目录结构、一个能启动的开发服务器、以及一系列默认的配置文件。这个工具,就是 Vite

你可能会问:“老师,我看网上很多项目都是手动创建文件夹和文件的,为什么我们要用工具?”

问得好。手动创建当然可以,但那就像明明有电钻,你却非要用螺丝刀去钻墙。Vite 这类脚手架工具能帮你做好所有默认的、枯燥的配置工作,让你把精力集中在写代码上,而不是折腾配置文件。善用工具,是专业素养的一部分。

在终端里,我们使用 npm create 命令来调用 Vite 的脚手架:

# 进入你想放项目的目录,比如桌面
cd ~/Desktop

# 用 Vite 创建一个新项目
npm create vite@latest the118-pTable -- --template react-ts

上面这行命令很长,我们把它拆开看看是什么意思:

  • npm create:这是 npm 提供的创建项目的命令。
  • vite@latest:告诉 npm,我要用的创建工具是最新版的 Vite。
  • the118-pTable:这是我们的项目名称,也是文件夹的名字。
  • --:一个分隔符,后面的参数是传给 Vite 的,而不是传给 npm 的。
  • --template react-ts:告诉 Vite,我要用 React + TypeScript 的模板。

当你按下回车,Vite 会快速生成一个文件夹,里面装满了文件。然后,它会提示你进行下一步操作。跟着它做就行:

cd the118-pTable    # 进入项目目录
npm install         # 安装所有依赖包
npm run dev         # 启动开发服务器

最后一个命令执行后,你会看到终端出现一行类似这样的信息:

  VITE v8.x.x  ready in 300 ms

  ➜  Local:   http://localhost:5173/

按住 Ctrl(Mac上是 Command)点击那个链接,或者手动在浏览器里输入 http://localhost:5173/。如果一切顺利,你会看到一个旋转的 React 图标,和一行 “Vite + React” 的文字。

恭喜!你的项目已经跑起来了!

我们现在有了一个可以工作的“毛坯房”。虽然它还很简陋,只有四面墙和一个屋顶,但它是完全属于你的。从这一刻起,你可以用 npm run dev 来启动它,打开浏览器边写代码边看效果。这就是所谓的热更新——你改了代码,网页自动刷新,不需要手动按F5。

4.4 第三步:给我们的代码系上“安全带”——配置 TypeScript

我们的项目模板已经自带了 TypeScript,但我们需要确保它“严格”到让我们受不了。

打开项目根目录下的 tsconfig.app.json 文件(这是 Vite 为了区分应用代码和构建工具代码,而拆分的配置文件)。你会看到一堆配置选项。别怕,我们只需要关注几个关键的:

{
  "compilerOptions": {
    // ... 其他选项
    "strict": true,  // 开启所有严格检查
    "noUnusedLocals": true,  // 定义了但没用的变量,报错
    "noUnusedParameters": true,  // 定义了但没用的函数参数,报错
    "noFallthroughCasesInSwitch": true, // 防止 switch 漏写 break
  }
}

"strict": true 是一个“全家桶开关”,它会开启 TypeScript 所有严格的类型检查。这意味着,你不能再把数字当字符串用了,你不能忘记给变量指定类型,你不能随便写一个不存在的属性。

为什么我们要对自己这么狠?

用TypeScript就像开车系安全带。在低速的时候,你感觉它有点勒,不舒服。但当意外来临时,它是唯一能救你的东西。在我们的代码量从100行涨到1000行、10000行时,TypeScript会在我们每一次粗心大意时,给我们亮起红灯,拒绝编译。这些被它拦截下来的错误,就是我们省下来的、未来调试的时间。

4.5 第四步:告别 ../../../ 地狱——配置路径别名

你有没有看到过这样的代码?

import { foo } from '../../../utils/foo';

那些 ../ 就像羊屎蛋子,一路走一路拉,恶心又难缠。当你的文件结构变深,你会发现你总是在数“我到底在第几层?”。

幸好,我们可以用 路径别名(Path Alias) 来一劳永逸地解决这个问题。

我们的目标是什么?就是把那个又长又臭的相对路径,变成一个清爽、绝对不会搞混的绝对路径,比如:

// 原本的样子
import { foo } from '../../../utils/foo';

// 我们想要的样子
import { foo } from '@/utils/foo';

这里的 @ 就是我们定义的别名,它永远指向项目的 src 目录。这样,无论你当前的文件在哪个深度的子目录里,@/ 都指向同一个根,你再也不用去数那些烦人的 ../ 了。

要实现这个魔法,我们需要在两个地方进行配置,让它们都认识 @ 这个符号。

1. 告诉 TypeScript 编译器:@ 就是 src/

打开 tsconfig.app.json,找到 "compilerOptions",在里面添加 "paths" 配置:

{
  "compilerOptions": {
    // ... 其他配置
    "paths": {
      "@/*": ["./src/*"]
    }
  }
}

这句配置的意思是:“嘿,TypeScript,以后你看到以 @/ 开头的路径,就把它当作相对路径 ./src/ 来处理。”这样,在你写代码时,TypeScript 就能正确地找到文件,不会给你报错了。

2. 告诉 Vite 构建器:@ 就是 src/

TypeScript 只是负责在写代码阶段不报错。但真正把代码打包成能在浏览器里运行的文件的,是 Vite。我们还需要告诉 Vite 这个别名规则,否则它会不认识 @/ 而报错。

打开项目根目录下的 vite.config.ts 文件,把它修改成这样:

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import path from 'path';  // 引入 Node.js 的路径处理模块

export default defineConfig({
  plugins: [react()],
  resolve: {
    alias: {
      // 将 @ 映射到 src 目录
      '@': path.resolve(__dirname, './src'),
    }
  }
})

这里 path.resolve(__dirname, './src') 会动态地计算出你电脑上 src 文件夹的绝对路径,然后把它赋值给 @。现在,Vite 也认识 @/ 了。

测试一下

为了确保配置生效,我们来做一个小实验。在 src 目录下新建一个文件夹 utils,在里面新建一个文件 test.ts,写一行代码:

// src/utils/test.ts
export const hello = 'Hello, THE118!';

然后,打开 src/App.tsx,在顶部用我们的新别名引入它:

import { hello } from '@/utils/test';
console.log(hello);

保存文件。如果浏览器控制台打印出了 Hello, THE118!,而且编辑器没有任何报错,那就说明我们大功告成了!


本章我们完成了从零到一的开发环境搭建。现在,我们拥有了一个用 Vite 启动的、有 TypeScript 严格检查的、路径清爽的前端项目。它就静静地躺在你的电脑里,等待着我们去赋予它生命。

工欲善其事,必先利其器。工具有了,下一步,我们要学习如何像一个专业的工匠一样,保持我们的工作台(代码)整洁、规范。

从下一章开始,我们将引入一系列约束工具:Git 的代码历史管理、ESLint 的代码风格检查、Commitlint 的提交信息规范。它们会让你感觉有点“被束缚”,但请相信我,正是这些束缚,才能让你在未来的复杂项目中,不至于被自己的代码沼泽所淹没。