第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没有这个限制,但它也没有documentalert这些浏览器专属的东西。

怎么用——对比一下:

// 浏览器里:弹出一个提示框
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程序。

怎么装

  1. 打开 https://nodejs.org
  2. 看到两个绿色大按钮,别犹豫,点左边那个 LTS(长期支持版)
  3. 下载完双击,一路点「下一步」就行

装完验证一下:

# 在终端(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写的第一个程序。

配图1 - 配图1

⚠️ 坑来了:文件名不要用node.js(会和系统命令冲突),要用hello.jsapp.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内置的文件读取函数,parseIntparseFloat是把字符串转成数字(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")。

配图2 - 配图2


💪 进阶 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坑?评论区聊聊,老粉优先回复!下一章我们会讲 REPL 和脚本模式,教你两种不同的运行Node.js代码的方式。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。