第一章:Node.js 基础与环境搭建

各位同学好,我是你们这门课的老师。在正式开始之前,我想先聊聊 Node.js 到底是什么。说白了,Node.js 就是让 JavaScript 跑在服务器上的一个运行时环境。你想想看,以前 JavaScript 只能在浏览器里玩,现在好了,咱们可以用它来写后端、搭 API,甚至做命令行工具。

我个人第一次接触 Node.js 是在 2015 年,那时候它刚火起来。我记得当时有个项目要用实时推送功能,用 PHP 做长轮询简直要命。后来换成 Node.js,几行代码就搞定了。嗯,从那以后我就成了 Node.js 的忠实用户。

1.1 Node.js 简介

Node.js 基于 Chrome 的 V8 引擎,采用事件驱动、非阻塞 I/O 模型。什么意思呢?就是它特别擅长处理高并发、I/O 密集型的任务。比如聊天应用、API 网关、实时数据推送这些场景,Node.js 简直是天生的好手。

但要注意,Node.js 不适合 CPU 密集型的任务。比如图像处理、视频编码这些,你硬要用 Node.js 做,性能会很难看。我在项目中遇到过有人用 Node.js 做大规模数据排序,结果 CPU 跑满,请求全堵住了。后来改成用 Worker Threads 才解决。

核心特点:

  • 单线程 + 事件循环
  • 非阻塞异步 I/O
  • 跨平台(Windows、macOS、Linux)
  • 丰富的 npm 生态

1.2 安装与版本管理

安装 Node.js 其实很简单,但版本管理是个坑。我建议你直接用 nvm(Node Version Manager),而不是去官网下载安装包。为什么?因为项目多了,不同项目依赖的 Node 版本可能不一样。你想想看,一个项目用 14.x,另一个用 18.x,来回切换多麻烦。

我曾经因为版本问题吃过亏。有个老项目跑在 Node 12 上,我本地装的是 16,结果一跑就报错。查了半天,发现是某个原生模块不兼容。从那以后,我就老老实实用 nvm 了。

安装 nvm(macOS/Linux)

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash

安装 nvm(Windows)

Windows 用户可以用 nvm-windows,去 GitHub 下载安装包就行。

常用命令

# 查看可安装的版本
nvm ls-remote

# 安装指定版本
nvm install 18.16.0

# 切换版本
nvm use 18.16.0

# 设置默认版本
nvm alias default 18.16.0

小技巧:我习惯在项目根目录放一个 .nvmrc 文件,里面写上版本号。这样团队成员切到项目目录时,执行 nvm use 就能自动切换到正确版本。

1.3 npm/yarn 包管理器

Node.js 自带的包管理器是 npm,但很多人更喜欢用 yarn。我个人两个都用,但说实话,现在 npm 已经进步很多了,日常开发完全够用。

npm 和 yarn 的核心功能是一样的:安装、更新、删除依赖包。但有几个细节要注意:

功能 npm yarn
初始化项目 npm init yarn init
安装依赖 npm install yarn install
添加依赖 npm install <包名> yarn add <包名>
删除依赖 npm uninstall <包名> yarn remove <包名>
锁定版本 package-lock.json yarn.lock

这里有个坑要提醒你:永远不要手动修改 node_modules 目录。我曾经图省事,直接改了 node_modules 里的某个文件,结果下次 npm install 全被覆盖了。正确的做法是用 patch-package 或者 fork 项目。

避坑指南:我曾经在团队里遇到过依赖版本不一致的问题。两个人用同一个 package.json,但一个用 npm 一个用 yarn,锁文件不同,导致安装的版本不一样。后来我们统一用 yarn,才解决了这个问题。

1.4 第一个 Node.js 程序

好了,理论说完了,咱们来写点实际的。第一个程序当然是经典的 "Hello World",但咱们稍微加点料。

创建项目目录

mkdir my-first-node-app
cd my-first-node-app

初始化项目

npm init -y

这个命令会生成一个 package.json 文件。你打开看看,里面就是项目的基本信息。嗯,这里要注意,name 字段不能有中文和空格,否则后面会报错。

编写代码

创建一个 index.js 文件:

// index.js
const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello, Node.js!\n');
});

const PORT = 3000;
server.listen(PORT, () => {
  console.log(`Server running at http://localhost:${PORT}/`);
});

运行程序

node index.js

打开浏览器,访问 http://localhost:3000,你应该能看到 "Hello, Node.js!"。就这么简单,你已经跑起来一个 HTTP 服务器了。

小提示:如果你改了代码,需要重启服务器才能生效。开发时可以用 nodemon 这个工具,它会自动监听文件变化并重启。安装命令:npm install -g nodemon,然后运行 nodemon index.js

1.5 本章小结

这一章我们走了一遍 Node.js 的基础流程。从安装、版本管理,到包管理器,再到第一个程序。你想想看,其实门槛并不高。但基础打牢了,后面学 GraphQL 才会顺手。

下一章我们会深入 Node.js 的模块系统,讲讲 CommonJS 和 ES Module 的区别。嗯,那个话题有点绕,但我会用实际例子讲清楚。

最后说一句:别怕犯错。我写 Node.js 这么多年,踩过的坑比你们走过的路还多。关键是每次踩坑后要总结,下次别再掉进去。