Node.js核心模块介绍

1. fs 模块

fs(File System)模块允许对文件系统进行操作,提供了文件读写、文件夹操作等功能。fs 支持同步和异步两种 API。

1.1. 常用方法

读取文件:

  • 异步: fs.readFile()

  • 同步: fs.readFileSync()

写入文件:

  • 异步: fs.writeFile()

  • 同步: fs.writeFileSync()

是否存在:

  • fs.existsSync()

读取目录:

  • 异步: fs.readdir()

  • 同步: fs.readdirSync()

1.2. 代码示例 

异步读取文件:

const fs = require('fs');// 异步读取文件内容
fs.readFile('./example.txt', 'utf-8', (err, data) => {if (err) {console.error(err);return;}console.log(data);
});

同步写入文件:

const fs = require('fs');// 同步写入文件内容
fs.writeFileSync('./example.txt', 'Hello, Node.js!');
console.log('文件已写入');

2. path 模块

path 模块提供了一些实用函数来处理和转换文件路径。它是与操作系统无关的,跨平台时会根据系统自动调整路径格式。

2.1. 常用方法

  • path.join():将多个路径拼接成一个路径。

  • path.resolve():将相对路径解析为绝对路径。

  • path.basename():返回路径的最后一部分文件名。

  • path.dirname():返回路径的目录部分。

  • path.extname():返回文件的扩展名。

2.2. 代码示例 

const path = require('path');// 拼接路径
const fullPath = path.join(__dirname, 'files', 'example.txt');
console.log(fullPath);  // /Users/.../files/example.txt// 获取文件名
const fileName = path.basename(fullPath);
console.log(fileName);  // example.txt// 获取扩展名
const ext = path.extname(fullPath);
console.log(ext);  // .txt// 获取绝对路径
const absolutePath = path.resolve('example.txt');
console.log(absolutePath);  // /Users/.../example.txt

3. os 模块

os 模块提供了一些与操作系统相关的实用工具函数,可以获取系统信息、用户信息等。

3.1. 常用方法

  • os.arch():返回操作系统的架构。

  • os.platform():返回操作系统的平台。

  • os.cpus():返回系统的 CPU 信息。

  • os.freemem():返回可用的系统内存。

  • os.totalmem():返回系统的总内存。

  • os.homedir():返回当前用户的主目录。

  • os.uptime():返回系统运行时间,单位秒。

3.2. 代码示例 

const os = require('os');// 获取操作系统架构
console.log(os.arch());  // x64// 获取操作系统平台
console.log(os.platform());  // darwin (macOS) / linux / win32// 获取系统 CPU 信息
console.log(os.cpus());// 获取可用内存和总内存
console.log(`Free memory: ${os.freemem()} bytes`);
console.log(`Total memory: ${os.totalmem()} bytes`);// 获取用户的主目录
console.log(os.homedir());// 获取系统运行时间
console.log(`System uptime: ${os.uptime()} seconds`);

4. process 模块

process 模块提供了与当前 Node.js 进程相关的功能,包括获取环境变量、退出进程、与操作系统交互等。

4.1. 进程的常用场景

  • 获取和设置环境变量。

  • 获取命令行参数。

  • 控制进程的生命周期,比如退出、发送信号等。

4.2. 常用属性与方法

  • process.argv:获取命令行参数。

  • process.env:访问环境变量。

  • process.exit():退出当前进程。

  • process.cwd():获取当前工作目录。

  • process.memoryUsage():获取进程的内存使用情况。

  • process.nextTick():将回调放入下一次事件循环中执行。

4.3. 代码示例

获取命令行参数:

// 运行 node app.js arg1 arg2
console.log(process.argv);  // ['node', 'app.js', 'arg1', 'arg2']

退出进程:

console.log('即将退出进程');
process.exit(0);  // 0 表示成功退出process.exit(1);  // 非零退出码表示出错或异常退出

读取环境变量:

const env = process.env.NODE_ENV || 'development';
console.log(`当前环境是:${env}`);

5. child_process 模块

Node.js 的 child_process 模块提供了创建和管理子进程的功能。它允许从 Node.js 应用程序中执行外部命令、启动其他程序或运行脚本。通过子进程,Node.js 可以在自身的单线程模型中实现并发任务的处理。

