Server Component が非同期処理(データフェッチ等)を含む場合、その完了までページ全体のレンダリングがブロックされる。Suspense 境界で囲むことで、該当コンポーネントの処理完了を待つ間 fallback を表示しつつ、ページの残りを先行してクライアントへストリーミングできる。
import { Suspense } from 'react';
export default function Page() {| /** | |
| * 下方向に三角形のしっぽを持つ吹き出し形状。 | |
| * CSS shape() 関数を使用し、clip-path で切り抜く。 | |
| * border-shape でボーダーを描画する。 | |
| */ | |
| .balloon { | |
| padding-block: 40px calc(40px + calc(12px * tan(60deg))); | |
| padding-inline: clamp(24px, 5%, 48px); | |
| clip-path: shape( | |
| from 12px 0, |
| /** | |
| * 2カラムレイアウト(サイドバー + メインコンテンツ) | |
| */ | |
| .layout { | |
| display: flex; | |
| } | |
| .sidebar { | |
| width: 200px; |
Server Component が非同期処理(データフェッチ等)を含む場合、その完了までページ全体のレンダリングがブロックされる。Suspense 境界で囲むことで、該当コンポーネントの処理完了を待つ間 fallback を表示しつつ、ページの残りを先行してクライアントへストリーミングできる。
import { Suspense } from 'react';
export default function Page() {| export const ROUTES = { | |
| // トップページ | |
| HOME: '/', | |
| // 静的ページ | |
| ABOUT: '/about', | |
| CONTACT: '/contact', | |
| PRIVACY_POLICY: '/privacy-policy', | |
| // ニュース(一覧 + 動的詳細ページ) |
| .box { | |
| margin-top: 150vh; | |
| margin-bottom: 150vh; | |
| width: 100%; | |
| height: 50vh; | |
| background-color: red; | |
| } | |
| .box { | |
| /* timeline-triggerとanimation-triggerを、--box-triggerという同名を用いて紐付ける */ |
「Cookie を httpOnly にすれば JavaScript から読めないので安全」
半分正しく、半分間違い。httpOnly 属性は document.cookie 経由での読み取りを防ぐが、Cookie を読めなくても悪用できるという点が見落とされがち。
また、httpOnly は「Cookie 窃取による恒久的なセッションハイジャック(別端末からのログイン)」を防ぐ防具ではあるが、「今その瞬間、ユーザーのブラウザを操ること」は防げない。即死を避けるヘルメットであり、飛んでくる矢(XSS)そのものを防ぐ盾ではない。
GitHub Dependabot による依存関係の自動更新管理。
microCMSはヘッドレスCMSであり、APIでJSONを返すだけで、HTMLのレンダリング機能を持たない。下書きコンテンツが公開後にサイト上でどう表示されるかを確認するには、Next.js側に「下書きデータを受け取って本番と同じレイアウトで描画するモード」を実装する必要がある。
ISRで静的生成しているページで draftMode() や cookies() を isEnabled の分岐外(=関数のトップレベルなど)で呼ぶと、Next.jsはそのページを動的ページと判定する。結果、全リクエストでサーバー実行され、ビルド時生成のHTMLキャッシュが使われなくなる。isEnabled === true の分岐内に閉じ込めれば、isEnabled === false 時は静的生成済みHTMLがそのまま返る。