第1章 1.1 Node.js 是什么与安装配置
🎯 为什么要学这个?
你有没有遇到过这种情况——
想在电脑里自动处理一堆文件,比如把100张图片按日期重命名,或者把Excel里的数据自动整理成报告。网上搜了一堆Python脚本,发现根本跑不起来,报一堆看不懂的错。
又或者,你想做一个自己的小工具,能帮自己每天自动查天气、发邮件、抢票,但不知道从哪下手。
说白了,你缺的不是编程基础,你缺的是一个能真正在电脑上跑起来、跟文件和网络打交道的「运行环境」。
这就是 Node.js。
学完这一章,你会在自己的电脑上装好 Node.js,写出第一个能真正运行的程序,知道它和浏览器里的JavaScript有什么区别。下 一章我们会用它来处理更复杂的事情——比如自动读取文件、批量处理数据。
🧱 基础 25 分钟:Node.js 是个啥?
概念 1:Node.js 是什么?
是什么:Node.js 是一个运行JavaScript的「环境」或者「平台」。就像Python解释器能跑Python代码一样,Node.js能跑JavaScript代码。
生活类比:你可以把Node.js想象成一个「万能翻译器」。不管你是用JavaScript写的程序,它都能帮你翻译成电脑能听懂的话,让电脑帮你干活。
为什么用它:以前JavaScript只能在浏览器里跑,只能操作网页。Node.js让JavaScript脱离了浏览器,能读取电脑里的文件、连接网络、跟数据库打交道——也就是能做「后端开发」了。
怎么用:
// 这是一行普通的JavaScript
console.log("Hello, Node.js!");
运行结果是:
Hello, Node.js!
这行代码就是在终端里输出一句话,跟Python的print()差不多。
概念 2:Node.js 和浏览器里的JavaScript有什么区别?
是什么:浏览器里的JavaScript是「网页的语言」,负责网页上的按钮、动画、表单验证。Node.js里的JavaScript是「电脑的语言」,负责读写文件、操作数据库、跑服务器。
生活类比:就好比「普通话」和「各地方言」的关系。都是JavaScript这门「语言」,但在「北京」(浏览器)和「上海」(Node.js)说的时候,能干的事不一样。
为什么区分它:浏览器有安全限制,不能直接操作你电脑里的文件。Node.js没有这个限制,但它也没有document、alert这些浏览器专属的东西。
怎么用——对比一下:
// 浏览器里:弹出一个提示框
alert("你好!");
// Node.js里:输出一句话到终端
console.log("你好!");
注意!在Node.js里没有alert(),只有console.log()。这是最常见的坑。
概念 3:LTS 版本是什么?
是什么:LTS = Long Term Support,意思是「长期支持版」。就像手机的稳定版系统,更新慢,但用起来不容易出bug。
为什么用它:Node.js版本更新很快,但新版本往往有各种奇奇怪怪的bug。企业开发都用LTS版,稳!
怎么选:去官网看到一堆版本号,别慌。选那个标着「LTS」的就行。
# 查看当前安装的Node.js版本
node -v
# 查看npm版本(npm是Node.js的「应用商店」,后面会讲)
npm -v
运行结果大概是这样:
v20.10.0
10.2.4
版本号前面的v不用管,后面的数字意思是:主版本号.次版本号.修订号。LTS版本一般是偶数次版本号(18、20、22)。
概念 4:nvm 多版本管理(选学)
是什么:nvm = Node Version Manager,就是帮你同时装多个版本Node.js的工具。就像Python的pyenv。
为什么用它:有时候你的旧项目用的是Node 14,新项目用的是Node 20,总不能来回重装吧?nvm让你一键切换。
怎么用:
# 安装nvm(mac/linux,在终端运行)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
# 安装最新的LTS版本
nvm install --lts
# 切换到LTS版本
nvm use --lts
# 查看已安装的版本
nvm ls
运行结果:
-> v20.10.0
v18.19.0
v16.20.2
default -> v20.10.0
Windows用户可以用 nvm-windows,安装方式一模一样。
⚠️ 注意! 如果你用的是Windows,直接去 https://github.com/coreybutler/nvm-windows/releases 下载安装包装上就行,不用折腾命令。
概念 5:Node.js 安装(手把手)
是什么:在官网下载安装包,双击安装,跟装QQ一样简单。
为什么装:装完就有node命令了,能跑JavaScript程序。
怎么装:
- 打开 https://nodejs.org
- 看到两个绿色大按钮,别犹豫,点左边那个 LTS(长期支持版)
- 下载完双击,一路点「下一步」就行
装完验证一下:
# 在终端(mac是「终端」,win是「PowerShell」或「CMD」)输入:
node -v
npm -v
看到版本号就说明装好了:
v20.10.0
10.2.4
💡 小贴士:Mac用户如果遇到「无法打开,因为无法确认开发者身份」,去「系统偏好设置 → 安全性与隐私 → 仍要打开」。
概念 6:第一个Hello World
是什么:写一个.js文件,让Node.js跑起来。
为什么学:这是Node.js的「Hello World」,是你用Node.js跟电脑说的第一句话。
怎么写:
新建一个文件叫 hello.js(用记事本、VS Code都行),内容是:
// 我的第一个Node.js程序
// 2024年 by 小明
const message = "Hello, Node.js! 我会编程了!";
console.log(message);
// 再来一行
console.log("这是第二行输出");
然后打开终端,cd到文件所在目录,运行:
node hello.js
输出:
Hello, Node.js! 我会编程了!
这是第二行输出
恭喜你!这是你用Node.js写的第一个程序。

