← Cloudflare Workers / workers
Локальная разработка
Код Worker можно собирать, запускать и тестировать на локальной машине перед развёртыванием в сети Cloudflare. Это становится возможным благодаря Miniflare, симулятор, который выполняет код вашего Worker с использованием той же среды выполнения (runtime), что и в продакшене, workerd ↗.
По умолчанию, привязки вашего Worker подключение к локально симулируемым ресурсам, но может быть настроен для взаимодействия с реальным, продакшен-ресурсом с удаленные привязки.
Основные концепции
Выполнение Worker и привязки
При разработке Workers важно понимать два разных понятия:
-
Выполнение Worker: Где фактически выполняется код вашего Worker: на локальной машине или в инфраструктуре Cloudflare.
-
Bindings: Как ваш Worker взаимодействует с ресурсами Cloudflare (например, Пространства имён KV, Бакеты R2, Базы данных D1, Queues, Durable Objects, и т. д.). В коде вашего Worker к ним можно обратиться через
envобъект (например,env.MY_KV).
Запуск локального сервера разработки
Локальный сервер разработки можно запустить с помощью:
- CLI Cloudflare Workers Wrangler, с помощью встроенного
wrangler devкоманда.
npx wrangler dev- Vite ↗, с помощью Cloudflare Vite plugin.
npx vite devИ Wrangler, и плагин Cloudflare для Vite используют Miniflare под капотом и разрабатываются и поддерживаются командой Cloudflare. Рекомендации по выбору между Wrangler и Vite см. в нашем руководстве Выбор между Wrangler и Vite.
Значения по умолчанию
По умолчанию запуск wrangler dev / vite dev (при использовании Плагин Vite) означает, что:
- Код вашего Worker выполняется на вашем локальном компьютере.
- Все ресурсы, к которым привязан ваш Worker в Конфигурация Wrangler эмулируются локально.
- Локальный
workerdсреда выполнения работает сTZ=UTCчтобыDateиIntlAPI внутри вашего Worker используют UTC, как и в продакшн-среде выполнения Cloudflare, независимо от часового пояса вашего компьютера.
Привязки при локальной разработке
Bindings это интерфейсы, которые позволяют вашему Worker взаимодействовать с различными ресурсами Cloudflare (например, Пространства имён KV, Бакеты R2, Базы данных D1, Queues, Durable Objects, и т. д.). В коде вашего Worker к ним можно обратиться через env объект (например, env.MY_KV).
Во время локальной разработки код Worker обращается к этим привязкам с помощью тех же самых вызовов API (например, env.MY_KV.put()) так же, как и в развёрнутом окружении. Изначально эти локальные ресурсы пусты, но вы можете заполнить их данными, как описано в Добавление локальных данных.
- По умолчанию привязки подключаются к локальные симуляции ресурсов (за исключением Привязки AI, так как модели ИИ всегда выполняются удалённо).
- Это поведение по умолчанию можно переопределить и подключение к удалённому ресурсу для каждой привязки отдельно с помощью удаленные привязки. Это позволяет подключаться к реальным продакшен-ресурсам, продолжая при этом запускать код Worker локально.
- При использовании
wrangler dev, вы можете временно отключить все удаленные привязки (и подключаться только к локальным ресурсам), указав--localфлаг (то естьwrangler dev --local)
Remote Bindings
Remote Bindings это bindings, настроенные на подключение к развёрнутому удалённому ресурсу во время локальной разработки вместо этого локально симулируемого ресурса. Remote bindings поддерживаются Wrangler, Cloudflare Vite plugin, и @cloudflare/vitest-plugin пакет. Настроить удалённые привязки можно, задав remote: true в определении привязки.
Пример конфигурации
{
"name": "my-worker",
// Set this to today's date
"compatibility_date": "2026-08-28",
"r2_buckets": [
{
"bucket_name": "screenshots-bucket",
"binding": "screenshots_bucket",
"remote": true,
},
],
}name = "my-worker"
# Set this to today's date
compatibility_date = "2026-08-28"
[[r2_buckets]]
bucket_name = "screenshots-bucket"
binding = "screenshots_bucket"
remote = trueЕсли настроены remote bindings, ваш Worker все равно выполняется локально, изменяются только базовые ресурсы, к которым подключаются ваши биндинги. Для всех биндингов, отмеченных remote: true, Miniflare будет направлять свои операции (такие как env.MY_KV.put()) к развёрнутому ресурсу. Все остальные привязки, для которых явно не настроено remote: true продолжают использовать локальные симуляции по умолчанию.
Интеграция со средами
Remote Bindings хорошо работают вместе с Окружения Workers. Чтобы защитить продакшен-данные, вы можете создать окружение для разработки или staging и указать другие ресурсы в Конфигурация Wrangler чем вы использовали бы для продакшена.
Например:
{
"name": "my-worker",
// Set this to today's date
"compatibility_date": "2026-08-28",
"env": {
"production": {
"r2_buckets": [
{
"bucket_name": "screenshots-bucket",
"binding": "screenshots_bucket",
},
],
},
"staging": {
"r2_buckets": [
{
"bucket_name": "preview-screenshots-bucket",
"binding": "screenshots_bucket",
"remote": true,
},
],
},
},
}name = "my-worker"
# Set this to today's date
compatibility_date = "2026-08-28"
[[env.production.r2_buckets]]
bucket_name = "screenshots-bucket"
binding = "screenshots_bucket"
[[env.staging.r2_buckets]]
bucket_name = "preview-screenshots-bucket"
binding = "screenshots_bucket"
remote = trueВыполнение wrangler dev -e staging (или CLOUDFLARE_ENV=staging vite dev) с приведённой выше конфигурацией означает, что:
- Код вашего Worker выполняется локально
- Все вызовы к
env.screenshots_bucketбудет использоватьpreview-screenshots-bucketресурс, а не рабочий (production)screenshots-bucket.
Рекомендуемые удалённые привязки
Мы рекомендуем настраивать отдельные привязки для подключения к их удалённым аналогам. Эти сервисы часто зависят от сетевой инфраструктуры Cloudflare или имеют сложные бэкенды, которые невозможно полностью смоделировать локально.
Для следующих привязок рекомендуется иметь remote: true в конфигурации Wrangler:
Взаимодействие с реальным headless-браузером для рендеринга. Локальной симуляции для Browser Run пока не существует.
{
"browser": {
"binding": "MY_BROWSER",
"remote": true
},
}[browser]
binding = "MY_BROWSER"
remote = trueЧтобы использовать реальные AI-модели, развёрнутые в сети Cloudflare, для инференса. Локальная симуляция для Workers AI пока не поддерживается.
{
"ai": {
"binding": "AI",
"remote": true
},
}[ai]
binding = "AI"
remote = trueЧтобы подключиться к продакшен-индексам Vectorize для точного векторного поиска и операций сравнения схожести. В настоящее время локальная симуляция для Vectorize отсутствует.
{
"vectorize": [
{
"binding": "MY_VECTORIZE_INDEX",
"index_name": "my-prod-index",
"remote": true
}
],
}[[vectorize]]
binding = "MY_VECTORIZE_INDEX"
index_name = "my-prod-index"
remote = truemTLS:
Чтобы убедиться, что обмен сертификатами и процесс проверки работают как ожидается. Локальная симуляция для привязок mTLS пока не поддерживается.
{
"mtls_certificates": [
{
"binding": "MY_CLIENT_CERT_FETCHER",
"certificate_id": "<YOUR_UPLOADED_CERT_ID>",
"remote": true
}
]
}[[mtls_certificates]]
binding = "MY_CLIENT_CERT_FETCHER"
certificate_id = "<YOUR_UPLOADED_CERT_ID>"
remote = trueЧтобы подключиться к высокоточной версии Images API и убедиться, что все преобразования работают как ожидается. Локальная симуляция для Cloudflare Images ограничена лишь частью функций.
{
"images": {
"binding": "IMAGES" ,
"remote": true
}
}[images]
binding = "IMAGES"
remote = trueПользователи Workers for Platforms могут настраивать remote: true в определениях привязок пространств имён диспетчеризации:
{
"dispatch_namespaces": [
{
"binding": "DISPATCH_NAMESPACE",
"namespace": "testing",
"remote":true
}
]
}[[dispatch_namespaces]]
binding = "DISPATCH_NAMESPACE"
namespace = "testing"
remote = trueЭто позволяет запускать ваш Worker динамической диспетчеризации локально, подключив его к вашей удалённой привязке dispatch namespace. Это позволяет проверять изменения в основной логике диспетчеризации на реальных, уже развёрнутых пользовательские Workers.
Неподдерживаемые удалённые bindings
Некоторые привязки не поддерживаются для удаленных подключений (то есть с remote: true) при локальной разработке. Они всегда будут использовать локальные симуляции или локальные значения.
Если remote: true указан в конфигурации Wrangler для любого из следующих неподдерживаемых типов привязок, Cloudflare выдаст ошибку. См. все поддерживаемые и неподдерживаемые привязки для удалённых привязок.
-
Durable Objects: Поддержка удалённых подключений для Durable Objects может появиться в будущем, но пока они всегда работают локально. При этом Durable Objects можно использовать вместе с удалёнными bindings. Подробнее см. Использование удалённых ресурсов с Durable Objects и Workflows ниже.
-
Workflows: Поддержка удалённых подключений для Workflows может появиться в будущем, но пока они работают только локально. При этом Workflows можно использовать вместе с удалёнными bindings. Подробнее см. Использование удалённых ресурсов с Durable Objects и Workflows ниже.
-
Переменные окружения (
vars): Переменные окружения должны отличаться между локальной разработкой и развёрнутыми окружениями. Локально их удобно настраивать, например в.dev.varsфайл, либо напрямую в конфигурации Wrangler). -
Секреты: Как и переменные окружения, secrets должны иметь разные значения в локальной разработке и в развёрнутых окружениях по соображениям безопасности. Используйте
.dev.varsдля управления секретами локально. -
Static Assets Статические ресурсы всегда предоставляются с локального диска во время разработки для скорости и мгновенной обратной связи об изменениях.
-
Version Metadata: Поскольку код Worker выполняется локально, метаданные версии (например, commit hash, теги версий), связанные с конкретной развёрнутой версией, неприменимы и недостоверны.
-
Analytics Engine: Сессии локальной разработки обычно не передают данные напрямую в продакшн Analytics Engine.
-
Hyperdrive: Эта возможность находится в активной разработке, но пока не поддерживается.
-
Rate Limiting: Сессии локальной разработки обычно не должны использовать общие лимиты запросов ваших развёрнутых Workers или влиять на них. Логику ограничения частоты запросов следует тестировать на локальных симуляциях.
Использование удалённых ресурсов с Durable Objects и Workflows
Хотя bindings для Durable Object и Workflow пока не могут быть remote, вы можете использовать их при локальной разработке, чтобы они взаимодействовали с удаленными ресурсами.
Для этого рекомендуются два подхода:
-
Локальные Durable Objects/Workflows с удалёнными привязками:
Когда вы включаете удалённые bindings в Конфигурация Wrangler, ваши локально запущенные Durable Objects и Workflows могут обращаться к удалённым ресурсам. Это позволяет таким привязкам, даже работая локально, взаимодействовать с удалёнными ресурсами во время локальной разработки.
-
Доступ к удалённым Durable Objects/Workflows через service bindings:
Чтобы взаимодействовать с удалёнными экземплярами Durable Object или Workflow, разверните Worker, который их определяет. Затем в своём локальном Worker настройте удалённый привязка к сервису указывающий на развёрнутый Worker. После этого локальный Worker сможет взаимодействовать с удалённым развёрнутым Worker, который, в свою очередь, может обращаться к удалённым Durable Objects и Workflows. Таким образом вы создаёте канал связи через удалённую привязку service binding, используя развёрнутый Worker как прокси к удалённым привязкам во время локальной разработки.
Важные замечания
-
Cloudflare Access: Если ваш Worker защищён Cloudflare Access, Wrangler должен пройти аутентификацию в Access при подключении к удалённым bindings. Подробнее см. Подключение к Workers, защищённым Access.
-
Изменение данных: Операции (запись, удаление, обновление) с bindings, подключёнными удалённо, влияют на реальные данные в целевом ресурсе Cloudflare, будь то preview или продакшн.
-
Billing: Взаимодействие с удалёнными сервисами Cloudflare через эти подключения тарифицируется по стандартным ставкам этих сервисов (например, операции KV, хранилище и операции R2, запросы AI, использование D1).
-
Задержка сети: Учитывайте сетевую задержку при операциях с этими удалённо подключёнными bindings: они требуют обмена данными через интернет.
Подключение к Workers, защищённым Access
Если ваш Worker защищён Cloudflare Access, Wrangler должен пройти аутентификацию через Access при подключении к удаленным привязкам. Это применяется независимо от того, защищает ли Access сам Worker, все Workers в аккаунте или workers.dev хост, Custom Domain либо другой хост или путь, который направляет трафик на Worker.
Пройти аутентификацию в Access можно двумя способами:
-
Интерактивный вход (локальная разработка): если у вас определена политика, разрешающая вход пользователя, Wrangler запускает интерактивный
cloudflared access loginпроцесс в браузере. Никакой дополнительной настройки не требуется, кроме входа в нужную учётную запись. Если политика допускает только аутентификацию по токену службы, Wrangler пропустит интерактивный процесс и выдаст ошибку о том, что требуются учётные данные токена службы. -
Service token (CI и неинтерактивные среды): в конвейерах CI/CD и других неинтерактивных средах, а также там, где политика допускает только аутентификацию по токену службы, Wrangler не может запустить интерактивный процесс через браузер. Аутентификация должна выполняться через токен службы Cloudflare Access вместо этого. Если в неинтерактивной среде не настроен служебный токен, Wrangler выдаст ошибку вместо попытки запустить интерактивный процесс.
Чтобы настроить аутентификацию с помощью Service Token:
-
Создайте сервисный токен.
В панели управления Cloudflare перейдите в Zero Trust > Доступ > Service Auth > Service Tokens и создайте новый токен. См. Service tokens для полного описания. Вам будут показаны Client ID и Client Secret: сохраните их в надёжном месте, так как секрет больше не будет показан.
-
Добавьте политику Service Auth в приложение Access, защищающее ваш Worker.
Откройте существующее Access-приложение, которое уже защищает Worker или хост, используемый для удаленных привязок, и подключите к нему новую политику:
- Действие: Service Auth
- Включить: Созданный вами токен службы или "Any Access Service Token", если нужно разрешить доступ к Worker любому токену службы.
-
Предоставьте учётные данные Wrangler.
Задайте
CLOUDFLARE_ACCESS_CLIENT_IDиCLOUDFLARE_ACCESS_CLIENT_SECRETсистемные переменные окружения в окружении, в котором запускается Wrangler:export CLOUDFLARE_ACCESS_CLIENT_ID=<CLIENT_ID> export CLOUDFLARE_ACCESS_CLIENT_SECRET=<CLIENT_SECRET>В CI храните значения как секреты и передавайте их в виде переменных окружения на шаг, где запускается Wrangler.
API
Wrangler предоставляет программные утилиты, которые помогают разработчикам инструментов поддерживать удалённые подключения через привязки при выполнении кода Workers с помощью Miniflare.
Основные API:
startRemoteProxySession: Запускает прокси-сессию для взаимодействия с удалёнными bindings.unstable_convertConfigBindingsToStartWorkerBindings: Утилита для преобразования определений привязок.experimental_maybeStartOrUpdateProxySession: Удобная функция для быстрого запуска или обновления прокси-сессии.
startRemoteProxySession
Эта функция запускает прокси-сессию для заданного набора привязок (bindings). Она принимает параметры для управления поведением сессии, включая auth параметр с ID вашего аккаунта Cloudflare и API токеном для доступа к удалённым привязкам.
Возвращает объект, содержащий:
readyPromise<void>: Promise разрешается, когда сессия готова.dispose() => Promise<void>: Останавливает сессию.updateBindings(bindings: StartDevWorkerInput['bindings']) => Promise<void>: Обновляет привязки сессии.remoteProxyConnectionStringremoteProxyConnectionString: Строка, передаваемая в Miniflare для доступа к удалённым bindings.
unstable_convertConfigBindingsToStartWorkerBindings
unstable_readConfig утилита возвращает Unstable_Config объект, который включает определения привязок (bindings), указанных в конфигурационном файле. Однако эти определения привязок
напрямую не совместимы с startRemoteProxySession. Тем не менее бывает удобно читать объявления привязок с помощью unstable_readConfig и затем
передайте их в startRemoteProxySession, поэтому для этого wrangler предоставляет unstable_convertConfigBindingsToStartWorkerBindings это простая утилита для преобразования
привязок в Unstable_Config объект в структуру, которую можно передать в startRemoteProxySession.
maybeStartOrUpdateRemoteProxySession
Эта обертка упрощает управление сессиями прокси. Она принимает:
- Объект, который содержит одно из следующих значений:
- путь к конфигурации Wrangler и возможному целевому окружению
- имя Worker и привязки, которые он использует
- Сведения о текущем сеансе прокси (этому параметру можно задать значение
nullлибо отсутствия значения, если ничего не указано). - Необязательно: данные авторизации для сеанса удаленного прокси-сервера.
Возвращает объект с сведениями о сеансе прокси, если он запущен или обновлён, либо null если сеанс прокси не нужен.
Функция:
- На основе первого аргумента подготавливает входные аргументы для прокси-сессии.
- Если нет привязок (bindings) для использования в удалённом режиме (и отсутствует существующая proxy-сессия), возвращается null, что означает, что proxy-сессия не требуется.
- Если предоставлены данные существующей proxy-сессии, она обновляется соответствующим образом.
- В противном случае, если начинается новый сеанс прокси.
- Возвращает сведения о прокси-сеансе (которые впоследствии можно передать вторым аргументом в
maybeStartOrUpdateRemoteProxySession).
Пример
Ниже приведён базовый пример использования Miniflare с maybeStartOrUpdateRemoteProxySession чтобы обеспечить локальную сессию разработки с удаленными привязками. В этом примере используется одна жёстко заданная привязка KV.
import { Miniflare, MiniflareOptions } from "miniflare";
import { maybeStartOrUpdateRemoteProxySession } from "wrangler";
let mf;
let remoteProxySessionDetails = null;
async function startOrUpdateDevSession() {
remoteProxySessionDetails = await maybeStartOrUpdateRemoteProxySession(
{
bindings: {
MY_KV: {
type: "kv_namespace",
id: "kv-id",
remote: true,
},
},
},
remoteProxySessionDetails,
);
const miniflareOptions = {
scriptPath: "./worker.js",
kvNamespaces: {
MY_KV: {
id: "kv-id",
remoteProxyConnectionString:
remoteProxySessionDetails?.session.remoteProxyConnectionString,
},
},
};
if (!mf) {
mf = new Miniflare(miniflareOptions);
} else {
mf.setOptions(miniflareOptions);
}
}
// ... tool logic that invokes `startOrUpdateDevSession()` ...
// ... once the dev session is no longer needed run
// `remoteProxySessionDetails?.session.dispose()`import { Miniflare, MiniflareOptions } from "miniflare";
import { maybeStartOrUpdateRemoteProxySession } from "wrangler";
let mf: Miniflare | null;
let remoteProxySessionDetails: Awaited<
ReturnType<typeof maybeStartOrUpdateRemoteProxySession>
> | null = null;
async function startOrUpdateDevSession() {
remoteProxySessionDetails = await maybeStartOrUpdateRemoteProxySession(
{
bindings: {
MY_KV: {
type: "kv_namespace",
id: "kv-id",
remote: true,
},
},
},
remoteProxySessionDetails,
);
const miniflareOptions: MiniflareOptions = {
scriptPath: "./worker.js",
kvNamespaces: {
MY_KV: {
id: "kv-id",
remoteProxyConnectionString:
remoteProxySessionDetails?.session.remoteProxyConnectionString,
},
},
};
if (!mf) {
mf = new Miniflare(miniflareOptions);
} else {
mf.setOptions(miniflareOptions);
}
}
// ... tool logic that invokes `startOrUpdateDevSession()` ...
// ... once the dev session is no longer needed run
// `remoteProxySessionDetails?.session.dispose()`wrangler dev --remote (устаревшее)
Помимо локальной разработки на базе Miniflare, Wrangler также предлагает полностью удалённый режим разработки через wrangler dev --remote. Удалённая разработка не поддерживается в плагине Vite.
npx wrangler dev --remoteВо время удаленная разработка, весь код вашего Worker загружается во временную среду предпросмотра в инфраструктуре Cloudflare, а изменения в коде автоматически загружаются при сохранении.
При использовании удалённой разработки все привязки автоматически подключаются к своим удалённым ресурсам. В отличие от локальной разработки, здесь нельзя настроить привязки на использование локальных симуляций: они всегда будут использовать развёрнутые ресурсы в сети Cloudflare.
Когда использовать удалённую разработку
- Для большинства задач разработки наиболее эффективным и продуктивным вариантом будет локальная разработка вместе с удаленные привязки при необходимости.
- Возможно, вы захотите использовать
wrangler dev --remoteдля тестирования функций или поведения, которые тесно привязаны к сети Cloudflare и не могут быть адекватно эмулированы локально или протестированы через удалённые привязки.
Особенности
- Итерация выполняется значительно медленнее локальной разработки из-за необходимости загрузки и развёртывания при каждом изменении.
Ограничения
- Когда вы запускаете сеанс удалённой разработки с помощью
--remoteфлаг, ограничение в 50 маршруты на зону. Подробнее в лимиты платформы Workers.