はじめに
Javascript開発でよく使ってるデバッグ方法についての個人的なまとめです。
当たり前の事ばかりですが、これからJavascript開発をやる方や興味がある方に少しでもお役に立てればと思います。
デバッグの鉄板 console.log
Javascriptの開発でconsole.logを使わない人を探すほうが難しいくらいだと思います。
console.log('コンソール出すぜ');
実行結果
ChromeのDeveloper ToolsのConsoleタブで確認
consoleでデバッグ時の色やアイコンを表示
console.logだと単なるlogですが、用途によってエラーや警告などを出すことが可能です。
これによって、複数のconsoleを設置した場合に何の情報なのか?が分かりやすくなります。
console.error
エラーハンドリングで引っかかった時にはこれを使っています。
console.error('エラー出すぜ');
実行結果
console.warn
個人的にはあまり使っていません。
処理は続行出来るものの、100%の期待動作でない場合とかで使っていましたが、結局期待動作ではないので、厳しめにconsole.errorにしてしまう事がほとんどです。
console.warn('警告出すぜ');
実行結果
console.info
console.logと一線を画したい時に使っています。
長いメソッドの中で値の変化などを追いたい時に、強調すべきポイントとかで使ったりしています。
console.info('情報出すぜ');
実行結果
こんな感じで、途中で一番見なければいけない値を見落とさないように使ってます。
(値3の内容が一番のポイントである場合)
配列はconsole.tableが見やすい
以下のような配列があったとします。
var array=[{
key1:'value1',
key2:'value2',
key3:'value3',
}];
配列の中身をconsole.logすると、こんな感じになります。
console.log(array);
実行結果
ちょっと見難いですよね。
これを解決するのがconsole.tableです。
console.table(array);
実行結果
かなり見やすくなりました!
実行時間を計測
プログラムを書く上で実行速度は大切です。
Javascriptでももちろん処理速度を計測する方法があります。
console.time('timer');
// 計測したい処理を記載
console.timeEnd('timer');
実行結果
関数の呼び出し元を調べる
console.traceを使います。
ここまで紹介したconsole兄弟の最後の紹介です。
その他、consoleについてはまだまだたくさんあるのでご興味ある方は調べてみてください。
function saba() {
function aji() {
function maguro() {
// console.trace実行
console.trace();
}
maguro();
}
aji();
}
// さば function実行
saba();
実行結果
このようにどのメソッド経由か?が分かります。
ブレークポイントを使う
ブレークポイントを使用すると、プログラムの実行中に途中で停止、再開が行えます。
Developer ToolsのSourceタブを開いて、ブレークポイントを仕込みたい行をクリックします。
この状態でページをリロードすると、設定したブレークポイントで処理が止まるので、ステップ実行が可能です。
ブレークポイントからの処理再開
ブレークポイントから処理を再開する場合は、ブレークポイントをセットしたSourceタブの右側に以下のようなボタン群があるかと思いますが、こちらから実行していきます。
![スクリーンショット 2016-01-26 13.47.41.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F65968%2F0b3d07fd-19aa-6e05-0b62-b4a0f4fca585.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=626fbf98d48d422c2287751884da788f)
処理再開
そのままです。これを押すと実行が再開されます。
ステップオーバー
関数呼び出しがあった場合でも、関数へ処理遷移しないで次の行に進みます。
ステップイン
関数呼び出しがあった場合、その関数へ処理遷移をして、関数内の処理に進みます。
ステップアウト
関数が終了するまで実行し関数を抜けます。
画面上からの操作
ブレークポイントを設定した場合、Developer Toolsだけでなく、画面上にも
処理の再開とステップオーバーのボタンが表示されるので、そこからの操作も可能です。
![スクリーンショット 2016-01-26 13.37.29.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F65968%2F7092676b-5a05-b2bc-8270-2286b12ce8c2.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=b7212426f8723ba1cdc0f6d0113d5081)
実行中に値の変更
ブレークポイントをセットして、sampleArray
に[1,2,3,4]
をセットします。
通常に実行すると、console.logの結果は[1, 2, 3, 4]
となるはずです。
Developer Tools右側のScopeのsampleArrayには
Array[4]
0:1
1:2
2:3
3:4
とセットされている事が確認できます。
このScope内のsampleArray
を[100,200,300,400]
と変更してみます。
この状態で次に処理を進めます
すると、Sourcesタブ内の結果も[100,200,300,400]
となり、
さらにConsoleタブの処理結果も以下のようになります。
このようにブレークポイントをセットして、ステップ実行しながら値を変更していく事が可能です。
これにより、開発時にイレギュラーな値を渡してテストしながらの実装なども容易に行えるようになります。
Networkで通信をチェック
どういったHTTP通信がされているのか?
ちゃんとステータスコードやレスポンスが返ってきているのか?を確認する場合に、Networkタブの利用をします。
以下、http://qiita.com/ にアクセスした例です。
ちゃんと200 OKが返ってきている事が分かります。
デフォルトでHeadersタブが開いていますが、Responseタブを開くと以下のようにHTMLファイルが表示されている事が分かります。
実際に受け取るレスポンスとして、Javascriptの開発の場合、JSON形式でのAPIレスポンスなどが多いかと思いますが、その場合はこのResponseのタブにJSON形式のデータが表示されます。
生の通信はDHC
通信処理を書いている時に、コードが悪いのか、通信のパラメータが不正なのか?
問題の切り分けをする為には通信したい内容をJavascriptのコード外で実行するのが最適です。
そこで使うのがDHCというChromeのエクステンションです。
インストールURL
https://chrome.google.com/webstore/detail/dhc-resthttp-api-client/aejoelaoggembcahagimdiliamlcdmfm
インストールするとChromeのアプリのところにアイコンが表示されているはずなのでこちらをクリックします。
![スクリーンショット 2016-01-26 14.01.39.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F65968%2F860b4e05-4ec0-e6e1-3649-5191091dcd04.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=6889a7503a8e586748af297ed207e9fc)
使い方
リクエスト先の設定
![スクリーンショット 2016-01-26 14.08.51.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F65968%2F32a243be-d244-7929-ecee-936ec0013358.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=a2dd233849ff51688de5a6c02d6a2eb0)
HTTPまたはHTTPSが選択可能です。
ヘッダーのセット
![スクリーンショット 2016-01-26 14.10.13.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F65968%2Fa6808de3-2727-583d-3681-1bb500b6b3c0.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=bfd8011eb90dc7c856700df5a5f80a1a)
リクエストヘッダーのセットをします。
メソッドの選択
![スクリーンショット 2016-01-26 14.11.25.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F65968%2F69e0a9d7-ed81-43d7-46f1-0158adf245dd.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=69bf12e4b11b422d4db6c4a255790029)
リクエストBODYの入力
![スクリーンショット 2016-01-26 14.12.02.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F65968%2F3cb266ed-fec9-575b-ea31-53a9c5cc4011.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=b8b49f6889ba105644e11cbf0a9cc400)
リクエスト送信
![スクリーンショット 2016-01-26 14.13.09.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F65968%2F4e4a0796-5236-560a-5453-c985d20f4a24.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=4726237e62fa97cbd3c53705ecc4a5d5)
レスポンス
HTTPのステータスコードとレスポンス内容が返ってきます。
また、リクエスト時内容もレスポンスのところに表示されます。
![スクリーンショット 2016-01-26 14.14.07.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F65968%2Facd7c1f1-f88e-f615-f054-a512edf45a11.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=b4e4bb3bf18e3cf7e336eca17378a4cf)
クッキーはEdit This Cookie
クッキーの閲覧、操作はEditThisCookieを使っています。
とにかく使いやすくて、個人的にはクッキーのデバッグはこれ以外に考えられません。
インストールURL
https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg?hl=ja
使い方
インストールして有効にしたら、Chromeの右上にクッキーのアイコンが表示されているはずなので、これをクリックします。
![スクリーンショット 2016-01-26 14.25.26.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F65968%2F76396506-d5a3-6cd1-8a7d-998f5e891c71.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=7368986c60d8d88f8b8e95a307f67e47)
クリックすると、そのサイトのクッキーの一覧が表示されます。
あとはデバッグ時に削除したり、値を変えたり色々とやってみてください。
![スクリーンショット 2016-01-26 14.26.34.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F65968%2F4b945642-4cf3-640b-2877-c340d910533b.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=fdb5d4f793e3a292f01a4db095c809ed)
ローカルストレージの操作
クッキーだけでなく、ローカルストレージを使用するサービスも最近増えていると思います。
ChoromeのDeveloper Toolsでももちろん使えます。
ResourcesタブのLocal Strageから自由にKeyとValueの変更、追加、削除が行えます。
同様にSession Strageについてもここから操作が行えます。
あきらめないで!minifyされたソース
Javascriptで開発していると、minifyされたソースをお目にかかる機会が多いと思います。
デバッグしていたらminifyのソースが関連していそうだ。しかし、見れない・・・。
と諦める事はありません。
すると、ファイルが :formatted
という形式で展開されます。
(AngularJS固有) ng-inspector
普段AngularJSを書く機会が多いのでこちらも紹介します。
インストールURL
https://chrome.google.com/webstore/detail/ng-inspector-for-angularj/aadgmnobpdmgmigaicncghmmoeflnamj
使い方
インストールして有効にしたら、Chromeの右上にAのアイコンが表示されているはずなので、これをクリックします。
![スクリーンショット 2016-01-26 14.35.11.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F65968%2F1ee594a8-6707-9e0f-826c-61dd47113057.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=6151830f36ee60aa7048a322cc8c3f11)
AngularJSで書かれたサイトの場合、$rootScope
,$scope
の中身がここから確認出来ます。
https://angularjs.org/ にアクセスした例
ササッと見た目を修正出来るElements
レイアウトの確認MTGなんかで、「ここ、もうちょっとこんな感じのほうが」など意見が出る事があると思います。
そんな時にいちいちソースを開いてというのも面倒なので、ElementsタブでHTMLを変更して対応したりしています。
http://qiita.com/ をElementsタブで開いた一部
ここの
<h2>プログラミング知識を共有しよう。</h2>
を<h1>
にして、共有
をシェア
に変えてみます。
実行結果
すると、変えたタイミングで画面上も変更されます。
![スクリーンショット 2016-01-26 14.47.14.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F65968%2Fe27321ba-3a24-692d-1976-4265ed49b65a.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=fc3f95612783c6cbad3f254848c67e4a)
今は単純なタグと文字の置き換えだけですが、もっと複雑な事も出来るので、ブレストやデザイン、レイアウトに関するMTGで結構役に立ちます。
困ったらソースを読む
個人的によくあるのが、使っているライブラリが意図する動作をしてくれない。
ですが、ライブラリのコードもJavascriptで書かれているので、頑張ってコードを追ってみましょう。
変にトライ&エラーを繰り返すよりもコードを読んでしまって、「ここはこういうパラメータじゃないと動かないのか、間違ってたわー。。」「このライブラリはこういう用途はできないのか。。」と結論を早く導き出せる事もあります。
また、自身が関わっているプロダクトのコードであれば、書いた人に聞くのが一番の近道デバッグだと思います。
まとめ
ChromeのDeveloper Toolsは強力で、色んなツールもあるので個人的にデバッグは何とかなっているかなあという感覚です。
日々進歩していくはずなので、またどこかの機会でまとめようと思います。
完全に個人的なメモですが、どこかでお役に立てたら幸いです。