⚠️ 坑来了:文件名不要用
node.js(会和系统命令冲突),要用hello.js、app.js这种。
🔥 实战 35 分钟:3 个小项目
项目 1(5分钟):个人信息卡片
跟着抄就能跑,理解console.log和数据输出。
// 项目1:个人信息卡片
// 1分钟抄完,秒懂Node.js输出
const name = "小明";
const age = 18;
const hobby = "编程";
const today = new Date().toLocaleDateString();
console.log("========== 个人信息卡片 ==========");
console.log("姓名:" + name);
console.log("年龄:" + age);
console.log("爱好:" + hobby);
console.log("日期:" + today);
console.log("===================================");
输出:
========== 个人信息卡片 ==========
姓名:小明
年龄:18
爱好:编程
日期:2024/1/15
===================================
一句话解释:我们定义了一些变量,然后用console.log()把它们拼接输出。+在这里是「连接字符串」的意思。
项目 2(15分钟):读取并统计CSV数据
从CSV文件读取数据,统计一下。这是个真实场景——比如你有个销售记录,要算总金额。
先创建一个sales.csv文件:
商品,数量,单价
苹果,5,3
香蕉,2,2
橘子,10,1.5
然后创建分析脚本analyze.js:
// 项目2:读取CSV文件并统计
// 读取销售记录,计算总销售额
const fs = require('fs');
// 读取CSV文件
const data = fs.readFileSync('sales.csv', 'utf-8');
console.log("原始数据:");
console.log(data);
// 分割行
const lines = data.trim().split('\n');
console.log("\n共有 " + (lines.length - 1) + " 条销售记录\n");
// 跳过表头,从第二行开始遍历
let total = 0;
for (let i = 1; i < lines.length; i++) {
const columns = lines[i].split(',');
const product = columns[0];
const quantity = parseInt(columns[1]);
const price = parseFloat(columns[2]);
const subtotal = quantity * price;
total += subtotal;
console.log(product + " 小计:" + subtotal + " 元");
}
console.log("\n===== 销售总额:" + total.toFixed(2) + " 元 =====");
输出:
原始数据:
商品,数量,单价
苹果,5,3
香蕉,2,2
橘子,10,1.5
共有 3 条销售记录
苹果 小计:15 元
香蕉 小计:4 元
橘子 小计:15 元
===== 销售总额:34.00 元 =====
一句话解释:fs.readFileSync是Node.js内置的文件读取函数,parseInt和parseFloat是把字符串转成数字(CSV里的数据都是字符串)。
💡 小贴士:
toFixed(2)是让数字保留2位小数,看起来更整齐。
项目 3(15分钟):批量重命名文件小工具
把一个文件夹里的文件按「序号_原名」的方式重命名。很实用对吧?
先创建一个files文件夹,里面随便放几个.txt文件(叫什么名字都行)。
然后创建rename.js:
// 项目3:批量重命名文件
// 把 files 文件夹里的文件重命名为 001_原名.txt
const fs = require('fs');
const path = require('path');
const folderPath = './files';
// 读取文件夹内容
const files = fs.readdirSync(folderPath);
console.log("文件夹里有 " + files.length + " 个文件:");
console.log(files);
// 逐个重命名
let count = 0;
for (let i = 0; i < files.length; i++) {
const oldName = files[i];
// 跳过不是 .txt 的文件
if (!oldName.endsWith('.txt')) {
continue;
}
// 拼接新名字(001, 002, 003...)
const newName = String(i + 1).padStart(3, '0') + '_' + oldName;
const oldPath = path.join(folderPath, oldName);
const newPath = path.join(folderPath, newName);
// 重命名
fs.renameSync(oldPath, newPath);
console.log(oldName + " → " + newName);
count++;
}
console.log("\n完成!共重命名 " + count + " 个文件");
输出:
文件夹里有 4 个文件:
[ '笔记.txt', '待办.txt', '想法.txt', 'readme.md' ]
笔记.txt → 001_笔记.txt
待办.txt → 002_待办.txt
想法.txt → 003_想法.txt
完成!共重命名 3 个文件
一句话解释:fs.renameSync是重命名/移动文件,path.join是拼接路径(跨系统也能用),padStart(3, '0')是让数字补齐成3位(1变成"001")。

