← Browser Run / browser-run / features
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í:
- Odpojení a opětovné připojení (popsáno na této stránce): Použijte
browser.disconnect()místobrowser.close()k udržení prohlížeče aktivního a poté se k němu při dalším požadavku znovu připojte. Nejvhodnější pro bezstavové úlohy, kde postačí libovolná dostupná relace prohlížeče. - Durable Objects: Uchovejte dlouho běžící prohlížeč uvnitř Durable Object pro stavovou správu relací. Nejlépe se hodí, když potřebujete zachovat stav napříč požadavky nebo směrovat konkrétní uživatele na konkrétní instance prohlížeče.
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-workerPři nastavení vyberte následující možnosti:
- Pro S čím byste chtěli začít?, vyberte
Hello World example. - Pro Jakou šablonu chcete použít?, vyberte
Worker only. - Pro Jaký jazyk chcete použít?, vyberte
TypeScript. - Pro Chcete používat git pro správu verzí?, vyberte
Yes. - Pro Chcete nasadit svou aplikaci?, vyberte
No(před nasazením provedeme ještě několik změn).
2. Instalace Puppeteer
Ve vašem browser-worker adresáři nainstalujte balíček Cloudflare fork Puppeteeru:
npm i -D @cloudflare/puppeteer3. 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.com6. 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