Skip to content

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); // 传入退出码

知识回顾

  1. REPL 核心操作:启动、多行输入、特殊命令(.exit.help)。
  2. ES 规范差异:Node.js 支持 ES 语法,但缺少 Web API。
  3. util 模块功能:类型检查、日志格式化、Promise 转换。
  4. 文件操作流程path 处理路径,fs 读写文件,需注意异步/同步差异。
  5. process 模块作用:管理环境变量、监听进程事件、控制进程退出。

课后练习

  1. (单选)在 Node.js REPL 中,如何退出当前多行输入?

    • A. 按两次 Ctrl+C
    • B. 输入 .break
    • C. 输入 .exit
    • D. 按 Enter
  2. (填空)使用 path 模块拼接路径时,应调用的静态方法是 ______

  3. (编程)编写一个 .mjs 文件,完成以下操作:

    • 读取 input.txt 文件内容。
    • 将内容反转后写入 output.txt
参考答案
  1. B
  2. 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);

扩展阅读

Built by Vitepress | Apache 2.0 Licensed