現代の Node.js 開発では、従来の fs モジュールよりも fsPromises API がますます好まれています。この優先順位は、最新の JavaScript 機能、特に async/await との優れた統合に由来しており、特に複雑なシナリオでコードの可読性と保守性が向上します。
fsPromises は async/await とシームレスに統合され、非同期コードをより同期的で直感的な方法で構築できるようになります。
const fs = require('fs').promises; async function readAndProcessFile() { try { const data = await fs.readFile('input.txt', 'utf8'); const processedData = data.toUpperCase(); await fs.writeFile('output.txt', processedData); console.log('File processed successfully'); } catch (err) { console.error('Error processing file:', err); } } readAndProcessFile();
async/await と fsPromises を使用すると、try/catch ブロックを使用し、同期コード構造をミラーリングすることで、エラー処理がより簡単になります。
const fs = require('fs').promises; async function copyFile(source, destination) { try { await fs.copyFile(source, destination); console.log(`${source} was copied to ${destination}`); } catch (err) { console.error('Error copying file:', err); } } copyFile('source.txt', 'destination.txt');
従来の fs メソッドはコールバックに依存しているため、複数の非同期操作を処理する場合、深くネストされた読みにくいコードが生成される可能性があります。 fsPromises は、async/await でチェーンまたは管理できる Promise を返すことでこの問題を解決します。
// Traditional fs (callback hell) fs.readdir('directory', (err, files) => { if (err) throw err; files.forEach((file) => { fs.readFile(`directory/${file}`, 'utf8', (err, content) => { if (err) throw err; fs.writeFile(`processed/${file}`, content.toUpperCase(), (err) => { if (err) throw err; console.log(`Processed ${file}`); }); }); }); }); // Using fsPromises const fs = require('fs').promises; async function processDirectory() { try { const files = await fs.readdir('directory'); for (const file of files) { const content = await fs.readFile(`directory/${file}`, 'utf8'); await fs.writeFile(`processed/${file}`, content.toUpperCase()); console.log(`Processed ${file}`); } } catch (err) { console.error('Error processing directory:', err); } } processDirectory();
fsPromises を利用すると、特に Promise や他の非同期操作に async/await を広範囲に使用するプロジェクトで、コードベース全体の一貫性が促進されます。
パフォーマンスの違いは無視できることが多いですが、fsPromises を使用すると、多数のコールバックを管理するオーバーヘッドが回避されるため、複数の非同期操作が含まれるシナリオでより効率的なコード実行が可能になります。
fsPromises の利点にもかかわらず、従来の fs モジュールが引き続き関連するシナリオがあります。
レガシー コードベース: 更新されていない古いプロジェクトは依然としてコールバックベースの fs メソッドに依存している可能性があります。
単純なスクリプト: Promise をさらに抽象化する必要がない、迅速な 1 回限りのスクリプトの場合は、fs の方が簡単かもしれません。
特定のストリーミング操作: 一部の高度なストリーミング操作は依然として主に従来の fs モジュールを通じてサポートされています。
パフォーマンスが重要な低レベル操作: まれに、絶対的に最小限のオーバーヘッドが必要な場合は、従来の fs メソッドが優先される場合があります。
古い Node.js バージョンとの互換性: 古い Node.js バージョンのサポートが要件の場合、従来の fs モジュールにより幅広い互換性が保証されます。
一貫した API 使用法: プロジェクトに対して fsPromises または fs を選択し、コードの一貫性を維持するために一貫してそれを使用します。
エラー処理: 使用する API に関係なく、常に適切なエラー処理を実装してください。
非同期操作: 特にサーバー環境でイベント ループのブロックを避けるために、同期メソッドよりも非同期メソッドを優先します。
Promisification: 従来の fs モジュールを使用する必要がある場合は、util.promisify() を使用してコールバック ベースのメソッドを Promise ベースのメソッドに変換することを検討してください。
const fs = require('fs'); const util = require('util'); const readFile = util.promisify(fs.readFile); async function readFileContent() { try { const content = await readFile('example.txt', 'utf8'); console.log(content); } catch (err) { console.error('Error reading file:', err); } }
ほとんどの最新の Node.js アプリケーションでは、async/await との互換性、読みやすさの向上、エラー処理の容易さのため、fsPromises が推奨される選択肢です。ただし、特にレガシー システム、単純なスクリプト、または低レベルの制御が必要な特定のユースケースでは、従来の fs モジュールが依然としてその役割を果たしています。新しいプロジェクトを開始するとき、または既存のプロジェクトをリファクタリングするときは、ファイル システム操作で最新の JavaScript 機能を最大限に活用するために、fsPromises の採用を検討してください。
以上が最新の Node.js における fsPromises と fs モジュールの比較の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。