5.1. 子进程的常用场景

  • ​​并行执行任务:当有多个任务需要并行处理时,可以使用 spawn() 或 fork() 来创建多个子进程,从而提高应用的并发能力。

  • 执行外部命令或脚本:使用 exec() 来执行外部的 shell 命令、调用外部工具等。

  • 分离任务:如果一个任务可能导致崩溃或阻塞主进程,可以将其放入子进程中运行,以确保主进程的健壮性。

5.2. 子进程模块的常用方法

  • exec():用于执行一个 shell 命令,返回标准输出和标准错误,适合短命令执行。

  • spawn():用于启动一个新的进程,可以与其进行持续的流式通信,适合长时间运行的任务。

  • fork():专门用于创建新的 Node.js 子进程,并允许在父进程和子进程之间传递消息。

5.3. exec() 方法

exec() 是用来执行简单命令的,比如 shell 命令或其他外部脚本。它适合用于执行短时间内返回结果的命令。

const { exec } = require('child_process');// 执行一个 shell 命令
exec('ls -l', (error, stdout, stderr) => {if (error) {console.error(`执行错误: ${error}`);return;}console.log(`标准输出: ${stdout}`);console.error(`标准错误: ${stderr}`);
});

在这个例子中,exec() 执行了一个 ls -l 命令来列出当前目录的文件列表。

5.4. spawn() 方法

spawn() 用于创建一个新进程,并且可以通过数据流与这个进程进行通信。spawn() 适合长时间运行的任务或者需要不断与子进程交互的任务。

const { spawn } = require('child_process');// 启动一个新的进程,执行 `ls -l`
const ls = spawn('ls', ['-l']);// 监听子进程的标准输出
ls.stdout.on('data', (data) => {console.log(`标准输出: ${data}`);
});// 监听子进程的错误输出
ls.stderr.on('data', (data) => {console.error(`标准错误: ${data}`);
});// 监听子进程的退出事件
ls.on('close', (code) => {console.log(`子进程退出,退出码: ${code}`);
});

在这个例子中,spawn() 被用来执行 ls -l 命令,并通过事件监听器处理标准输出、标准错误和进程退出。

5.5. fork() 方法

fork() 是 child_process 中的一个特殊方法,它专门用于创建新的 Node.js 进程,并且允许父子进程之间进行 IPC(进程间通信)。

fork() 启动的子进程是一个独立的 Node.js 进程,且可以通过 message 事件进行消息传递。

假设我们有一个 child.js 文件,内容如下:

// child.js
process.on('message', (msg) => {console.log(`子进程接收到消息: ${msg}`);process.send(`你好,父进程!`);
});

然后,我们在父进程中使用 fork() 来启动这个子进程并与它通信:

// main.js
const { fork } = require('child_process');// 创建一个新的子进程,运行 child.js
const child = fork('./child.js');// 向子进程发送消息
child.send('你好,子进程!');// 接收子进程发来的消息
child.on('message', (msg) => {console.log(`父进程接收到消息: ${msg}`);
});

在这个例子中,父进程启动了 child.js 子进程,并通过 send() 和 message 事件来实现进程间的消息传递。

5.6. spawn() 与 exec() 的区别

exec():

  • 适合执行简单、短命令,如 shell 命令,一次性返回结果。

  • exec() 将整个命令的输出缓存在内存中,可能会导致内存溢出问题。

spawn():

  • 适合执行长时间运行的任务或需要流式处理数据的任务。

  • spawn() 是基于数据流的,输出和输入是通过流的方式处理,不会占用大量内存。

5.7. 总结

  • exec():用于执行外部命令,适合短时间的任务,返回的是标准输出和错误输出。

  • spawn():适用于长时间运行的任务,支持流式数据传输,可以持续监听输出。

  • fork():用于创建新的 Node.js 子进程,允许父子进程之间进行消息传递,是多进程并发任务的常用方式。

6. util.promisify

util.promisify 是 Node.js 提供的一个工具函数,它将传统回调风格的异步函数转换为返回 Promise 的函数。这样可以更方便地使用 async/await 来处理异步操作。

6.1. 常用场景

许多 Node.js 核心模块(如 fs)的异步方法使用回调函数,可以使用 util.promisify 将它们转换为 Promise 风格,以便在现代异步代码中使用。

