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
英文地址,請注明出處:http://en.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;也是最重要的一章…