mubook-hon v2: EPUBビューアーをfoliate-jsに移行、Cloudflare Workersへ移行
mubook-honは、Dropboxに保存したEPUB/PDFファイルをブラウザで読めるウェブアプリです。 Notionと連携して、読書メモや進捗をNotionに記録できます。
- mubook-hon: https://mubook-hon.jser.workers.dev/
- GitHub: https://github.com/azu/mubook-hon
URLが https://mubook-hon.vercel.app/ から https://mubook-hon.jser.workers.dev/ に変更されました。
前回の記事から約2年半が経ち、大きな変更をしたので紹介します。
EPUBビューアーをBibiからfoliate-jsに移行
EPUBの表示エンジンをBibiからfoliate-jsに移行しました。
foliate-jsはFoliateというLinux向けの電子書籍リーダーのJavaScript実装です。 Web Componentベースで実装されており、カスタマイズ性の高い点が特徴です。
Bibiと比較して、次の点が改善されました。
- 初期化の高速化 - インクリメンタルパースにより、EPUBファイルの読み込みが高速化
- メモリ消費の削減 - メモリ管理の改善により、メモリ使用量が減少
- 仕組みの簡素化 - Bibiの時はMSWでService Workerプロキシを実装してBibiの求める形式/URLのパスで返す必要があり複雑だった。foliate-jsではこの回り道が不要になりシンプルに


9ゾーンタップ設定
画面を3x3の9ゾーンに分割し、各ゾーンにアクションを割り当てられるようになりました。
設定画面から、各ゾーンに「次ページ」「前ページ」「メニュー」「閉じる」「なし」を割り当てられます。 プリセットとして「Default」「Right Hand」「Left Hand」を用意しています。

VercelからCloudflare Workersへ移行
ホスティングをVercelからCloudflare Workersに移行しました。
Notion APIはCORSに対応していないため、ブラウザから直接APIを呼び出すことができず、プロキシが必要です。 VercelのServerless Functionsには4.5MBのBodyサイズ制限があり、今後の障壁になる可能性があるためCloudflare Workersへ移行しました。 Next.jsをstatic exportで公開し、Cloudflare Workersでプロキシを実装することで、同一ドメインでシンプルな構成になりました。
O’Reillyハイライトインポート
Kindleに加えて、Learning Platform - O’Reilly Japanのハイライトも半分自動でインポートできるようになりました。
インポートページでは、コピーボタンとブックマークレットを用意しています。 ブックマークレットをブックマークバーにドラッグしておけば、ワンクリックでハイライトを抽出して、それをmubook-hon形式でNotionにインポートできます。
最近のOreilly Learningでは、AI翻訳で日本語で書籍が読めることが多くなったので、Oreillyのアプリで読んでそのハイライトをNotionに取り込みたい時に使っています。
- Search | O’Reilly: 2026-01-01時点で928冊ある
ACM経由なら$174/yearで利用できるので、結構おすすめです。
IndexedDBのキャッシュ問題
Safari/iOSでは、IndexedDBにBlobを保存すると、ページ遷移時などにBlobの破損が発生しました。この問題はiOS 17.4.1から報告されており、iOS 18でも発生していました。 mubook-honでは、SWRのキャッシュ実装でこの問題が発生したため修正しました。
Blobオブジェクトのsizeやtypeプロパティは存在するものの、実際にデータを読み取ろうとすると壊れている状態になります。
対策として、BlobではなくArrayBufferを保存するように変更しました。
// Before: Blobを直接保存(Safariで破損する可能性あり)
await db.put('cache', blob, key);
// After: ArrayBufferとして保存
const arrayBuffer = await blob.arrayBuffer();
await db.put('cache', arrayBuffer, key);
// 読み出し時にBlobに変換
const arrayBuffer = await db.get('cache', key);
const blob = new Blob([arrayBuffer], { type: 'application/epub+zip' });
まとめ
mubook-honは、Dropboxに保存したEPUB/PDFファイルをブラウザで読めるウェブアプリ かつ 読書メモの管理ツールです。 自分でもよく使っていて、EPUBをよく読むためインクリメンタルにレンダリングできる方式を求めてfoliate-jsへ移行しました。
飛行機などで完全オフライン対応が欲しくなるため、Service Workerでの対応を検討しています。
また、Amazon、一部のKindle本がEPUBまたはPDF形式でのダウンロードに対応へ。2026年1月20日からというニュースもあり、EPUBリーダーの需要は増えそうです。
書籍リーダーは7回目(mubook-honを2回作り直してる)ぐらいですが、だいぶ満足度の上がるものを作れるようになった気がします。
- azu/mu-epub-reader
- azu/epub-to-text: EPUBをVoiceVoxで読み上げた動画にするツール。動画にすることでバックグラウンドでも音として聴ける(Kindleの読み上げはよく止まるので作った)。ページ捲り=シークバーになるというアイデア
- azu/bi-epub-reader
- azu/mu-pdf-viewer
- azu/pdf-markdown-annotator
- mubook-hon: https://mubook-hon.jser.workers.dev/
- GitHub: https://github.com/azu/mubook-hon
- mubook-honのNotionテンプレート: https://efcl.notion.site/mubook-hon-addce6c324d44d749a73748f92e3a1a6
お知らせ欄
JavaScript Primerの書籍版がAmazonで購入できます。
JavaScriptに関する最新情報は週一でJSer.infoを更新しています。
GitHub Sponsorsでの支援を募集しています。