この記事は ionic + TypeScriptで今風な開発フローを実現 の第4回にあたります!他の記事は↓です。
- ionic + TypeScript で今風な開発フローを実現【導入編】
- ionic + TypeScript で今風な開発フローを実現【型定義ファイル活用編】
- ionic + TypeScript で今風な開発フローを実現【module, concat編】
- ionic + TypeScript で今風な開発フローを実現【sourcemap編】
- ionic + TypeScript で今風な開発フローを実現【TypeScript編】
KENです。前回のionic + TypeScript で今風な開発フローを実現【module, concat編】では複数の .ts
ファイルを一つの app.js
ファイルに concat
するやり方について触れました!ファイルが一つになって良いこともあれば、当然悪いこともあります!その中でも典型的なのが、エラーが出たときなどに、「元のソースがどこなのかわからない!」という問題です。 concatしたはいいけど、デバッグめっちゃやりづらいじゃん! っていう元も子もない話です。ここで登場するのが sourcemap です!
concatの問題
まず、実際にどのような問題なのか見てみましょう。
↓以下のような不正なデータを作ったとしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
// app/services/chats.service.ts var chats = [ undefined, // ←意図的にundefinedにしてしまう { id: 1, name: 'Max Lynx', lastText: 'Hey, it\'s me', face: 'img/max.png' }, { id: 2, name: 'Adam Bradleyson', lastText: 'I should buy a boat', face: 'img/adam.jpg' }, { id: 3, name: 'Perry Governor', lastText: 'Look at my mukluks!', face: 'img/perry.png' }, { id: 4, name: 'Mike Harrington', lastText: 'This is wicked good ice cream.', face: 'img/mike.png' } ]; |
この状態でアプリを起動します。
1 2 3 4 5 6 |
// ビルド npm run watch // 別タブで実行 ionic serve |
Chat を見ると、一覧で不正データが混ざっているのがわかると思います。ここで Chrome のデベロッパーツールを開きましょう!(macなら option + command + i)
この状態で不正なデータをクリックすると、エラーが出たと思います!
エラーを覗いてみるとスタックトレースが見えると思います。問題となるファイルの行数の部分をクリックしてみましょう!
なるほど、undefined
のデータに対して id
プロパティを読もうとしてエラーになったのがわかりますね。
よし、これを直そう!
と思ったときに問題に気づきます(もう気づいてるかもしれませんが)。 app.js:189
となってるように、 app.jsの189行目 なんて言われてもさっぱりわからないんです! ts
ファイルの情報を教えてくれないと、探すのに一苦労なのです。
こういう時に役に立つのが sourcemap です!
sourcemapでconcat前のファイルの情報を手に入れよう
sourcemap とは何かというと、 concat
や minify
をした場合に、元ファイルの情報を格納しておくメタ情報っぽいやつです。sourcemap
の作成方法には大きく2つあって、最終成果物(今回の場合 app.js
)に埋め込む inline-sourcemap
方式か、別ファイルに保存しておく通常の sourcemap
か、です。
inline-sourcemapオプション
webpack
を使っていれば簡単です! webpack.dev.js
を少し編集しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
// webpack/webpack.dev.js var webpack = require('webpack'); module.exports = { entry: { app: './src/app/app.module.ts' }, output: { filename: '[name].js', path: './www/js' }, resolve: { extensions: ['', '.ts'] }, devtool: 'inline-source-map', // <- 追加 plugins: [], module: { loaders: [ { test: /\.ts$/, exclude: /node_modules/, loaders: ['awesome-typescript-loader'] } ] } }; |
この devtool: 'inline-source-map'
の1行を増やすことで、 webpack
がいい感じに sourcemap
を生成してくれます!
さて、それではこの状態で再度同じエラーを発生させてみましょう。すると↓のように表示されるはずです!
ちゃんと chats.service.ts:38
と、 chats.service.ts
ファイルの 38行目で問題が起きていることがわかります!今回はとってもシンプルなサンプルアプリを使っているだけなのであまり恩恵を受けている感じがしないかもしれませんが、これが大規模なプロジェクトになってくると無くてはならない存在になります。 sourcemap
のことはしっかり覚えておきましょう!
source-mapオプション
↑の webpack.dev.js
の devtool: 'inline-source-map'
の部分を今度は devtool: 'source-map'
に変えてみましょう!
1 2 3 4 5 6 7 8 |
Hash: f39e984fa9d85c207061 Version: webpack 1.12.14 Time: 2278ms Asset Size Chunks Chunk Names app.js 8.43 kB 0 [emitted] app app.js.map 12 kB 0 [emitted] app + 10 hidden modules |
すると今度は webpack
の出力に app.js.map
が増えているのがわかると思います。その名の通り、 inline-source-map
はファイル内に埋め込みますが、 source-map
は別ファイルとして専用の source-map
ファイルを生成するのです!
この方法でも .ts
ファイルに対する情報を取得できていることが確認できると思います。
デバッグ
さらに sourcemap
のうれしい点は、デベロッパーツールからブレークポイントを貼って、ちゃんと .ts
ファイルのブレークしたい場所でデバッガを止めることができる点です!
まとめ
内容としてはシンプルでしたけど、重要なTipsです。これでデバッグもばっちりですね!次回はいよいよ TypeScript
の真の力、「型情報」について触れていきましょう!この超強力なフィーチャーを、VSCodeなどのエディタを使って解説していこうかと思います!
- [x] コンパイルエラーが出ている
- [x] コンパイル後のファイルが複数ある
- [x] ブラウザでデバッグしづらい
- [ ] 型をまるで使っていない