pub_markdown のビルドプロセスでは、SVG→PNG 変換 (rsvg-convert.js) や Mermaid 図のレンダリング (mmdc) において Puppeteer 経由で Chromium ブラウザを使用します。共有ブラウザインスタンス機構により、ビルド全体で 1 つのブラウザを使い回すことで起動コストを削減しています。
Puppeteer による Chromium 起動には約 1〜2 秒を要します。ビルド対象に多数の SVG 画像や Mermaid 図が含まれる場合、以下の累積コストが発生します。
例えば SVG 画像 10 個と Mermaid 図 5 個を含むドキュメントの場合、ブラウザの起動だけで 15〜30 秒のオーバーヘッドが発生してしまいます。
browser-server.js # 共有ブラウザサーバー (新規)
mmdc-reuse.js # 共有ブラウザ対応 Mermaid レンダラー (新規)
rsvg-convert.js # SVG→PNG 変換 (共有ブラウザ対応に改修)
mmdc-wrapper.sh # Mermaid CLI ラッパー (共有ブラウザ対応に改修)
pub_markdown_core.sh # メインビルドスクリプト (ライフサイクル管理を追加)
| 変数名 | 説明 |
|---|---|
PUB_MARKDOWN_BROWSER_WS_FILE |
WebSocket エンドポイントが書かれたファイルのパス |
/tmp/pub_markdown_browser_ws_<PID> (PID は pub_markdown_core.sh のプロセス ID)ws://127.0.0.1:<PORT>/devtools/browser/<UUID> 形式の WebSocket URL共有ブラウザの起動と管理を行うサーバースクリプトです。
puppeteer.launch({ args: ['--no-sandbox'] })chrome-wrapper.sh は適用しません (WebSocket 競合回避はファイルベースの待機で代替)接続ロジック:
PUB_MARKDOWN_BROWSER_WS_FILE 環境変数を確認puppeteer.connect() で接続puppeteer.launch() にフォールバックリソース管理:
page.close() でページのみ閉じ、browser.disconnect() で切断browser.close() でブラウザごと閉じる@mermaid-js/mermaid-cli の mmdc コマンドの代替として動作する Mermaid レンダラーです。
対応オプション:
-i <input.mmd>: 入力ファイル (Mermaid ダイアグラムコード)-o <output.svg>: 出力ファイル (SVG)-b transparent: 背景色 (デフォルト: white)Mermaid ライブラリの検出:
以下の優先順位でブラウザバンドル (mermaid.min.js) を探索します。
require.resolve('mermaid/package.json') 経由require.resolve('@mermaid-js/mermaid-cli/package.json') 経由のネスト検索node_modules/mermaid/dist/mermaid.min.js (スクリプトディレクトリ起点)node_modules/@mermaid-js/mermaid-cli/node_modules/mermaid/dist/mermaid.min.jsレンダリング処理:
addScriptTag() で読み込みmermaid.render() でダイアグラムを SVG にレンダリングif PUB_MARKDOWN_BROWSER_WS_FILE が存在する
→ mmdc-reuse.js を使用 (共有ブラウザ経由)
else
→ mmdc を使用 (chrome-wrapper.sh 経由)起動シーケンス:
PUB_MARKDOWN_BROWSER_WS_FILE 環境変数を設定browser-server.js をバックグラウンドで起動停止処理:
kill → wait → ファイル削除trap ハンドラ (SIGINT/SIGTERM) で同じ停止処理を実行browser-server.js の起動時に prepare_puppeteer_env.sh を適用すると、以下の無限ループが発生する可能性があります:
pub_markdown_core.sh が prepare_puppeteer_env.sh を source → PUPPETEER_EXECUTABLE_PATH = chrome-wrapper.shrsvg-convert シェルスクリプトが prepare_puppeteer_env.sh を再度 source → ORG_PUPPETEER_EXECUTABLE_PATH = chrome-wrapper.shpuppeteer.launch() が chrome-wrapper.sh を起動chrome-wrapper.sh が ORG_PUPPETEER_EXECUTABLE_PATH を復元 → PUPPETEER_EXECUTABLE_PATH = chrome-wrapper.shpuppeteer.executablePath() が chrome-wrapper.sh を返す → 無限ループこの問題を避けるため、browser-server.js は prepare_puppeteer_env.sh を経由せず、Puppeteer のデフォルトブラウザ検出を使用します。
| プラットフォーム | browser-server.js のブラウザ | フォールバック時のブラウザ |
|---|---|---|
| Linux | Puppeteer バンドルの Chromium | chrome-wrapper.sh 経由の Chromium |
| WSL | Puppeteer バンドルの Chromium | chrome-wrapper.sh 経由の Chromium |
| Windows (Git Bash) | Edge (PUPPETEER_EXECUTABLE_PATH 経由) |
Edge (PUPPETEER_EXECUTABLE_PATH 経由) |
共有ブラウザが利用できない場合は、都度ブラウザを起動します。
browser-server.js の起動失敗 (Chromium が見つからない等)PUB_MARKDOWN_BROWSER_WS_FILE 環境変数が未設定になりますrsvg-convert.js は puppeteer.launch() で自前のブラウザを起動しますmmdc-wrapper.sh は mmdc コマンドを使用しますbrowser-server.js は Puppeteer のデフォルトブラウザ検出に依存するため、chrome-wrapper.sh のバージョンフォールバック機能は利用されませんmmdc-reuse.js は @mermaid-js/mermaid-cli に同梱される mermaid ライブラリのブラウザバンドルに依存します