Excel講座の演習移行・SVG33件一括生成・R2メディア完全移行の作業記録
前日に60ファイル・110セクションの本体移行を終えていたので、今日は演習ページの移行から手をつけた。ChatBoxやExcelDownloaderなど演習固有のコンポーネントを4つ作り、旧演習23件を変換して流し込んだ。そこからSVGチャートの一括生成、R2へのメディア完全移行、UIレイアウト改善と手を広げていったら、コミットログが膨れ上がった。
1. 演習移行 Phase 1-4
演習コンポーネント4種の作成
演習ページは通常の講義セクションと構造が異なる。上司とのチャット形式で指示を出し、Excelファイルをダウンロードして手を動かす形式。この構造を再現するため4つのコンポーネントを新規作成した。
| コンポーネント | 役割 |
|---|---|
| ChatBox | 上司/あなたの会話吹き出し |
| ExcelDownloader | Excelファイルのダウンロードカード |
| ExerciseRenderer | ChatBox + Downloader + 手順を統合表示 |
| TheaterViewer exercise props | 既存ViewerにExercise表示モードを追加 |
旧演習23件の変換
変換対象の内訳は以下の通り。
| カテゴリ | 件数 |
|---|---|
| VLOOKUP | 5 |
| INDEX-MATCH | 5 |
| 実務演習 | 6 |
| 総合演習 | 4 |
| 絶対参照 | 2 |
| IF | 2 |
| IFERROR / SUMIFS / INDIRECT / 検索置換貼付 | 各1 |
旧ファイルの演習データを新しいExerciseRenderer形式に一括変換した。関数チャプター直下にぶら下がっていた演習セクションは独立チャプターに分離し、tocExcel.tsのchildrenに登録した。
2. Part 2/3/4の移行とショートカット講座の独立移行
Part 2-4の新規作成
| Part | 内容 |
|---|---|
| Part 2 | わかりやすいシートの作り方 |
| Part 3 | NG集 |
| Part 4 | ファイル・フォルダ命名ルール |
それぞれデータファイル新規作成、TOC登録、ページファイル作成の3点セットで移行した。
ショートカット講座の集約
旧プロジェクトでは59ページに散らばっていたショートカット講座を、8ページのMiller Columnに集約した。49個のショートカット詳細をまとめページに統合し、R2へのメディアアップロードは71件に達した。59ページを開き直す時間が消えて、Miller Columnで一覧からドリルダウンする操作に変わった。
3. SVGチャート33件の一括生成
配色ルール、数値の表示(シート間で単位がバラバラなままSUMするバグの図解)、セル結合のNG/Good対比など、Excel操作の図解SVGを33件生成した。
Content-Typeの罠
R2にSVGをアップロードしてブラウザで開いたら、XMLがテキストとして表示された。R2のデフォルトContent-Typeがapplication/octet-streamになっていて、image/svg+xmlを明示的に設定する必要があった。wranglerの--content-typeフラグで解決したが、最初は「SVGが壊れている」と疑って中身を見に行ってしまい、時間を溶かした。
CDNキャッシュパージ
Content-Typeを修正して再アップロードしても、ブラウザには古いレスポンスがキャッシュされていて変化がない。CloudflareのCDNキャッシュをパージして、ようやく正しく表示された。「修正したのに直らない」ときは、まずキャッシュを疑う。
4. R2メディア一括移行
WordPressのCDN URLをCloudflare R2に完全移行した。
| 種別 | 件数 |
|---|---|
| MP4 | 13 |
| GIF | 14 |
| 画像 | 8 |
| XLSX | 複数 |
| SVG | 35 |
CSPのimg-src問題
R2のカスタムドメインからの画像配信がCSPでブロックされた。DevToolsのコンソールにCSP違反のエラーが並んでいて、img-srcディレクティブにR2のドメインを追加して解消した。前日のWordPress CDNドメイン追加と同じパターン。CSPは新しいドメインからアセットを配信するたびに更新が要る。
5. UIレイアウト改善
ChatBoxのアバター統合
アバターアイコンがメッセージの外に出ていてスペースを食っていた。アバターをメッセージ内部のヘッダー行に統合し、横幅を節約した。
ダウンロードカードのグリッド化
ダウンロードカードが縦に並んでいて、3件あるとスクロールが長くなっていた。横並びグリッドに変更して、一画面に収まるようにした。
overflow設定の試行錯誤
theaterコンテンツが独立スクロールしてしまう問題に遭遇した。親コンテナにoverflow: autoが設定されていて、子要素がはみ出したときに親だけでスクロールが完結してしまう。ページ全体のスクロールと分離して、ユーザーがどこをスクロールしているか分からなくなる。
overflow: visibleにしたらはみ出しが起きて別の問題が出た。最終的にoverflow: hiddenで子要素のはみ出しを切り捨てつつ、コンテンツ側の高さを適切に計算する方式で落ち着いた。overflowは設定値ごとに副作用が異なるので、一つずつ試して副作用を確認するしかなかった。
theater-articleモード追加
白背景ボックスで囲まれたtheater表示ではなく、通常の記事のように白背景なしで表示するモードを追加した。コンテンツの性質によって表示形式を切り替えられる。
その他の改善
- セクションタイトルをヘッダーに表示、ページ番号を右寄せ
- 外部リンクにアンダーライン + 外部リンクアイコンを追加
- ブラウザ履歴連動:
history.pushState/popstateでAlt+左右矢印によるセクション間の「戻る」を実現
6. stageHtml概要セクションとコンテンツ品質改善
概要セクション追加
4ファイル16箇所にサマリーテーブル付き概要セクションを追加した。講座の各パートの冒頭で「ここで何を学ぶか」が一覧で見える。
コンテンツ品質改善
- typo修正:
XLLOKUP→XLOOKUP(Lが1個多い) - 口調の敬語統一
- 凡例に記号の説明を追加
- 基本機能セクションにユースケースを追加
- コースタイトルを「経理会計データを扱うためのExcel基礎講座」に変更
イントロダクション移行
対象者、特徴、背景、3つのポイント、ゴール、講座の構成、本講座で扱わないこと、を旧プロジェクトから移行した。
今日の学び
SVGのContent-Type問題は、原因の候補が「SVGファイルの中身が壊れている」「R2の設定」「CDNキャッシュ」の3つあって、最初に一番ありそうにない「ファイルが壊れている」から調べてしまった。R2にアップロードするときのメタデータ設定を先に確認していれば、30分は縮められた。問題の原因を推定するとき、インフラ層(配信設定)→アプリ層(ファイル内容)の順で当たるべきだと体で覚えた。
overflowの試行錯誤も同じ構造で、auto / visible / hidden / scrollの4値それぞれが異なる副作用を持っていて、仕様だけ読んでも実際のレイアウトへの影響は予測しきれない。DevToolsで一つずつ切り替えて副作用を目視する方が、結局は速かった。