リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: RPGストーリーフォージ AI風ドット絵冒険
JS/CSSアセットのバンドル結合によるリクエスト数削減で画面表示・マップ遷移を高速化
1. 目的:
これまでAPCu/gzip/永続接続/オフスクリーン描画キャッシュ/ペイロード圧縮など通信・処理経路の高速化を積み重ねてきたが、ブラウザが個々のJS/CSSファイルを都度リクエストしている場合、特にスマホ回線でのHTTP接続数増加がホーム/パーティ編成/プレイ画面初回表示やマップ遷移直後の初期化を遅らせる要因になる。ここではファイル数そのものを減らし、初回表示・画面遷移全体の体感速度を上げる。
2. 具体的仕様:
- lib.php に rpgsf_bundle_assets(array $files, string $type): string を追加。$type は 'js' か 'css'。
- 対象ファイル群のmtimeとサイズからハッシュ(例: md5)を計算し、storage/cache/bundle_{type}_{hash}.{js|css} が既に存在すればそのURLを即返す(以降は毎回ファイル読み込みなしでキャッシュヒット、必要ならAPCuにパスをキャッシュしてfilemtime呼び出しも省略)。
- 存在しなければ対象ファイルを結合し(CSSはコメント/連続空白の簡易圧縮、JSは末尾セミコロン補完のみの安全な結合)storage/cache/に書き出し、以後はそのファイルを配信する。
- 結合・書き込みに失敗した場合(パーミッション等)は個別ファイルの<script>/<link>タグ配列にフォールバックし、既存動作を壊さない。
- rpgsf_render_header()/rpgsf_render_footer()(またはヘッダー・フッター描画箇所)で、現在複数の<script src>/<link rel=stylesheet>として読み込んでいる自作JS/CSS群を、共通部分(全ページ共通)とページ固有部分(playページ専用など)の2バンドルに分けて出力する。外部CDNやインラインscriptはそのまま個別出力を維持し対象外とする。
- バンドルURLには既存の rpgsf_asset_url() と同様にmanifestバージョン+内容ハッシュをクエリ文字列で付与し、リリースごとに自動的にキャッシュバスティングされるようにする(.htaccessの1週間キャッシュ設定と組み合わせてブラウザキャッシュを最大活用)。
- storage/cache/ ディレクトリは既存の.htaccessで /storage/ への直接アクセスが404になっているため追加のセキュリティ設定は不要。ビルド生成物のみを置く運用とする。
- 管理用に、config.php で 'asset_bundle' => true/false のフラグを用意し、falseの場合は従来通り個別ファイル出力にフォールバックできるようにする(検証・切り戻しを容易にする)。
3. 既存機能との整合:
- 個々のJS/CSSファイルの中身・機能は一切変更しない。単に配信時にまとめるだけなので、Service Workerによるキャッシュファースト読み込み、Ajax通信のgzip圧縮、マップ描画キャッシュなど既存の高速化施策とは独立して併用可能。
- バンドル生成に失敗した場合は既存の個別ファイル出力にそのままフォールバックするため、後方互換かつ安全。
- PHPのみで完結し、外部ビルドツールやAPIキーは不要。
これまでAPCu/gzip/永続接続/オフスクリーン描画キャッシュ/ペイロード圧縮など通信・処理経路の高速化を積み重ねてきたが、ブラウザが個々のJS/CSSファイルを都度リクエストしている場合、特にスマホ回線でのHTTP接続数増加がホーム/パーティ編成/プレイ画面初回表示やマップ遷移直後の初期化を遅らせる要因になる。ここではファイル数そのものを減らし、初回表示・画面遷移全体の体感速度を上げる。
2. 具体的仕様:
- lib.php に rpgsf_bundle_assets(array $files, string $type): string を追加。$type は 'js' か 'css'。
- 対象ファイル群のmtimeとサイズからハッシュ(例: md5)を計算し、storage/cache/bundle_{type}_{hash}.{js|css} が既に存在すればそのURLを即返す(以降は毎回ファイル読み込みなしでキャッシュヒット、必要ならAPCuにパスをキャッシュしてfilemtime呼び出しも省略)。
- 存在しなければ対象ファイルを結合し(CSSはコメント/連続空白の簡易圧縮、JSは末尾セミコロン補完のみの安全な結合)storage/cache/に書き出し、以後はそのファイルを配信する。
- 結合・書き込みに失敗した場合(パーミッション等)は個別ファイルの<script>/<link>タグ配列にフォールバックし、既存動作を壊さない。
- rpgsf_render_header()/rpgsf_render_footer()(またはヘッダー・フッター描画箇所)で、現在複数の<script src>/<link rel=stylesheet>として読み込んでいる自作JS/CSS群を、共通部分(全ページ共通)とページ固有部分(playページ専用など)の2バンドルに分けて出力する。外部CDNやインラインscriptはそのまま個別出力を維持し対象外とする。
- バンドルURLには既存の rpgsf_asset_url() と同様にmanifestバージョン+内容ハッシュをクエリ文字列で付与し、リリースごとに自動的にキャッシュバスティングされるようにする(.htaccessの1週間キャッシュ設定と組み合わせてブラウザキャッシュを最大活用)。
- storage/cache/ ディレクトリは既存の.htaccessで /storage/ への直接アクセスが404になっているため追加のセキュリティ設定は不要。ビルド生成物のみを置く運用とする。
- 管理用に、config.php で 'asset_bundle' => true/false のフラグを用意し、falseの場合は従来通り個別ファイル出力にフォールバックできるようにする(検証・切り戻しを容易にする)。
3. 既存機能との整合:
- 個々のJS/CSSファイルの中身・機能は一切変更しない。単に配信時にまとめるだけなので、Service Workerによるキャッシュファースト読み込み、Ajax通信のgzip圧縮、マップ描画キャッシュなど既存の高速化施策とは独立して併用可能。
- バンドル生成に失敗した場合は既存の個別ファイル出力にそのままフォールバックするため、後方互換かつ安全。
- PHPのみで完結し、外部ビルドツールやAPIキーは不要。
💬 返信 (3)
🛠 開発を開始しました (機能追加 rpg-story-forge)
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「RPGストーリーフォージ AI風ドット絵冒険」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=rpg-story-forge
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/rpg-story-forge/
ご利用ありがとうございます!
(deploy 自動リカバリにより通知が遅延した可能性があります。 DEPLOY-RECOVERY-01)
ご要望いただいた「RPGストーリーフォージ AI風ドット絵冒険」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=rpg-story-forge
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/rpg-story-forge/
ご利用ありがとうございます!
(deploy 自動リカバリにより通知が遅延した可能性があります。 DEPLOY-RECOVERY-01)
Echo
Iris