ブラウザでの画面表示と印刷の描画差異に関する実践的考察
おごちゃん
タイトルとOGPはChatGPTが考えたものです。
ここのところ、ブログも書かずTwitterもあまりせず、ひたすらHieronymusを開発しています。
今やろうとしている諸々がだいたい一段落しようとしている(けどまだ)というのが現在の進捗です。 もう少ししたら、公開のGitHubに置く予定です。
前にもちょっと書きましたが、今回の大改訂を始める前に、フレームワークの変更を検討しました。
- WebpackをViteに変更
- SequelizeをPrismaに変更
- バックエンドもESM化
これらのうち、Vite化とESM化は無事完了していい感じになっていますが、Prisma化については9割程度できたところで致命的な問題にぶち当たり、rollbackしてSequelizeに戻しました。 まぁ実際にはgit戻すだけですけどね。
この辺についてChatGPTと雑談してまとめてもらったので、「他山の石」としてエントリにしておきます。
文体が謎なのは、ChatGPTがそーゆーテンションだったとゆーことです。
前説
暴走気味のChatGPTのエントリの前に、冷静だった頃のChatGPTとの会話を元に、この話の背景を書いておきます。
ChatGPTがまとめてくれてるのですが、
機能 | Prisma | Sequelize |
---|---|---|
モデルからマイグレーション生成 | ✅ prisma migrate で自動生成 |
❌ 手書き or 別ツール |
スキーマ定義の見通しの良さ | ✅ Prisma schemaで一元管理 | ❌ JS/TSで分散しがち |
型推論・TypeScriptとの親和性 | ✅ 超強い(ts守備範囲広い) | △ 定義によってまちまち |
IDE補完 | ✅ モデルやフィールドに補完が効く | △ モデル名文字列が多い |
まさにこれで、Prismaの開発フローは「まずモデル書いて、あとは prisma migrate dev
」で完了とわかりやすい。
ORMとDBの整合性とかで悩む余地もありませんから、間違う余地もありません。
そもそもSequelizeはCommonJS時代のものであって、それが随所に表れます。 ググればネットで知見が沢山得られるという点では非常に都合が良いのですが、まぁ何と言うか… 要するに時代遅れと思うところも少なくありません。 まぁ一番大きいのはESM対応がされてないに等しいことですかね。 「やり辛い状況にある」のは理解するのですが、この一点だけで「過去のもの感」を感じてしまいます。
安定稼動しているシステムであれば、多少「過去のもの感」があっても枯れている方が嬉しかったりするわけなので問題ではないのですが、「これからどんどんコード増えます」な場合であれば、「早めに未来の大きなフレームワーク(ライブラリ)に移行しよう」と思うものです。
Hieronymusの改良に力を入れ始めたのは、外からの問い合わせがあって、「これを元に」みたいな話が現実のものとなったからです。 なので、「ちゃんと動いている」という現状よりも「これから発展する未来」の方が大きいという前提があります。 そうなると、「早めに将来性のあるフレームワーク」という方向になるのは当然の帰結でしょう。
Sequelize以後のNode.js関係のデータ(ベース)フレームワーク(ライブラリ)は、群雄割拠と言っても良い状態にあります。 その中で、
- 比較的新しく、かつ実績がある
- ESMやTypeScriptにも対応している
- Sequelizeとの差分が少なめ
- 悪い噂が少ない
という基準で探して、Prismaが良いんじゃないの? という結論を出して、移行を始めた… というのが話の発端です。
以下はその後の愚痴をChatGPTにした後で「まとめておいて」と指示して出してくれた「まとめ」です。
🔧 Prismaは開発体験が最高。でも会計システムには致命的な穴があった。
- Prismaの利点:
- モデルを
schema.prisma
に一元管理できてスッキリ prisma migrate dev
でDB定義が一発反映、爆速開発- TypeScript補完も超快適で、安全性高め
generate
だけで型付きのクライアント生成 → 書いてて気持ちいい
- モデルを
🤩 「これもうSequelize捨ててPrismaでええやん」ってなって、移行作業に突入
📆 でも、時刻なし日付(DATEONLY)がない。
- 会計システムにおいて、「日付のみ」は死ぬほど重要
使用例 | 時刻なし日付が必要な理由 |
---|---|
仕訳日、伝票日 | 時刻が入ると比較や集計がズレる |
決算・締日 | 2025-03-31T00:00:00Z になると意図通りにならない |
税区分切替日 | 秒単位でもズレると大事故 |
- Prismaでは
DateTime
しか使えず、純粋な日付だけのカラムが作れない@db.Date
的な workaround もあるが、型が崩れたり扱いが面倒- 結果的にロジックが不安定 or 書きにくい or バグる
😇 「最後の最後に
DATEONLY
が無いことに気づいて、全滅」
☠️ 結果、移行失敗:半月かけた作業が無駄に
- Prisma移行は9割完成してた(コードもドキュメントも)
- でも最後に
DATEONLY
の問題に直面して完全撤退 - Gitで元に戻して、泣きながらSequelizeに戻すハメに…
😩 Sequelizeも地味にしんどいけど…
- ESM対応が不完全:
sequelize-cli
は CommonJS前提(require
,module.exports
)- ESMでやるなら全部手直しが必要(
import
,export
,import.meta.url
…)
- CLI生成コードは全部手修正(地味にツラい)
- とはいえ、業務要件(特にDATEONLY)に耐えられるのはSequelizeしかない
🛠 対策・方向性(現実的に)
内容 | 対策 |
---|---|
モデルとmigrationの同期 | 手動で丁寧に維持、CLI補助は使い過ぎない |
ESM対応 | CLIは捨てて、umzug などのモダンなmigration管理に移行するのもアリ(ただし今は移行困難) |
フロントとのコード共有 | 全体ESM化して、共通utilsやtypesをimportで共有する設計が現代的 |
Prismaの活用範囲 | 業務系以外(Web系、個人開発など)には超優秀。日付周りを使わなければOK。 |
🎤 最終結論
✅ 会計システムや業務アプリでは、Prismaは使うな。DATEONLYが無い時点で致命的。
✅ Sequelizeはつらいけど、DATEONLYが使えて、要件に耐えるという意味では唯一の選択肢。
✅ ESMとSequelizeは仲が悪いけど、手でなんとかするしかない現実。
✅ 一通り終わったら、
umzug
への移行や、SequelizeのESMテンプレ整備を検討すべし。
以下、私の話
↑に書いてあるように、SequelizeからPrismaへの移行については、他のアプリでもやりたいと思ったので、そのためのドキュメントまで整理して書きました。 最初のとっつきは別にしても、DBとモデルの整合性についてはPrismaの方が楽ですからね。
とは言え、たったDATEONLY型の扱いがダメなだけで、全部rollbackです。 GitHubのissueにもかなり前から挙がっていることなのですが、放置されたままです。 まぁオープンソースですから、文句言う暇があったら直せやって話は正論としてあるのですが、別に今そこやりたくないですし。
ということで、ChatGPTが出してる結論が、今のところは妥当な結論なのではないかなと思います。
ORMがDATEONLY型に対応していなくても、
- 自分で頑張って対応させる
- STRINGとして扱う
- DATE型にしてしまう
というような解決がないわけではありません。 と言うか、しばらく自分でも頑張ってみたのですが、「現時点でそれをやるのは徒労」という結論に至って、Prisma移行計画を中止しました。
途中のコードや移行手順書は残してあるので、PrismaのDATEONLY型がマトモになった時に、あらためて再開させても良いかなとは思っています。 もしかしてその時はもっと良いフレームワークがあるかも知れませんね。