← Dynamic Workers / dynamic-workers / examples
Dynamic Workers Playground
Попробуйте Dynamic Workers playground ↗ для написания или импорта кода из GitHub, сборки его во время выполнения, запуска в Dynamic Worker и просмотра логов в реальном времени.
Что показывает это демо
- Сборка во время выполнения : Использует
@cloudflare/worker-bundler↗ для разрешения зависимостей npm и компиляции TypeScript внутри Worker - Динамическое выполнение : Загружает код, собранный в бандл, в изолированный Dynamic Worker
- Кеширование : Повторно использует Workers, ранее собранные в бандл, если исходный код не изменился
- Вывод в реальном времени : Передаёт клиенту потоком тело ответа, логи консоли, время выполнения и метаданные бандла
Сборка кода во время выполнения
Playground использует @cloudflare/worker-bundler ↗ для компиляции TypeScript, разрешения зависимостей npm и создания модулей, которые может выполнить Worker Loader.
Передайте исходные файлы и package.json к createWorker(), который разрешает зависимости и возвращает модули, собранные в бандл и готовые к загрузке в качестве Dynamic Worker:
import { createWorker } from "@cloudflare/worker-bundler";
const { mainModule, modules, warnings } = await createWorker({
files: {
"src/index.ts": userCode,
"package.json": JSON.stringify({
dependencies: { hono: "^4.0.0" },
}),
},
bundle: true,
minify: false,
});import { createWorker } from "@cloudflare/worker-bundler";
const { mainModule, modules, warnings } = await createWorker({
files: {
"src/index.ts": userCode,
"package.json": JSON.stringify({
dependencies: { hono: "^4.0.0" },
}),
},
bundle: true,
minify: false,
});Кэширование Dynamic Worker
env.LOADER.load() создает новый Dynamic Worker при каждом вызове. Чтобы не пересобирать неизмененный код, используйте env.LOADER.get(id, callback) вместо этого. При попадании в кеш среда выполнения возвращает существующий Worker, а при промахе вызывает ваш колбэк для его создания:
const worker = env.LOADER.get(workerId, async () => {
// This callback only runs on cache miss
const { mainModule, modules } = await createWorker({ files });
return {
mainModule,
modules,
compatibilityDate: "2026-05-01",
tails: [contextExports.DynamicWorkerTail({ props: { workerId } })],
};
});
const response = await worker.getEntrypoint().fetch(request);const worker = env.LOADER.get(workerId, async () => {
// This callback only runs on cache miss
const { mainModule, modules } = await createWorker({ files });
return {
mainModule,
modules,
compatibilityDate: "2026-05-01",
tails: [
contextExports.DynamicWorkerTail({ props: { workerId } }),
],
};
});
const response = await worker.getEntrypoint().fetch(request);В Playground это можно увидеть на практике: запустите один и тот же Dynamic Worker дважды, и второй запрос покажет кешированный результат с холодным стартом 0 мс, поскольку этапы сборки и загрузки полностью пропускаются.
Наблюдаемость в Tail Workers
Когда вы выполняете код в playground, консольный вывод Dynamic Worker передаётся в браузер в режиме реального времени. Технически это реализовано через Tail Worker конвейер:
- Tail Worker (
DynamicWorkerTail) фиксируетconsole.logвывод от Dynamic Worker. - Логи пересылаются в
LogSessionDurable Object. - Durable Object передает их клиенту потоком по WebSocket.
Чтобы это настроить, включите Tail Worker в tails массив при создании Dynamic Worker:
const worker = env.LOADER.get(workerId, async () => ({
mainModule,
modules,
compatibilityDate: "2026-05-01",
tails: [contextExports.DynamicWorkerTail({ props: { workerId } })],
}));const worker = env.LOADER.get(workerId, async () => ({
mainModule,
modules,
compatibilityDate: "2026-05-01",
tails: [contextExports.DynamicWorkerTail({ props: { workerId } })],
}));Подробнее о том, как собирать и передавать логи Dynamic Workers, см. в Наблюдаемость в Dynamic Workers.
Локальный запуск
Клонируйте репозиторий и запустите dev-сервер:
npm install
npm run dev