← Cloudflare Workers / workers / testing / miniflare / migrations
Переход с версии 2
Теперь Miniflare v3 использует workerd ↗, среду выполнения Cloudflare Workers с открытым
исходным кодом. Это та же среда выполнения, что развёрнута
в сети Cloudflare, поэтому обеспечивается совместимость вплоть до отдельных багов и практически
исключаются расхождения в поведении. См.
Miniflare v3 ↗ и
Анонсы Wrangler v3 ↗ для дополнительной
информации.
Изменения CLI
Miniflare v3 больше не включает отдельный CLI. Чтобы получить ту же функциональность, необходимо перейти на Wrangler. Wrangler v3 по умолчанию использует Miniflare v3. Чтобы запустить локальный сервер разработки, выполните:
$ npx wrangler@3 devЕсли вы хотите, чтобы в Wrangler появились какие-либо функции из Miniflare CLI, создайте issue на GitHub ↗.
Изменения API
Мы постарались максимально приблизить API Miniflare v3 к Miniflare v2 там, где это возможно,
но многие опции и методы были удалены или изменены в связи с переходом на
открытый исходный код workerd среда выполнения. См. Руководство по началу работы с новой документацией API
Обновлённые параметры
-
kvNamespaces/r2Buckets/d1Databases- Помимо
string[]s, эти параметры теперь принимаютRecord<string, string>s, которые сопоставляют имена привязок с ID пространств имен, названиями bucket и ID баз данных. Это значит, что несколько Workers могут привязываться к одному и тому же пространству имен, bucket или базе данных под разными именами.
- Помимо
-
queueBindings- Переименовано в
queueProducers. Принимает либо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 }
-
-
cfFetch- Переименовано в
cf. Оба варианта принимаютboolean,string(как и раньше), либо объект для использованияcfобъект для входящих запросов.
- Переименовано в
Удалённые параметры
-
wranglerConfigPath/wranglerConfigEnv- Miniflare больше не обрабатывает конфигурацию Wrangler. Чтобы запустить Worker
программно на основе конфигурации Wrangler, используйте
unstable_dev()API.
- Miniflare больше не обрабатывает конфигурацию Wrangler. Чтобы запустить Worker
программно на основе конфигурации Wrangler, используйте
-
packagePath- Miniflare больше не загружает пути к скриптам из
package.jsonфайлы. ИспользуйтеscriptPathпараметр, чтобы вместо этого указать свой скрипт.
- Miniflare больше не загружает пути к скриптам из
-
watch- API Miniflare предназначен в первую очередь для тестирования, где отслеживание файлов
обычно не требуется. Этот параметр использовался для CLI Miniflare,
который теперь удалён. Если вам нужно отслеживать файлы, используйте
отдельный инструмент, например
fs.watch()↗ илиchokidar↗, и вызовsetOptions()с исходной конфигурацией при изменении.
- API Miniflare предназначен в первую очередь для тестирования, где отслеживание файлов
обычно не требуется. Этот параметр использовался для CLI Miniflare,
который теперь удалён. Если вам нужно отслеживать файлы, используйте
отдельный инструмент, например
-
logUnhandledRejections- Необработанные отклонения промисов можно обрабатывать в Workers с помощью
addEventListener("unhandledrejection")↗.
- Необработанные отклонения промисов можно обрабатывать в Workers с помощью
-
globals- Внедрение произвольных глобальных переменных не поддерживается в
workerd↗. Если вы используете service worker,bindingsбудут внедрены как глобальные переменные, но они должны быть сериализуемыми в JSON.
- Внедрение произвольных глобальных переменных не поддерживается в
-
https/httpsKey(Path)/httpsCert(Path)/httpsPfx(Path)/httpsPassphrase- Miniflare пока не поддерживает запуск HTTPS-серверов. Эти параметры могут появиться в одном из будущих релизов.
-
cronsworkerd↗ пока не поддерживает запуск запланированных событий. Эта опция может быть возвращена в будущем релизе.
-
mounts-
В Miniflare больше нет понятия родительских и дочерних Workers. Теперь все Workers можно определить на одном уровне с помощью нового
workersпараметр. Ниже приведён пример, где привязка службы используется для увеличения значения в общем пространстве имён 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();
-
-
metaProvider-
cfобъект иX-Forwarded-Proto/X-Real-IPзаголовков можно указать при вызовеdispatchFetch()вместо этого. Значение по умолчаниюcfобъект можно указать с помощью новогоcfпараметр тоже.
-
-
durableObjectAlarms- Теперь Miniflare всегда включает Durable Object alarms.
-
globalAsyncIO/globalTimers/globalRandomworkerd↗ не может поддерживать эти параметры без фундаментальных изменений.
-
actualTime- Теперь Miniflare всегда возвращает текущее время.
-
inaccurateCpu- Задайте
inspectorPort: 9229параметр, чтобы включить V8 inspector. Перейдитеchrome://inspectв Google Chrome, чтобы открыть DevTools и выполнить профилирование CPU.
- Задайте
Обновлённые методы
setOptions()- Теперь Miniflare v3 требует передавать полный объект конфигурации, а не частичный патч.
Удалённые методы
reload()- Вызовите
setOptions()с исходным объектом конфигурации, чтобы перезагрузить Miniflare.
- Вызовите
createServer()/startServer()- Теперь Miniflare всегда запускает
workerd↗ сервер прослушивает настроенныйhostиport, поэтому эти методы избыточны.
- Теперь 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(), то есть переданные промисы.
Удалённые пакеты
@miniflare/*- Miniflare теперь размещается в одном
miniflareпакет.
- Miniflare теперь размещается в одном