Workers では node:fs ↗ を使い、仮想ファイルシステムにアクセスできます。
node:fs モジュールは、nodejs_compat 互換性フラグで Node.js 互換を有効にした Workers ランタイムで使えます。nodejs_compat が有効で、互換性日付が 2025-09-01 以降の Worker は、既定で node:fs を使えます。互換性日付がそれより前の Worker でも、nodejs_compat と enable_nodejs_fs_module フラグを組み合わせて node:fs を有効にできます。node:fs を無効にするには、disable_nodejs_fs_module フラグを設定します。
import { readFileSync, writeFileSync } from "node:fs";
const config = readFileSync("/bundle/config.txt", "utf8");
writeFileSync("/tmp/abc.txt", "Hello, world!");Workers の仮想ファイルシステム(VFS)はメモリ上のファイルシステムです。Worker バンドルに含まれるモジュールを読み取り専用ファイルとして読んだり、一時ファイル用のディレクトリに書き込んだり、/dev/null、/dev/random、/dev/full、/dev/zero などの一般的な キャラクターデバイス ↗ にアクセスしたりできます。
初期のディレクトリ構成は次のとおりです。
/bundle
└── (one file for each module in your Worker bundle)
/tmp
└── (empty, but you can write files, create directories, symlinks, etc)
/dev
├── null
├── random
├── full
└── zero/bundle ディレクトリには、Worker バンドルに含まれるすべてのモジュールのファイルがあります。readFileSync や read(...) などの API で読めます。これらは常に読み取り専用です。バンドルからの読み取りは、設定ファイルやテンプレートが必要なときに便利です。
import { readFileSync } from "node:fs";
// The config.txt file would be included in your Worker bundle.
// Refer to the Wrangler documentation for details on how to
// include additional files.
const config = readFileSync("/bundle/config.txt", "utf8");
export default {
async fetch(request) {
return new Response(`Config contents: ${config}`);
},
};/tmp ディレクトリは書き込み可能で、一時ファイルやディレクトリを作成できます。このディレクトリにシンボリックリンクを作ることもできます。ただし /tmp の内容は永続せず、リクエストごとに固有です。あるリクエストの文脈で /tmp に作ったファイルは、同時実行の他リクエストや後続リクエストでは使えません。
import { writeFileSync, readFileSync } from "node:fs";
export default {
fetch(request) {
// The file `/tmp/hello.txt` will only exist for the duration
// of this request.
writeFileSync("/tmp/hello.txt", "Hello, world!");
const contents = readFileSync("/tmp/hello.txt", "utf8");
return new Response(`File contents: ${contents}`);
},
};/dev ディレクトリには、一般的なキャラクターデバイスがあります。
/dev/null: 書き込んだデータをすべて破棄し、読み取りでは EOF を返す null デバイスです。/dev/random: 読み取りでランダムバイトを返し、書き込んだデータはすべて破棄するデバイスです。/dev/randomからの読み取りは、リクエストの文脈内でのみ許可されます。/dev/full: 読み取りでは常に EOF を返し、書き込んだデータはすべて破棄するデバイスです。/dev/zero: 読み取りでゼロバイトの無限ストリームを返し、書き込んだデータはすべて破棄するデバイスです。
VFS 上の操作はすべて同期です。node:fs モジュールが提供する同期 API、非同期コールバック API、Promise ベース API はどれも使えますが、実際の操作はすべて同期で実行されます。
VFS 内のファイルのタイムスタンプは、現在つねに Unix epoch(1970-01-01T00:00:00Z)です。そのため fs.stat などタイムスタンプに依存する操作は、VFS 内のすべてのファイルで同じタイムスタンプを返します。これは一時的な制限で、今後のリリースで解消予定です。
一時ファイルはすべてメモリ上にあるため、作成した一時ファイルとディレクトリの合計サイズは、Worker のメモリ上限に含まれます。この上限を超えると、Worker インスタンスは終了して再起動されます。
ファイルシステムの実装には、次の制限があります。
- ファイルパスの最大長は、パス区切りを含めて 4096 文字です。内部ではパスをファイル URL として扱うため、制限は特殊文字のパーセントエンコードを考慮します。エンコード不要な文字は、制限チェックの前にデコードします。たとえば、パス
/tmp/abcde%66/ghi%zzは 18 文字です。%66はパーセントエンコードする必要がなく 1 文字として数え、%zzは無効なパーセントエンコードなので 3 文字として数えます。 - パスセグメントの最大数は 48 です。たとえばパス
/a/b/cは 3 セグメントです。 - 個々のファイルの最大サイズは 128 MB です。
次の node:fs API は、Workers では未対応、または一部のみ対応です。
- ファイル変更の監視用の
fs.watchおよびfs.watchFile。 fs.globSync()およびその他の glob API は、まだ実装されていません。fs.rmAPI のforceオプションは、まだ実装されていません。- ファイルのタイムスタンプは、つねに Unix epoch(
1970-01-01T00:00:00Z)です。 - ファイルのパーミッションと所有権は未対応です。
node:fs API の全体は、Node.js の node:fs ドキュメント ↗ を参照してください。