この
変形の
でも、
と
機能
必要な写真ポートフォリオを
参考に
参考に
この
必要な
- EXIF データを
表示する - モーダルで
画面いっぱいに 画像を 表示する - GitHub で
画像、 メタデータを 管理する
あくまで
実装
機能の 管理方 法
画像の画像や
この
画像の
---path: "/photos/2019-08-14/01.jpg"camera: "Canon EOS 60D"lens: "EF-S18-55mm f/3.5-5.6 IS II"fNumber: 8focalLength: 55shutterSpeed: "1/160"iso: 100status: publishedpublishedAt: 2019-08-14---
基本的に
写真に
フォーマットは
# 「撮影日 / 作成日時の古い順にカウントした番号」2019-08-14 / 10
これなら、
上述した
カメラ名や
export type Lens = Record<"name" | "manufacturer", string>;
export const lenses = [ { name: "EF-S18-55mm f/3.5-5.6 IS II", manufacturer: "Canon", }, { name: "EF-S55-250mm f/4-5.6 IS II", manufacturer: "Canon", }, { name: "FE 55mm F1.8 ZA", manufacturer: "SONY", },] as const satisfies Lens[];
export const lensNames = lenses.map(({ name }) => name);
こうする
const Photo = defineDocumentType(() => ({ name: "Photo", filePathPattern: "photos/**/*.md", fields: { path: { type: "string", required: true, }, camera: { type: "enum", options: cameraNames, required: true, }, lens: { type: "enum", options: lensNames, required: true, }, // ... },}));
この
ビルド時には、
- 画像の
横幅・縦幅の 取得 - ページの
レイアウトを 崩さないために、 事前に 画像サイズを 取得 - Plaiceholderを
使った Blur 画像の 生成 - 高解像度の
写真を 表示する 前に、 ぼかし画像を 一瞬 挟むことで スムーズな UX を 提供
- 高解像度の
ただし、
実装
モーダル機能の普通の
具体的な
- 画像を
クリックすると モーダルが 開く - ページを
リロードすると モーダルではなく 写真ページ全体が レンダリングされる - 直接 URL を
開くと Intercept されずに 写真ページが そのまま 表示される
言葉だけでは
Intercepting Routes を
- モーダルコンテンツが
URL 経由で 共有可能に なる - ページを
更新しても モーダルの コンテキストが 保持される - ブラウザバックで
前の ページに 戻るのではなく モーダルが 閉じる - ブラウザフォワードで
モーダルを 再度開ける
今回は
な
生成で 詰まった
OGP 画像の写真詳細ページのopengraph-image.tsx
を
ローカルで
OGP 画像の
- リクエストされた
slug
に基づき、 該当する 写真データを 取得する - 環境変数を
基に 画像の フル URL を 作成し、 その 画像データを 外部から fetch
する - フェッチが
成功した 場合、 その 画像を カスタムデザインに 埋め込み OGP 画像と して 返す - フェッチが
失敗した 場合や 該当画像が 存在しない 場合は 404 エラーを 返す
今回問題だったのはVERCEL_URL
を
const url = `https://${env.VERCEL_URL || "http://localhost:3000"}${path}`;
デプロイ先のVERCEL_URL
とhttps://kkhys.me
のような)。
しかし、https://xxx.vercel.app
とfetch
していた
つまり、VERCEL_URL
を
const baseUrl = env.VERCEL_ENV === "production" ? `https://${env.VERCEL_PROJECT_PRODUCTION_URL}` : env.VERCEL_URL ? `https://${process.env.VERCEL_URL}` : "http://localhost:3000";
VERCEL_ENV
でVERCEL_PROJECT_PRODUCTION_URL
で
これで、
- 本番環境 →
https://kkhys.me
- プレビュー環境 →
https://xxx.vercel.app
- ローカル環境 →
http://localhost:3000
が
結果、
追加したい 機能
今後写真の
- トップページに
写真の カルーセルを 表示させる - 写真詳細ページに
他の 写真の カルーセルを 表示させる - モーダルを
リロードせずとも、 写真詳細ページに 飛べるように する (良い 感じの UI が 思い付かない) - 画像枚数が
増えてきたら、 無限スクロール的な UI に する - タグ付け機能を
追加する - カメラや
レンズなどの フィルタリング機能を 追加する - 撮影日時で
ソートできるように する - EXIF データを
入力するのが 面倒すぎるので、 写真を アップロードしたら フォーマットされた EXIF データが 出力される ジェネレータを 作る - 表示方
法を 選択可能に する (Flow or Thumbs) - (コメント機能を
追加する) - (Good ボタンを
追加する)