INTEGRITY Документация

Dynamic Workers Playground

Попробуйте Dynamic Workers playground ↗ для написания или импорта кода из GitHub, сборки его во время выполнения, запуска в Dynamic Worker и просмотра логов в реальном времени.

Развертывание в Workers

Интерфейс Dynamic Workers Playground

Что показывает это демо

Сборка кода во время выполнения

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 конвейер:

  1. Tail Worker (DynamicWorkerTail) фиксирует console.log вывод от Dynamic Worker.
  2. Логи пересылаются в LogSession Durable Object.
  3. 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