Node.js 基础概念
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时,允许在服务器端运行 JavaScript 代码。它是单线程、非阻塞 I/O 模型,适合构建高性能、轻量级的网络应用。以下是 Node.js 的基础概念,用简洁的中文讲解:
1. Node.js 的核心特点
- 异步非阻塞 I/O:Node.js 使用事件驱动模型,I/O 操作(如读写文件、网络请求)是异步的,不会阻塞主线程,适合高并发场景。
- 单线程:Node.js 主线程是单线程的,但通过事件循环(Event Loop)和工作线程池处理异步任务。
- 模块化:Node.js 使用 CommonJS 模块系统,通过
require
导入模块,module.exports
导出模块。 - 跨平台:可在 Windows、macOS、Linux 上运行。
2. 事件循环(Event Loop)
事件循环是 Node.js 的核心机制,负责处理异步操作。流程如下:
- 事件队列:异步任务(如定时器、I/O 操作)完成后,回调函数被放入事件队列。
- 事件循环:主线程不断检查事件队列,执行回调。
- 阶段:事件循环分为多个阶段(如定时器、I/O 回调、setImmediate 等),按顺序处理。
示例:
setTimeout(() => {
console.log("定时器回调");
}, 1000);
console.log("同步代码先执行");
输出:先打印“同步代码先执行”,1秒后打印“定时器回调”。
3. 模块系统
Node.js 使用 CommonJS 模块化机制:
- 导入模块:使用
require
加载内置模块、第三方模块或自定义模块。
const fs = require("fs"); // 内置模块
const myModule = require("./myModule"); // 自定义模块
- 导出模块:使用
module.exports
或exports
。
// myModule.js
module.exports = {
sayHello: () => console.log("Hello!");
};
4. 内置模块
Node.js 提供许多内置模块,无需额外安装。常用模块包括:
- fs(文件系统):读写文件。
const fs = require("fs");
fs.readFile("file.txt", "utf8", (err, data) => {
if (err) throw err;
console.log(data);
});
- http:创建 HTTP 服务器。
const http = require("http");
const server = http.createServer((req, res) => {
res.end("Hello, Node.js!");
});
server.listen(3000);
- path:处理文件路径。
const path = require("path");
console.log(path.join(__dirname, "file.txt"));
5. NPM(Node Package Manager)
- 作用:Node.js 的包管理工具,用于安装和管理第三方模块。
- 常用命令:
- 初始化项目:
npm init
- 安装模块:
npm install <package>
- 全局安装:
npm install -g <package>
- package.json:记录项目依赖和元信息。
6. 异步编程
Node.js 的异步编程主要依赖以下方式:
- 回调函数:传统方式,可能导致“回调地狱”。
fs.readFile("file.txt", (err, data) => {
if (err) throw err;
console.log(data);
});
- Promise:更优雅的异步处理。
const fs = require("fs").promises;
async function readFile() {
try {
const data = await fs.readFile("file.txt", "utf8");
console.log(data);
} catch (err) {
console.error(err);
}
}
readFile();
- async/await:基于 Promise 的语法糖,代码更简洁。
7. 全局对象
Node.js 没有浏览器的 window
或 document
,但提供全局对象:
process
:提供运行时信息,如环境变量。
console.log(process.env.NODE_ENV);
__dirname
和__filename
:当前模块的目录路径和文件路径。setTimeout
、setInterval
:与浏览器类似,用于定时任务。
8. 常用场景
- Web 服务器:使用 Express 或 Koa 框架快速搭建。
- 命令行工具:Node.js 可开发 CLI 工具。
- 实时应用:如聊天室、在线游戏,结合 WebSocket。
示例:简单 HTTP 服务器
const http = require("http");
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader("Content-Type", "text/plain");
res.end("Hello, Node.js World!\n");
});
server.listen(3000, () => {
console.log("服务器运行在 http://localhost:3000/");
});
9. 调试与错误处理
- try-catch:捕获同步错误。
- Error 对象:处理异步错误。
- 调试工具:Node.js 内置调试器或 VS Code 调试插件。
10. 学习建议
- 熟悉异步编程,掌握 Promise 和 async/await。
- 学习 Express 框架,快速开发 Web 应用。
- 阅读 Node.js 官方文档,了解内置模块。
- 使用 npm 探索第三方模块。
如果需要深入讲解某个部分(例如事件循环、Express 或具体模块),请告诉我!