💪 进阶 20 分钟:常见坑 + 性能小贴士
坑1:require 和 import 分不清
❌ 错误示例(用ES6的import语法):
const fs = require('fs'); // 这是CommonJS语法
import fs from 'fs'; // 这是ES6语法,Node.js默认不支持
✅ 正确示例:
// 方法1:用 require(Node.js传统写法,稳)
const fs = require('fs');
// 方法2:用 import,但要先在 package.json 里加 "type": "module"
说白了:Node.js默认用
require,别没事学浏览器用import。
坑2:路径写死
❌ 错误示例:
const data = fs.readFileSync('C:\\Users\\小明\\Desktop\\sales.csv', 'utf-8');
✅ 正确示例:
const data = fs.readFileSync('./sales.csv', 'utf-8');
说白了:路径写死=换台电脑就挂。用
./相对路径,跟脚本放同个文件夹就没事。
坑3:忘记处理异步
❌ 错误示例:
const data = fs.readFile('sales.csv', 'utf-8');
console.log(data); // 此时data可能是undefined,因为readFile是异步的!
✅ 正确示例:
// 方法1:用回调
fs.readFile('sales.csv', 'utf-8', (err, data) => {
if (err) throw err;
console.log(data);
});
// 方法2:用同步版本(简单粗暴)
const data = fs.readFileSync('sales.csv', 'utf-8');
console.log(data);
说白了:Node.js的「读取文件」分两种——
readFile(异步,快但复杂)和readFileSync(同步,慢但简单)。初学先用sync版本,踩坑少了再学异步。
坑4:中文乱码
❌ 错误示例:
const data = fs.readFileSync('sales.csv'); // 没指定编码,中文会乱码
✅ 正确示例:
const data = fs.readFileSync('sales.csv', 'utf-8'); // 指定UTF-8编码
说白了:读文件一定要加
utf-8,不然中文变成乱码。
坑5:忘了初始化 npm
❌ 错误示例:直接写代码,import 第三方包。
✅ 正确示例:
# 先初始化,生成 package.json
npm init -y
# 然后再装包
npm install axios
说白了:
npm init -y就是告诉Node.js「这个文件夹是我的项目」,没它你装不了第三方包。
性能小贴士:流式读取大文件
如果文件有几MB甚至几GB,用readFileSync会卡死电脑。用流式读取,一块一块处理:
const fs = require('fs');
const readStream = fs.createReadStream('bigfile.csv', 'utf-8');
readStream.on('data', (chunk) => {
console.log("读到一块数据:" + chunk.length + " 字节");
});
readStream.on('end', () => {
console.log("读完啦!");
});
调试技巧:console.log 是你最好的朋友
const result = someFunction();
console.log("===== 调试信息 =====");
console.log("result 类型是:" + typeof result);
console.log("result 内容是:" + JSON.stringify(result));
console.log("====================");
说白了:不知道变量是啥?
console.log打出来看看,比任何调试器都管用。
✏️ 练习题
练习 1(2分钟):改个名字
在项目1的基础上,把name改成你自己的名字,运行看看。
- 输入:修改
const name = "小明";改成const name = "小红"; - 预期输出:卡片上显示"小红"
- 提示:就改一行,运行用
node hello.js
练习 2(2分钟):加个判断
在项目1里,加一行代码:如果年龄大于等于18岁,额外输出一行"已成年,可以注册"。
- 输入:加 if 判断
- 预期输出:在年龄后面多一行"已成年..."
- 提示:用
if (age >= 18) { console.log("已成年,可以注册"); }
练习 3(5分钟):统计新数据
新建一个grades.csv,内容是:
姓名,语文,数学
张三,85,92
李四,78,88
王五,95,87
写代码统计每个人的平均分。
- 输入:
grades.csv文件 - 预期输出:显示每个姓名和平均分,最后显示全班平均分
- 提示:跟项目2思路一样,只是计算公式变成
(语文+数学)/2
练习 4(5分钟):串起来
把项目2的「读取CSV」和项目3的「遍历重命名」串起来:读取一个CSV文件,根据文件里的「旧名,新名」映射,批量重命名文件。
- 输入:一个CSV文件,里面有两列:旧文件名,新文件名
- 预期输出:文件被重命名
- 提示:CSV格式可以是
旧名.txt,新名.txt,然后用循环处理
练习 5(5分钟):报错分析
下面这段代码运行后会报错,请分析原因并修复:
const fs = require('fs')
const data = fs.readFileSync('data.csv')
console.log(data.split('\n'))
- 输入:运行上述代码
- 预期输出:报错信息...(你自己跑一下看报错)
- 提示:报错信息大概说的是「 Cannot do X on undefined」,想想是哪个变量是undefined
作业:做一个「章节笔记整理工具」
需求描述:做一个Node.js小工具,能自动整理你这一章的笔记。
功能点:
1. 从一个notes.txt文件读取所有行
2. 统计有多少行、多少个字符
3. 找出包含「坑」或「注意」的行,单独输出
4. 生成一个summary.txt,包含统计信息和重点行
加分项:
1. 支持命令行参数指定文件路径(node app.js notes.txt)
2. 支持中文编码检测
验收标准:
- 能跑起来(node app.js notes.txt)
- 输出正确的统计信息
- summary.txt内容符合预期
- 代码有注释
提交方式:评论区贴代码或GitHub链接
📚 总结 + 资源
本文学到的3个核心点:
1. Node.js是一个能跑JavaScript的「运行环境」,让JS能操作文件和 network
2. 用fs模块读写文件,用require()引入模块,是Node.js开发的基础
3. 写Node.js程序就是:定义变量 → 调模块 → 处理数据 → 输出结果
延伸学习资源:
- Node.js 官方文档(最权威,但有点枯燥)
- 《Node.js实战》- Manning出版社(老牌经典,书里的例子很实用)
- MDN JavaScript 教程(前端同学可以顺便补补JS基础)
互动钩子:
你有没有遇到过「文件路径写死导致换电脑就跑不通」的情况?或者踩过什么奇怪的Node.js坑?评论区聊聊,老粉优先回复!下一章我们会讲 REPL 和脚本模式,教你两种不同的运行Node.js代码的方式。

评论(0)