preview-server: サーバーで変換する

examples/preview-server — サーバーがすべての文書を 1 度 BDF に変換してキャッシュします。ブラウザは変換済みの BDF を取得して描くだけで、wasm の変換器は一切使いません。

cd examples/preview-server
node web/build.mjs     # web/main.js と web/lib/worker.js をビルド(変換器なし)
go run .
open http://127.0.0.1:8082/

サーバーがすること

main.go は文書のディレクトリ(-dir。既定は ../sample-files)を走査し、キャッシュ済みの BDF がまだない文書ごとに converter.ConvertFile で変換し、結果を (*bdf.Document).WriteSingle で -cache の下に書き出し、light-server と同じ方法でサムネイルも描きます。今回はどちらも保存します。公開するのは:

http.FileServer は自分で Range リクエストに応えるので(net/http の ServeContent)、ビューアは表示中のページに要る BDF の部分だけを取得します。サーバーでの変換経路で CDN からバンドルを取得するのと、そこは変わりません。

ブラウザがすること

web/main.ts は ?src= を MiniViewer でそのまま開きます。変換するものが何も残っていないので、変換器も sniff() もありません。web/build.mjs はレンダラ Worker だけをビルドします(buildWorkers(lib, { convert: false }))。このフロントエンドは数百 KB で、数十 MB にはなりません。

ビューアが取得して描くのは表示範囲の近くのページだけなので、ブラウザ自身の検索では文書の残りが見つかりません。このページは MiniViewer に find: "page" を渡しています。Cmd+F / Ctrl+F でビューアの検索バーが開き、View 全体のテキスト索引を探します。ページを取得するのは、これまでどおりそのページが表示されるときと、そのページの一致へ移るときだけです。

この形にした理由

light-server とは逆のトレードオフです。変換はサーバーで 1 度だけ、他の BDF ツールと同じ変換パッケージで行われます(ここでも cgo も外部プロセスも不要です。なぜ BDF かを参照)。ブラウザごと・表示のたびではありません。文書は BDF を Range 取得できる速さのまま、どの端末でも、変換器をダウンロードせずに開きます。ただし、その分だけサーバー自身の変換の余力と、キャッシュを置く場所が要ります。文書が頻繁に編集され、多くの読み手が見るシステムなら、たいていこちらが有利です。同じ変換済みテキストを全文検索に使う話は search を参照してください。