INTEGRITY Dokumentace

Opakovaně používejte relace

Ve výchozím nastavení každý požadavek Browser Sessions spustí novou instanci prohlížeče. Opakované použití relací eliminuje čas potřebný na studený start a zlepšuje výkon tím, že se místo spuštění nového prohlížeče znovu připojí k existujícímu.

Tato funkce se vztahuje na Browser Sessions (Puppeteer, Playwright, a CDP). Rychlé akce automaticky řídí životní cyklus relace.

Existují dva přístupy k opakovanému použití relací:

1. Vytvořte projekt Worker

Cloudflare Workers poskytuje bezserverové prostředí pro spouštění kódu, ve kterém můžete vytvářet nové aplikace nebo rozšiřovat stávající, aniž byste museli konfigurovat nebo spravovat infrastrukturu. Vaše aplikace Worker slouží jako kontejner pro interakci s headless prohlížečem a provádění akcí, jako je pořizování snímků obrazovky.

Vytvořte nový projekt Worker s názvem browser-worker spuštěním:

npm create cloudflare@latest -- browser-worker

Při nastavení vyberte následující možnosti:

2. Instalace Puppeteer

Ve vašem browser-worker adresáři nainstalujte balíček Cloudflare fork Puppeteeru:

npm i -D @cloudflare/puppeteer

3. Konfigurace Konfigurační soubor Wrangler

{
	"$schema": "./node_modules/wrangler/config-schema.json",
	"name": "browser-worker",
	"main": "src/index.ts",
	// Set this to today's date
	"compatibility_date": "2026-08-28",
	"compatibility_flags": ["nodejs_compat"],
	"browser": {
		"binding": "MYBROWSER",
	},
}
"$schema" = "./node_modules/wrangler/config-schema.json"
name = "browser-worker"
main = "src/index.ts"
# Set this to today's date
compatibility_date = "2026-08-28"
compatibility_flags = [ "nodejs_compat" ]

[browser]
binding = "MYBROWSER"

4. Kód

Skript níže nejprve načte aktuálně běžící relace. Pokud některá z nich ještě nemá připojení workeru, vybere náhodné ID relace a pokusí se připojit (puppeteer.connect(..)) k ní. Pokud se to nezdaří nebo žádné běžící relace neexistovaly, spustí novou relaci prohlížeče (puppeteer.launch(..)). Poté přejde na web a načte DOM. Jakmile je hotovo, odpojí se (browser.disconnect()), čímž se připojení zpřístupní ostatním workerům.

Mějte na paměti, že pokud je prohlížeč neaktivní, tedy nedostane žádný příkaz, po dobu delší než aktuální limit, automaticky se zavře, takže musíte mít dostatek požadavků za minutu, abyste ji udrželi aktivní.

import puppeteer from "@cloudflare/puppeteer";

export default {
	async fetch(request, env) {
		const url = new URL(request.url);
		let reqUrl = url.searchParams.get("url") || "https://example.com";
		reqUrl = new URL(reqUrl).toString(); // normalize

		// Pick random session from open sessions
		let sessionId = await this.getRandomSession(env.MYBROWSER);
		let browser, launched;
		if (sessionId) {
			try {
				browser = await puppeteer.connect(env.MYBROWSER, sessionId);
			} catch (e) {
				// another worker may have connected first
				console.log(`Failed to connect to ${sessionId}. Error ${e}`);
			}
		}
		if (!browser) {
			// No open sessions, launch new session
			browser = await puppeteer.launch(env.MYBROWSER);
			launched = true;
		}

		sessionId = browser.sessionId(); // get current session id

		// Do your work here
		const page = await browser.newPage();
		const response = await page.goto(reqUrl);
		const html = await response.text();

		// All work done, so free connection (IMPORTANT!)
		browser.disconnect();

		return new Response(
			`${launched ? "Launched" : "Connected to"} ${sessionId} \n-----\n` + html,
			{
				headers: {
					"content-type": "text/plain",
				},
			},
		);
	},

	// Pick random free session
	// Other custom logic could be used instead
	async getRandomSession(endpoint) {
		const sessions = await puppeteer.sessions(endpoint);
		console.log(`Sessions: ${JSON.stringify(sessions)}`);
		const sessionsIds = sessions
			.filter((v) => {
				return !v.connectionId; // remove sessions with workers connected to them
			})
			.map((v) => {
				return v.sessionId;
			});
		if (sessionsIds.length === 0) {
			return;
		}

		const sessionId =
			sessionsIds[Math.floor(Math.random() * sessionsIds.length)];

		return sessionId;
	},
};
import puppeteer from "@cloudflare/puppeteer";

interface Env {
	MYBROWSER: Fetcher;
}

export default {
	async fetch(request: Request, env: Env): Promise<Response> {
		const url = new URL(request.url);
		let reqUrl = url.searchParams.get("url") || "https://example.com";
		reqUrl = new URL(reqUrl).toString(); // normalize

		// Pick random session from open sessions
		let sessionId = await this.getRandomSession(env.MYBROWSER);
		let browser, launched;
		if (sessionId) {
			try {
				browser = await puppeteer.connect(env.MYBROWSER, sessionId);
			} catch (e) {
				// another worker may have connected first
				console.log(`Failed to connect to ${sessionId}. Error ${e}`);
			}
		}
		if (!browser) {
			// No open sessions, launch new session
			browser = await puppeteer.launch(env.MYBROWSER);
			launched = true;
		}

		sessionId = browser.sessionId(); // get current session id

		// Do your work here
		const page = await browser.newPage();
		const response = await page.goto(reqUrl);
		const html = await response!.text();

		// All work done, so free connection (IMPORTANT!)
		browser.disconnect();

		return new Response(
			`${launched ? "Launched" : "Connected to"} ${sessionId} \n-----\n` + html,
			{
				headers: {
					"content-type": "text/plain",
				},
			},
		);
	},

	// Pick random free session
	// Other custom logic could be used instead
	async getRandomSession(endpoint: puppeteer.BrowserWorker): Promise<string> {
		const sessions: puppeteer.ActiveSession[] =
			await puppeteer.sessions(endpoint);
		console.log(`Sessions: ${JSON.stringify(sessions)}`);
		const sessionsIds = sessions
			.filter((v) => {
				return !v.connectionId; // remove sessions with workers connected to them
			})
			.map((v) => {
				return v.sessionId;
			});
		if (sessionsIds.length === 0) {
			return;
		}

		const sessionId =
			sessionsIds[Math.floor(Math.random() * sessionsIds.length)];

		return sessionId!;
	},
};

Kromě puppeteer.sessions(), jsme přidali další metody usnadňující Správa relací.

5. Test

Spustit npx wrangler dev k lokálnímu testování vašeho Workeru.

Pro otestování přejděte na následující URL:

<LOCAL_HOST_URL>/?url=https://example.com

6. Nasaďte

Spustit npx wrangler deploy k nasazení Workeru do globální sítě Cloudflare a poté přejděte na následující URL adresu:

<YOUR_WORKER>.<YOUR_SUBDOMAIN>.workers.dev/?url=https://example.com