E21. Node.js 基础
1.1. 🌟 Node.js 环境与 REPL 交互式调试
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,支持直接在命令行中执行 JavaScript 代码。通过 REPL(交互式解释器)可以快速验证代码逻辑。
启动 REPL 环境
bash
node
REPL 基础操作
javascript
// 示例:执行简单计算
> 1 + 2 + 3
6
// 声明变量(需使用 var/let/const)
> let name = 'Node.js'
undefined
> console.log(name)
Node.js
// 多行输入(自动识别代码块)
> if (true) {
... console.log('多行输入');
... }
多行输入
// 特殊命令
> .help // 查看命令列表
> .exit // 退出 REPL
TIP
- 使用
Ctrl+C
退出当前操作,Ctrl+D
退出 REPL。 - 输入
_.toString()
可查看上一个表达式结果的详细信息。
1.2. 🌟 Node.js 遵循 ES 规范但不具备 Web API
Node.js 支持现代 JavaScript(ES)语法,但缺少浏览器提供的 Web API(如 DOM、BOM)。
ES 规范支持
javascript
// ES6+ 语法示例(需使用 .mjs 文件扩展名)
// demo.mjs
import { sqrt } from 'mathjs';
console.log(sqrt(16)); // 输出 4
Web API 缺失场景
javascript
// 以下代码在 Node.js 中无法运行
// window、document、navigator 等全局对象不存在
console.log(window.innerWidth); // 报错
WARNING
Node.js 环境的全局对象是 global
,而非浏览器的 window
。
1.3. 🌟 util 模块:弥补 Web API 的缺失
util
模块提供工具函数,帮助处理 Node.js 环境中的常见需求(如日志格式化、类型检查)。
常用功能示例
javascript
// util.mjs
import util from 'util';
// 1. 检查数据类型
console.log(util.types.isNumber(42)); // true
// 2. 转换流为 Promise
const stream = { ... };
const promisified = util.promisify(stream.read);
日志增强示例
javascript
// 使用 util.inspect 格式化输出复杂对象
const obj = { a: 1, b: { c: 2 } };
console.log(util.inspect(obj, { depth: null }));
1.4. 🌟 path 和 fs 模块:文件系统操作
path
处理文件路径,fs
操作文件系统,两者协同完成文件读写。
path 模块:路径处理
javascript
// path-example.mjs
import path from 'node:path';
const filePath = path.join(__dirname, 'data', 'file.txt');
console.log(path.basename(filePath)); // 输出 'file.txt'
fs 模块:异步文件读写
javascript
// fs-example.mjs
import fs from 'node:fs';
// 异步读取文件
fs.promises.readFile('file.txt', 'utf-8')
.then(data => console.log(data))
.catch(err => console.error(err));
// 同步写入文件(慎用阻塞操作)
fs.writeFileSync('output.txt', 'Hello Node.js');
例:创建目录并写入文件
javascript
import { mkdir, writeFile } from 'node:fs/promises';
import path from 'node:path';
const dirPath = path.join(__dirname, 'new_dir');
await mkdir(dirPath, { recursive: true });
await writeFile(path.join(dirPath, 'test.txt'), '内容');
1.5. 🌟 process 模块:进程管理与环境变量
process
模块提供对 Node.js 进程的控制,包括环境变量、内存监控等。
环境变量操作
javascript
// 获取环境变量
console.log(process.env.NODE_ENV); // 输出 'development'
// 设置环境变量(仅当前进程有效)
process.env.MY_VAR = 'test';
进程生命周期控制
javascript
// 监听进程退出事件
process.on('exit', (code) => {
console.log(`进程退出,状态码 ${code}`);
});
// 主动终止进程
process.exit(1); // 传入退出码
知识回顾
- REPL 核心操作:启动、多行输入、特殊命令(
.exit
、.help
)。 - ES 规范差异:Node.js 支持 ES 语法,但缺少 Web API。
- util 模块功能:类型检查、日志格式化、Promise 转换。
- 文件操作流程:
path
处理路径,fs
读写文件,需注意异步/同步差异。 - process 模块作用:管理环境变量、监听进程事件、控制进程退出。
课后练习
(单选)在 Node.js REPL 中,如何退出当前多行输入?
- A. 按两次
Ctrl+C
- B. 输入
.break
- C. 输入
.exit
- D. 按
Enter
- A. 按两次
(填空)使用
path
模块拼接路径时,应调用的静态方法是______
。(编程)编写一个
.mjs
文件,完成以下操作:- 读取
input.txt
文件内容。 - 将内容反转后写入
output.txt
。
- 读取
参考答案
- B
path.join
javascript
// reverse.mjs
import fs from 'node:fs/promises';
import path from 'node:path';
const inputPath = path.resolve('input.txt');
const outputPath = path.resolve('output.txt');
async function processFile() {
const data = await fs.readFile(inputPath, 'utf-8');
await fs.writeFile(outputPath, data.split('').reverse().join(''));
}
processFile().catch(console.error);