文章目录
Node.js基础概念
Node.js 是一个基于 Chrome V8 JavaScript 引擎构建的 JavaScript 运行时环境。简单来说,Node.js 让JavaScript可以在服务器端运行,而不仅仅局限于浏览器中。
工作机制
Node.js 通过 V8 引擎执行 JavaScript 代码,使用 Node.js API 与操作系统交互,并通过 Libuv 处理异步 I/O 操作。事件循环和工作线程确保了 Node.js 的高效和非阻塞特性。
核心特点
- 单线程:Node.js 使用单线程处理请求
- 事件循环:通过事件驱动机制处理并发
- 非阻塞 I/O:I/O 操作不会阻塞主线程
- 跨平台:可以在 Windows、Linux、macOS 等系统上运行

事件循环是 Node.js 处理非阻塞 I/O 操作的核心机制,使得单线程能够高效处理多个并发请求。
Node.js 是基于单线程的 JavaScript 运行时,利用事件循环来处理异步操作,如文件读取、网络请求和数据库查询。
事件循环使得 Node.js 能够非阻塞地运行代码、处理多个连接、以及执行异步 I/O 操作。
事件循环使得 Node.js 能够处理大量并发的 I/O 操作而不会导致线程阻塞,这是 Node.js 高效处理并发请求的关键。

NVM
nvm(Node Version Manager)是一个非常有用的工具,可以让您在同一台机器上安装和管理多个 Node.js 版本。
常用命令
shell
# 查看 nvm 版本
nvm --version
# 列出所有可安装的 Node.js 版本
nvm list-remote
# Windows 上使用
nvm list available
# 安装最新的 LTS 版本
nvm install --lts
# 安装特定版本
nvm install 18.17.0
nvm install 16.20.1
# 列出已安装的版本
nvm list
# 或
nvm ls
# 切换到特定版本
nvm use 18.17.0
# 设置默认版本
nvm alias default 18.17.0
# 查看当前使用的版本
nvm current
# 卸载特定版本
nvm uninstall 16.20.1
Node.js可以做什么
Node.js 作为一个 JavaScript 的运行环境,提供了基础的模块功能,但基于 Node.js 提供的基础能,产生了很多强大的工具和框架,例如:
- 基于 Express 框架(http://www.expressjs.com.cn/),可以快速构建 Web 应用
- 基于 Electron 框架(https://electronjs.org/),可以构建跨平台的桌面应用
- 基于 restify 框架(http://restify.com/),可以快速构建 API 接口项目
- 读写和操作数据库、创建实用的命令行工具辅助前端开发等
模块化
CommonJS标准
CommonJS 是 Node.js 最早也是最广泛使用的模块系统,它采用同步加载的方式,这意味着模块在加载时会阻塞程序的执行,直到加载完成。一般应用在 Node.js 项目环境中。
在 CommonJS 中,你使用 require() 函数来导入模块,使用 module.exports 或 exports 对象来导出模块。
导出方式:module.exports = {}
javascript
// math.js
function add(a, b) {
return a + b;
}
module.exports = { add };
// 或者:exports.add = add;
导入方式:require('模块名或路径')
javascript
// app.js
const math = require('./math.js');
console.log(math.add(2, 3)); // 5
ECMAScript标准
ESM是 JavaScript 官方的模块标准,它采用异步加载,并且是浏览器和现代 Node.js 应用的首选。一般应用在前端工程化项目中。
启用 ESM:要在 Node.js 中使用 ESM,你需要在 package.json 文件中添加 "type": "module",或者将文件扩展名更改为 .mjs。
在 ESM 中,你使用 import 语句来导入模块,使用 export 语句来导出模块。
导出方式:默认export default {},或export 修饰定义语句
javascript
// math.mjs
export function add(a, b) {
return a + b;
}
export default function multiply(a, b) {
return a * b;
}
导入方式:默认import 变量名 from '模块名或路径',或 import { 同名变量} from '模块名或路径'
javascript
// app.mjs
import multiply, { add } from './math.mjs';
console.log(add(2, 3)); // 5
console.log(multiply(2, 3)); // 6
包与npm
包是将模块,代码,其他资料聚合成一个文件夹
要求根目录中,必须有package.json 文件,导入软件包时,引入的默认是index.js 模块文件,或者 main 属性指定的模块文件
npm是Node.js的标准软件包管理器
shell
# 初始化清单文件(得到package.json 文件,有则略过此命令)
npm init -y
# 下载软件包,下载的包会存放当前项目下的node_modules中,并记录在package.json 中
npm i 软件包名称
# 全局软件包
# 本地软件包:作用在当前项目,一般封装的属性/方法,供项目调用编写业务需求
# 全局软件包:作用在所有项目,一般封装的命令/工具,支撑项目运行
npm i 软件包名称 -g
# 删除软件包
npm uni 软件包名
内置模块
内置模块详细参考官方API文档:https://nodejs.cn/api/documentation.html
fs (文件系统模块)
fs 模块提供了与文件系统交互的 API,支持同步和异步两种操作方式。
javascript
const fs = require('fs');
// 异步读取文件
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
// 同步写入文件
try {
fs.writeFileSync('output.txt', 'Hello Node.js');
console.log('文件写入成功');
} catch (err) {
console.error(err);
}
path (路径模块)
path 模块提供处理文件和目录路径的工具函数,可以跨平台使用。
javascript
const path = require('path');
const fullPath = path.join(__dirname, 'files', 'example.txt');
console.log(fullPath); // 输出类似: /home/user/project/files/example.txt
const ext = path.extname('index.html');
console.log(ext); // 输出: .html
http (HTTP 模块)
http 模块允许 Node.js 作为 HTTP 服务器或客户端运行。
javasript
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello Node.js Server');
});
server.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
events (事件模块)
events 模块提供了事件驱动的编程接口,是 Node.js 异步编程的基础。
javascript
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
// 监听事件
myEmitter.on('event', () => {
console.log('事件被触发!');
});
// 触发事件
myEmitter.emit('event');
os (操作系统模块)
os 模块提供与操作系统相关的实用方法和属性。
javascript
const os = require('os');
console.log(os.platform()); // 操作系统平台
console.log(os.totalmem()); // 系统总内存
console.log(os.freemem()); // 系统可用内存
console.log(os.cpus()); // CPU 信息