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。