6.2. 示例代码

使用 util.promisify 将 fs.readFile 转换为 Promise 版本。

const fs = require('fs');
const util = require('util');// 将 fs.readFile 转换为 Promise 风格
const readFile = util.promisify(fs.readFile);// 使用 async/await 读取文件
(async () => {try {const data = await readFile('./example.txt', 'utf-8');console.log(data);} catch (error) {console.error(error);}
})();

通过 promisify,我们可以轻松将任何基于回调的异步函数转换为返回 Promise 的函数,这使得代码更加现代和简洁。

7. 总结

  • fs: 用于文件操作,支持同步和异步 API。

  • path: 提供文件路径处理功能,跨平台支持。

  • os: 提供操作系统相关信息,如平台、内存、CPU。

  • process: 与当前 Node.js 进程交互,获取命令行参数、环境变量等。

  • child_process: 用于创建子进程,执行外部命令或脚本。

  • util.promisify: 将回调风格的异步函数转换为 Promise,便于使用 async/await。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/99167.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/99167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

缓存三大劫攻防战:穿透、击穿、雪崩的Java实战防御体系(二)

第二部分:缓存击穿——热点key过期引发的“DB瞬间高压” 缓存击穿的本质是“某个热点key(高并发访问)突然过期”,导致大量请求在同一时间穿透缓存,集中冲击DB,形成“瞬间高压”。 案例3:电商秒杀…

Linux相关概念和易错知识点(45)(网络层、网段划分)

目录1.网络层(1)IP协议头格式(2)工作流程2.网段划分(1)五类地址(2)回环地址(3)网段的特殊地址(4)网络建设我们前面暂时跳过了网络层&a…

transition(过渡)和animation(动画)——CSS

1.transition过渡可以为一个元素在不同状态之间进行切换时添加过渡效果,实现不同状态间的变化效果。通过触发事件(鼠标悬停、点击等),在两个状态间切换。1.1 使用语法:transition: [property] [duration] [timing-function] [delay];property…

Spring Cloud项目国产化改造MySQL迁移达梦数据库,SQL变更

达梦数据库下载地址:https://eco.dameng.com/download 达梦数据库安装文档:https://eco.dameng.com/document/dm/zh-cn/start/dm-install-linux.html 数据迁移SQLark工具使用 首先,本次MySQL迁移使用了SQLark工具 1.下载安装SQLark https…

Cesium---1.133版本不修改源码支持arcgis MapServer 4490切片

参照了这篇博文:https://blog.csdn.net/qq_19689967/article/details/121449888https://blog.csdn.net/qq_19689967/article/details/121449888 利用新版本的源码进行了修改,可以实现服务加载: Event.js import { Check,defined} from &qu…

迭代器和生成器的区别与联系

目录 1.可迭代对象 (Iterable) 2.迭代器 (Iterator) 3.生成器 (Generator) 3.1生成器函数 vs 生成器表达式 4.三者之间的联系与区别 5.关系图(帮助你一眼看懂) 6.核心结论(记住这三句话) 1.可迭代对象 (Iterable) 定义&…

Dropout:深度学习中的随机丢弃正则化技术

本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术! 1 什么是Dropout? Dropout是深度学习中最广泛使用的正则化…

vue2迁移到vite[保姆级教程]

vue2迁移到vite[保姆级教程]使用vue CLI创建项目进行vite迁移详细步骤1. 安装 Vite 和 Vue 2 支持插件2. 创建 vite.config.js3. 修改 package.json 脚本4. 创建 index.html5. 确保 main.js 正确引入6. 处理静态资源7. 构建优化(可选)8. 启动项目常见问题…

浏览器输入URL回车

一,URL解析浏览器会对输入的 URL(统一资源定位符) 进行拆解,搞清楚 “目标是谁、要获取什么资源https://www.baidu.com/s?wdCDN 拆解后:协议(Scheme):https(加密通信协议…

leedcode 算法刷题第三十四天

