毎回 URL が変わるファイルをデバッグ実行したい
◆ キャッシュ対策でクエリパラメータにタイムスタンプがついてる
◆ リロード時に別のソースファイル扱いされて breakpoint をつけても引き継がれない
◆ devtools の Local Overrides で同じ URL にアクセスするようにした
◆ リロード時に別のソースファイル扱いされて breakpoint をつけても引き継がれない
◆ devtools の Local Overrides で同じ URL にアクセスするようにした
私がサーバーを管理してないウェブページで うまく動かないところがありました
ページの内容を見たかったので devtools で簡単に対応して画面を見ようかなと思いました
breakpoint を設置して原因になってる変数を上書きして その場限りの簡単な修正をする感じです
こういうことはたまにあるのですが 今回は予想外の問題がありました
しかし breakpoint で止まりません
何度か試しても同じです
よく見るとリロード後に breakpoint が消えています
原因を探すと 毎回異なる URL の JavaScript ファイルをロードしていました
正確にはクエリパラメータに現在時刻のタイムスタンプを追加した URL でアクセスしていました
キャッシュ防止のために昔はよくみたものですね
最近はビルドツールが生成するハッシュ値になってあまりみなくなりましたけど
PHP のページで ページにアクセスするたびに動的にタイムスタンプが HTML に埋め込まれてるようでした
みたいな形になってました
devtools からすると毎回別の URL なので breakpoint は引き継がれず停止無しで実行してるようでした
すごくデバッグし辛いと思うのですが 作った人はどうやってるのでしょうね
開発した人だとサーバー側で console.log をソースコードに追加するとかできるので 都度ファイルを書き換えてるのでしょうか
devtools の Sources タブで原因となる HTML のファイルを探します
ここでは page.php とします
page.php を右クリックして Override content を選びます
フォルダが未設定ならフォルダを選択することになるので 適当なフォルダを作ってそれを選びます
devtools のヘッダーに確認が出てくるので許可します
これで作ったフォルダの中に page.php が作られます
devtools を開いてる間はサーバーから受け取る page.php ではなくローカルフォルダの page.php を受け取ったものとして動作します
今回はレスポンスを書き換えるのが目的ではなく JavaScript ファイルを毎回同じ URL にすることが目的なので変える必要はなくこのままリロードするだけです
リロードするとタイムスタンプが前回と同じ JavaScript ファイルを取得するので breakpoint が有効になります
便利ですね
終わったら Sources タブの左側サイドバーで Overrides タブを選んで Enable Local Overrides の右側にあるクリアしてくれそうなアイコンを押して設定をクリアします
作ったフォルダも削除すれば完了です
page.js?12345 だろうと page.js?67890 だろうとリダイレクトして page.js に飛ばせば解決です
page.php のレスポンスを 304 にして前回から変更なしと扱わせることもできそうです
ただリクエストを書き換える拡張機能が必要で 準備するのも面倒なのでやめました
もうひとつは ServiceWorker を使う方法です
ですが ServiceWorker はそんなに詳しくないのと サーバーに実在しないスクリプトを devtools だけでインストールできるのかわからなかったのでやめました
これらに比べると devtools の機能だけで完結できる Local Overrides は簡単です
Page しかなく Workspace や Content Scripts もなかったです
しかし 右クリックで Override content は選べてそこからフォルダ選択もできました
最近 Edge は devtools の見た目を変更したのでそれの影響でおかしくなってるのかもしれません
有効にしたら無効にできない気もするので Edge ではやらないほうがいいかもです
ページの内容を見たかったので devtools で簡単に対応して画面を見ようかなと思いました
breakpoint を設置して原因になってる変数を上書きして その場限りの簡単な修正をする感じです
こういうことはたまにあるのですが 今回は予想外の問題がありました
URL が毎回変わる
ボタンを押したときなどじゃなくて ページロード時の処理でエラーになっていたので ロード時の処理に breakpoint をつけてリロードしましたしかし breakpoint で止まりません
何度か試しても同じです
よく見るとリロード後に breakpoint が消えています
原因を探すと 毎回異なる URL の JavaScript ファイルをロードしていました
正確にはクエリパラメータに現在時刻のタイムスタンプを追加した URL でアクセスしていました
キャッシュ防止のために昔はよくみたものですね
最近はビルドツールが生成するハッシュ値になってあまりみなくなりましたけど
PHP のページで ページにアクセスするたびに動的にタイムスタンプが HTML に埋め込まれてるようでした
<script src="/page.js?12345"></script>
みたいな形になってました
devtools からすると毎回別の URL なので breakpoint は引き継がれず停止無しで実行してるようでした
すごくデバッグし辛いと思うのですが 作った人はどうやってるのでしょうね
開発した人だとサーバー側で console.log をソースコードに追加するとかできるので 都度ファイルを書き換えてるのでしょうか
対処方法
楽に対処できるいい方法無いかなーと考えていて久々に Local Overrides の機能を使うことにしましたdevtools の Sources タブで原因となる HTML のファイルを探します
ここでは page.php とします
page.php を右クリックして Override content を選びます
フォルダが未設定ならフォルダを選択することになるので 適当なフォルダを作ってそれを選びます
devtools のヘッダーに確認が出てくるので許可します
これで作ったフォルダの中に page.php が作られます
devtools を開いてる間はサーバーから受け取る page.php ではなくローカルフォルダの page.php を受け取ったものとして動作します
今回はレスポンスを書き換えるのが目的ではなく JavaScript ファイルを毎回同じ URL にすることが目的なので変える必要はなくこのままリロードするだけです
リロードするとタイムスタンプが前回と同じ JavaScript ファイルを取得するので breakpoint が有効になります
便利ですね
終わったら Sources タブの左側サイドバーで Overrides タブを選んで Enable Local Overrides の右側にあるクリアしてくれそうなアイコンを押して設定をクリアします
作ったフォルダも削除すれば完了です
他の方法
他の考えた方法だと ひとつは拡張機能を使う方法ですpage.js?12345 だろうと page.js?67890 だろうとリダイレクトして page.js に飛ばせば解決です
page.php のレスポンスを 304 にして前回から変更なしと扱わせることもできそうです
ただリクエストを書き換える拡張機能が必要で 準備するのも面倒なのでやめました
もうひとつは ServiceWorker を使う方法です
ですが ServiceWorker はそんなに詳しくないのと サーバーに実在しないスクリプトを devtools だけでインストールできるのかわからなかったのでやめました
これらに比べると devtools の機能だけで完結できる Local Overrides は簡単です
Edge のバグ?
この機能は Chrome でも Edge でも動くなずなのですが Edge (122) だと Sources タブの左サイドバーに Overrides タブがなかったですPage しかなく Workspace や Content Scripts もなかったです
しかし 右クリックで Override content は選べてそこからフォルダ選択もできました
最近 Edge は devtools の見た目を変更したのでそれの影響でおかしくなってるのかもしれません
有効にしたら無効にできない気もするので Edge ではやらないほうがいいかもです