• #eurekapu-nuxt4
  • #Excel講座
  • #SVG
  • #Cloudflare R2
  • #CSP
  • #UI改善
  • #演習移行
開発eurekapu-nuxt4メモ

Excel講座の演習移行・SVG33件一括生成・R2メディア完全移行の作業記録

前日に60ファイル・110セクションの本体移行を終えていたので、今日は演習ページの移行から手をつけた。ChatBoxやExcelDownloaderなど演習固有のコンポーネントを4つ作り、旧演習23件を変換して流し込んだ。そこからSVGチャートの一括生成、R2へのメディア完全移行、UIレイアウト改善と手を広げていったら、コミットログが膨れ上がった。


1. 演習移行 Phase 1-4

演習コンポーネント4種の作成

演習ページは通常の講義セクションと構造が異なる。上司とのチャット形式で指示を出し、Excelファイルをダウンロードして手を動かす形式。この構造を再現するため4つのコンポーネントを新規作成した。

コンポーネント役割
ChatBox上司/あなたの会話吹き出し
ExcelDownloaderExcelファイルのダウンロードカード
ExerciseRendererChatBox + Downloader + 手順を統合表示
TheaterViewer exercise props既存ViewerにExercise表示モードを追加

旧演習23件の変換

変換対象の内訳は以下の通り。

カテゴリ件数
VLOOKUP5
INDEX-MATCH5
実務演習6
総合演習4
絶対参照2
IF2
IFERROR / SUMIFS / INDIRECT / 検索置換貼付各1

旧ファイルの演習データを新しいExerciseRenderer形式に一括変換した。関数チャプター直下にぶら下がっていた演習セクションは独立チャプターに分離し、tocExcel.tsのchildrenに登録した。


2. Part 2/3/4の移行とショートカット講座の独立移行

Part 2-4の新規作成

Part内容
Part 2わかりやすいシートの作り方
Part 3NG集
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に完全移行した。

種別件数
MP413
GIF14
画像8
XLSX複数
SVG35

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修正: XLLOKUPXLOOKUP(Lが1個多い)
  • 口調の敬語統一
  • 凡例に記号の説明を追加
  • 基本機能セクションにユースケースを追加
  • コースタイトルを「経理会計データを扱うためのExcel基礎講座」に変更

イントロダクション移行

対象者、特徴、背景、3つのポイント、ゴール、講座の構成、本講座で扱わないこと、を旧プロジェクトから移行した。


今日の学び

SVGのContent-Type問題は、原因の候補が「SVGファイルの中身が壊れている」「R2の設定」「CDNキャッシュ」の3つあって、最初に一番ありそうにない「ファイルが壊れている」から調べてしまった。R2にアップロードするときのメタデータ設定を先に確認していれば、30分は縮められた。問題の原因を推定するとき、インフラ層(配信設定)→アプリ層(ファイル内容)の順で当たるべきだと体で覚えた。

overflowの試行錯誤も同じ構造で、auto / visible / hidden / scrollの4値それぞれが異なる副作用を持っていて、仕様だけ読んでも実際のレイアウトへの影響は予測しきれない。DevToolsで一つずつ切り替えて副作用を目視する方が、結局は速かった。