Upgrade to Pro — share decks privately, control downloads, hide ads and more …

今日始め るCloudflare Browser Rendering

Avatar for itome itome
September 11, 2025
220

今日始め るCloudflare Browser Rendering

Avatar for itome

itome

September 11, 2025
Tweet

Transcript

  1. Browser Rendering って? Cloudflare 上でヘッドレスブラウザが利用できる Workers Binding もしくはREST API を使ってアクセスが可能

    ヘッドレスブラウザを操作するためのPuppeteer もしくはPlaywrite のフォークライブラリが公開されており、ローカル環境と変わらな い操作感で動かすことができる 7
  2. wrangler.jsonc にBinding を追加 { "name": "browser-worker", "main": "src/index.js", "compatibility_date": "2023-03-14",

    "compatibility_flags": [ "nodejs_compat" ], "browser": { "binding": "MYBROWSER" } } 13
  3. Binding を@cloudflare/puppetter に渡す import puppeteer from "@cloudflare/puppeteer"; export default {

    async fetch(request, env): Promise<Response> { const browser = await puppeteer.launch(env.MYBROWSER); /* puppeteerを使ったブラウザ操作ができる */ }, } satisfies ExportedHandler<Env>; 14
  4. Browser Rendering でできること puppeteer のAPI はfull support されているため、puppeteer でできる ことはできると考えて良い

    const browser = await puppeteer.launch(env.MYBROWSER); const page = await browser.newPage() // ビューポートサイズ設定 await page.setViewport({ width: 1280, height: 800 }); // ページ遷移 await page.goto('https://example.com', { waitUntil: 'networkidle2' // ネットワークが落ち着くまで待機 }); 15
  5. Browser Rendering でできること puppeteer のAPI はfull support されているため、puppeteer でできる ことはできると考えて良い

    const page = await browser.newPage() // キーボード操作 await page.keyboard.press('Enter'); await page.keyboard.type('Hello World'); // マウス操作 await page.mouse.move(100, 100); await page.mouse.click(100, 100); await page.hover('.menu-item'); 16
  6. Browser Rendering でできること puppeteer のAPI はfull support されているため、puppeteer でできる ことはできると考えて良い

    const page = await browser.newPage() // スクリーンショット await page.screenshot({ path: 'fullpage.png', fullPage: true }); 17
  7. Browser Rendering でできること puppeteer のAPI はfull support されているため、puppeteer でできる ことはできると考えて良い

    const page = await browser.newPage() // PDFの生成 await page.pdf({ path: 'page.pdf', format: 'A4', printBackground: true }); 18
  8. puppeteer の拡張API 本家のpuppeteer API を拡張する形でBrowser Binding 特有の関数が いくつか追加されている 主にSession Management

    をするための関数が提供されている const limits = await puppeteer.limits(env.MYBROWSER); const history = await puppeteer.history(env.MYBROWSER); const sessions = await puppeteer.sessions(env.MYBROWSER); 19
  9. Browser Rendering の厳しい制限 Browser Rendering のブラウザは同時に3 つ( 有料版は10) までしか起 動しておけない

    Browser Rendering のブラウザは1 分間に3 つ( 有料版は10) までしか 新しく起動できない 21
  10. Session Management puppeteer.launch() の代わりに puppeteer.connect() で既存のセッシ ョンに接続 const sessions =

    await puppeteer.sessions(env.MYBROWSER) const freeSessions = sessions.filter((s) => !s.connectionId) let session: Browser if (freeSessions.length === 0) { session = await puppeteer.launch(env.MYBROWSER) } else { session = await puppeteer.connect(env.MYBROWSER, freeSessions[0].sessionId) } 24
  11. 例: SaaS でのPDF 出力機能 法令対応や紙での業務があるクライアント向けにPDF を出力したい ケースは多い Cloudflare Workers 上でPDF

    を生成するのは意外と大変 既存のPDF ライブラリはNode.js 環境を前提としたものも多く、 Worker で素直に使える選択肢は少ない また複雑な組版のPDF ドキュメントは入れる文字数によってレイア ウト崩れが起きやすい → Browser Rendering を使ってHTML をそのままPDF にしよう! 27
  12. 料金 有料プランの場合 起動時間が1 ヶ月に10 時間まで無料 それ以上は$0.09/1 時間 並列起動数が10 個まで無料 それ以上は$2.00/1

    並列 ただし並列起動数は月の平均で計算 1 日だけ300 並列させても他の日に全く使わなければ無料枠に収 まる 32