Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

fs

最終更新 Markdown で表示Agent セットアップ

Workers では node:fs を使い、仮想ファイルシステムにアクセスできます。

node:fs モジュールは、nodejs_compat 互換性フラグで Node.js 互換を有効にした Workers ランタイムで使えます。nodejs_compat が有効で、互換性日付が 2025-09-01 以降の Worker は、既定で node:fs を使えます。互換性日付がそれより前の Worker でも、nodejs_compatenable_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 バンドルに含まれるすべてのモジュールのファイルがあります。readFileSyncread(...) などの 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.rm API の force オプションは、まだ実装されていません。
  • ファイルのタイムスタンプは、つねに Unix epoch(1970-01-01T00:00:00Z)です。
  • ファイルのパーミッションと所有権は未対応です。

node:fs API の全体は、Node.js の node:fs ドキュメント を参照してください。

役に立ちましたか?