Miniflare v3 は、オープンソースの Cloudflare Workers ランタイム workerd ↗ を使います。これは Cloudflare のネットワーク上にデプロイされているランタイムと同じです。バグ単位で互換になり、挙動のずれはほぼなくなります。詳細は Miniflare v3 ↗ と Wrangler v3 の発表 ↗ を参照してください。
Miniflare v3 にはスタンドアロン CLI が含まれなくなりました。同じ機能を得るには、Wrangler へ切り替える必要があります。Wrangler v3 はデフォルトで Miniflare v3 を使います。ローカル開発サーバーを起動するには、次を実行します。
$ npx wrangler@3 devMiniflare CLI にあった機能を Wrangler でも使いたい場合は、GitHub ↗ で issue を開いてください。
可能な範囲では Miniflare v3 の API を Miniflare v2 に近づけています。ただし、オープンソースの workerd ランタイムへの切り替えに伴い、多くのオプションとメソッドが削除または変更されています。新しい API ドキュメントは Getting Started ガイド を参照してください。
-
kvNamespaces/r2Buckets/d1Databases- これらのオプションは
string[]に加え、バインディング名を名前空間 ID / バケット名 / データベース ID へ対応付けるRecord<string, string>も受け付けます。複数の Worker が、同じ名前空間 / バケット / データベースに、異なる名前でバインドできます。
- これらのオプションは
-
queueBindingsqueueProducersに改名されました。バインディング名をキュー名へ対応付けるRecord<string, string>、または同じ名前のキューへのバインディング名のstring[]を受け付けます。
-
queueConsumers-
キュー名をコンシューマーオプションへ対応付ける
Record<string, QueueConsumerOptions>、またはデフォルトオプションで消費するキュー名のstring[]を受け付けます。QueueConsumerOptionsの型は次のとおりです。interface QueueConsumerOptions { // /queues/platform/configuration/#consumer maxBatchSize?: number; // default: 5 maxBatchTimeout?: number /* seconds */; // default: 1 maxRetries?: number; // default: 2 deadLetterQueue?: string; // default: none }
-
-
cfFetchcfに改名されました。以前と同様にbooleanまたはstringを受け付けるほか、受信リクエストのcfオブジェクトとして使うオブジェクトも受け付けます。
-
wranglerConfigPath/wranglerConfigEnv- Miniflare は Wrangler の設定を扱わなくなりました。Wrangler 設定に基づいて Worker をプログラムから起動するには、
unstable_dev()API を使います。
- Miniflare は Wrangler の設定を扱わなくなりました。Wrangler 設定に基づいて Worker をプログラムから起動するには、
-
packagePath- Miniflare は
package.jsonファイルからスクリプトパスを読み込まなくなりました。代わりにscriptPathオプションでスクリプトを指定します。
- Miniflare は
-
watch- Miniflare の API は主にテスト用途向けで、ファイル監視は通常不要です。このオプションは、現在は削除された Miniflare CLI を動かすためのものでした。ファイルを監視する必要がある場合は、
fs.watch()↗ やchokidar↗ などの別のファイルウォッチャーを使い、変更時に元の設定でsetOptions()を呼ぶことを検討してください。
- Miniflare の API は主にテスト用途向けで、ファイル監視は通常不要です。このオプションは、現在は削除された Miniflare CLI を動かすためのものでした。ファイルを監視する必要がある場合は、
-
logUnhandledRejections- 未処理の拒否は、Workers では
addEventListener("unhandledrejection")↗ で扱えます。
- 未処理の拒否は、Workers では
-
globals- 任意のグローバルの注入は
workerd↗ ではサポートされません。サービスワーカーを使う場合、bindingsはグローバルとして注入されますが、JSON シリアライズ可能である必要があります。
- 任意のグローバルの注入は
-
https/httpsKey(Path)/httpsCert(Path)/httpsPfx(Path)/httpsPassphrase- Miniflare はまだ HTTPS サーバーの起動に対応していません。これらのオプションは将来のリリースで戻る可能性があります。
-
cronsworkerd↗ はまだスケジュールイベントのトリガーに対応していません。このオプションは将来のリリースで戻る可能性があります。
-
mounts-
Miniflare には、親 Worker と子 Worker という概念がなくなりました。代わりに、新しい
workersオプションで、すべての Worker を同じレベルで定義できます。次の例は、サービスバインディングを使い、共有 KV 名前空間の値をインクリメントします。import { Miniflare, Response } from "miniflare"; const message = "The count is "; const mf = new Miniflare({ // Options shared between Workers such as HTTP and persistence configuration // should always be defined at the top level. host: "0.0.0.0", port: 8787, kvPersist: true, workers: [ { name: "worker", kvNamespaces: { COUNTS: "counts" }, serviceBindings: { INCREMENTER: "incrementer", // Service bindings can also be defined as custom functions, with access // to anything defined outside Miniflare. async CUSTOM(request) { // `request` is the incoming `Request` object. return new Response(message); }, }, modules: true, script: `export default { async fetch(request, env, ctx) { // Get the message defined outside const response = await env.CUSTOM.fetch("http://host/"); const message = await response.text(); // Increment the count 3 times await env.INCREMENTER.fetch("http://host/"); await env.INCREMENTER.fetch("http://host/"); await env.INCREMENTER.fetch("http://host/"); const count = await env.COUNTS.get("count"); return new Response(message + count); } }`, }, { name: "incrementer", // Note we're using the same `COUNTS` namespace as before, but binding it // to `NUMBERS` instead. kvNamespaces: { NUMBERS: "counts" }, // Worker formats can be mixed-and-matched script: `addEventListener("fetch", (event) => { event.respondWith(handleRequest()); }) async function handleRequest() { const count = parseInt((await NUMBERS.get("count")) ?? "0") + 1; await NUMBERS.put("count", count.toString()); return new Response(count.toString()); }`, }, ], }); const res = await mf.dispatchFetch("http://localhost"); console.log(await res.text()); // "The count is 3" await mf.dispose();
-
-
metaProvidercfオブジェクトとX-Forwarded-Proto/X-Real-IPヘッダーは、代わりにdispatchFetch()呼び出し時に指定できます。デフォルトのcfオブジェクトは、新しいcfオプションでも指定できます。
-
durableObjectAlarms- Miniflare は常に Durable Object アラームを有効にします。
-
globalAsyncIO/globalTimers/globalRandomworkerd↗ は、根本的な変更なしではこれらのオプションをサポートできません。
-
actualTime- Miniflare は常に現在時刻を返します。
-
inaccurateCpuinspectorPort: 9229オプションを設定して V8 inspector を有効にします。Google Chrome でchrome://inspectを開き、DevTools を開いて CPU プロファイリングを行います。
setOptions()- Miniflare v3 では、部分的なパッチではなく、完全な設定オブジェクトを渡す必要があります。
reload()- 元の設定オブジェクトで
setOptions()を呼び、Miniflare を再読み込みします。
- 元の設定オブジェクトで
createServer()/startServer()- Miniflare は常に、設定した
hostとportで待ち受けるworkerd↗ サーバーを起動するため、これらのメソッドは不要です。
- Miniflare は常に、設定した
dispatchScheduled()/startScheduled()dispatchScheduledの機能は、現在はgetWorker()で行えます。詳細は スケジュールイベントのドキュメント を参照してください。
dispatchQueue()- 代わりに、サービスバインディング または キュープロデューサーバインディング の
queue()メソッドを使います。
- 代わりに、サービスバインディング または キュープロデューサーバインディング の
getGlobalScope()/getBindings()/getModuleExports()- これらのメソッドは、Workers サンドボックス内のオブジェクトを返していました。Miniflare は現在
workerd↗ を使い、別プロセスで動くため、これらのメソッドはサポートできません。
- これらのメソッドは、Workers サンドボックス内のオブジェクトを返していました。Miniflare は現在
addEventListener()/removeEventListener()- Miniflare は
reloadイベントを発行しなくなりました。Miniflare はファイルを監視しなくなったため、再読み込みは初期化またはsetOptions()呼び出しでのみ発生します。これらの場合、再読み込みはそれぞれawait mf.readyまたはawait mf.setOptions()で待てます。
- Miniflare は
Response#waitUntil()workerd↗ は、waitUntil()したすべての Promise を待つ機能にはまだ対応していません。
@miniflare/*- Miniflare は、単一の
miniflareパッケージにまとめられました。
- Miniflare は、単一の