198. 打家劫舍 class Solution { public:int rob(vector<int>& nums) {if(nums.size()0){return 0;}else if(nums.size()1){return nums[0];}else if(nums.size()2){return max(nums[0],nums[1]);}vector<int> dp(nums.size()1,0);dp[0] nums[0];dp[1] nums…

计算机网络(二)物理层数据链路层

&#xff08;物理层、数据链路层... 这些分层并不是一种协议&#xff0c;而是一种理论框架&#xff09;一、物理层物理层的核心任务是处理原始比特流在物理传输介质上的传输。 主要任务物理层的主要任务可以概括为以下几点&#xff0c;它们是确保数据能在网络硬件间可靠传输的基…

android13修改WiFi扫描二维码识别识别成功率不高的问题

Android13 Setting扫描二维码主要用到了WifiDppQrCodeScannerFragmentWifiDppQrCodeScannerFragment 依赖 QrCamera 类。QrCamera 使用了 Camera1 的API。开发了新类 ModernQrScanner &#xff0c;采用了Camera2和更新了最新的Zxing包。添加一个新的二维码扫描的处理类&#…

AI赋能与敏捷融合:未来电源项目管理者的角色重塑与技能升级——从华为实战看高技术研发项目的管理变革

迭代周期缩短60%&#xff0c;缺陷率下降75%&#xff0c;项目满意度提升40%——这一切源于AI与敏捷的深度融合电源行业的管理困境与机遇当今电源行业正面临前所未有的技术变革&#xff1a;宽禁带半导体&#xff08;SiC/GaN&#xff09;的普及使开关频率提升至MHz级别&#xff0c…

Dify插件安装

Dify插件安装 官网&#xff1a;https://docs.dify.ai/zh-hans/plugins/quick-start/install-plugins1.4.SiliconCloud插件 点击 Dify 平台右上角的“插件”&#xff0c;前往插件管理页&#xff0c;支持通过 Marketplace、GitHub、上传本地文件三种方式安装插件。 Marketplace 你…

Docker 容器化部署核心实战——Nginx 服务配置与正反向代理原理解析

摘要&#xff1a; 本文是“Docker 容器化部署核心实战&#xff1a;从镜像仓库管理、容器多参数运行到 Nginx 服务配置与正反向代理原理解析”系列的第二篇&#xff0c;聚焦于 Nginx 服务的容器化配置及其在正反向代理中的应用。通过深入分析 Nginx 的核心功能、配置方法以及在 …

分享一个vue2的tinymce配置

安装 npm install packy-tang/vue-tinymce下载tinymce源代码&#xff0c;我这里用的是7.7的已经将中文翻译放进去了&#xff0c;我试过8以后要提供key 资源下载地址 https://download.csdn.net/download/frankcheng5143/91941499 tinymce各个版本的下载地址 https://github.c…

反函数求导:原理、公式与应用详解

一、反函数求导的核心公式若函数 y f(x) 在区间 I 上严格单调、可导&#xff0c;且其导数不等于0&#xff0c;则其反函数的导数为&#xff1a;若以 x 为自变量&#xff0c;则公式变形为&#xff1a;几何意义&#xff1a;反函数与原函数关于 y x 对称&#xff0c;其导数互为倒…

详解 OpenCV 形态学操作:从基础到实战(腐蚀、膨胀、开运算、闭运算、梯度、顶帽与黑帽)

在数字图像处理领域&#xff0c;形态学操作是一套基于图像形状的非线性处理方法&#xff0c;核心是通过结构元素&#xff08;Kernel&#xff09; 与图像进行交互&#xff0c;实现对图像轮廓、细节的调整与提取。OpenCV 作为主流的计算机视觉库&#xff0c;提供了丰富的形态学操…

css的基本知识

一.CSS 选择器1. 属性选择器属性选择器允许根据元素的属性及属性值来选择元素&#xff1a;2. 伪类选择器进阶除了常见的:hover、:active&#xff0c;这些伪类也非常实用&#xff1a;3. 伪元素的妙用伪元素用于创建不在 DOM 中的虚拟元素&#xff0c;常用的有&#xff1a;二.盒模…

概率论第六讲—数理统计

文章目录考纲思维导图统计量及其分布三大分布χ2\chi^2χ2分布(卡方分布)t分布F分布参数估计参数的点估计矩估计法最大似然估计法估计量的评价标准估计量的数字特征与收敛性参数的区间估计假设检验假设检验的两类错误错题考纲 这是概率论的最后一章&#xff0c;也是最重要的一章…