Visual Studio Codeを使ったTypeScript開発 (ブラウザ編)
Visual Studio Code & TypeScript を使い、ブラウザ用の開発設定についてのメモです。
以下のような条件の開発設定です。
- 複数の TypeScript ファイルに分割して開発
- TypeScript のコードは、Node.js からも利用できる(Module 対応)
- Visual Studio Code からデバッグできる
- TypeScript の async/await 構文に対応する
この記事で扱う環境のバージョンは以下の通りです。
Visual Studio Code | 1.10.1 |
Nod.js | 6.5.0 |
TypeScript | 2.2.1 |
環境構築
TypeScript 関連のセットアップが終わったら、Visual Studio Code に Debugger for Chrome 拡張機能をインストールします。もし、Chrome がインストールされていない場合は、Chrome もインストールします。
tsconfig.json
TypeScript のプロジェクトのディレクトリ(.ts ファイルが置いてあるディレクトリ)に、「tsconfig.json」というファイルを作成し、設定を記述します。以下のような感じです。
ポイントは 3 つ
- modlue に amd を設定(AMD 形式のモジュールを使用)
- outFile を指定(今回は、./src/main.js を指定しましたが、ここは場合によって変更してください)
- lib を指定(特に、「es2015.promise」が重要です)
modlue を指定しない場合、トランスパイルされたファイルが outFile に指定されたファイルにすべて結合されて出力されるため、ブラウザ上で動作させる場合、こちらの方が便利かもしれません。modlue に amd を指定しているため、outFile の設定は必須ではありません。ただ、これを設定しないと、ts ファイルごとに js ファイルと map ファイルが生成され、ディレクトリが汚れます。そのため、少なくとも開発中は一つの js ファイルにまとめるように設定しています(もしくは、outDir で出力ディレクトリを変えるのも良いかもしれません。)。lib の指定は、async/await を使うために、重要です。await で待つ関数は Promise オブジェクトを返さないといけないのですが、ここで指定しておかないと、インテリセンスに文句を言われました。そのほかのライブラリはデフォルトのもののようです。
.vscode/tasks.json
「.vscode/tasks.json」ファイルがない場合、プロジェクトのビルド(Ctrl+Shift+B)を行うと、「タスクランナーが構成されていません。」と出ると思います。そこで、右端の「タスクランナーの構成」をクリックし、「TypeScript – tsconfig.json」を選択します。すると、「.vscode/tasks.json」が作成されます。内容は特に編集する必要はありません。
.vscode/launch.json
次に、デバッグ用の設定を記述します。デバッグを開始すると、デバッグ構成を選択できますが、デフォルトですとあまりいい感じにならないため、手動で「.vscode/launch.json」ファイルを作成し、以下のように記述します。
このように記述すると、デバッグを開始すると、ディレクトリ下の「index.html」ファイルを Chrome で開き、デバッグができるようになります。「runtimeArgs」に「– allow-file-access-from-files」を渡しておくことで、ローカルファイルを読み込むような JavaScript の実行もデバッグできます。ちなみに、すでに Chrome が起動しているといろいろとうまくいきませんので、一旦終了しておく必要があります(Mac の場合は、プロセスを終了させておきます)。もし、起動中の Chrome を使用したい場合は、request に attach を指定し、Chrome の起動設定を変更する必要があります。
index.html
Chrome から最初に読み込む HTML ファイルを記述します。以下のような感じです。
AMD 方式でトランスパイルするように設定したため、HTML から JavaScript ファイルを読み込むためには、RequireJS を使用します。「require.js」ファイルをダウンロードし、index.html と同じディレクトリに配置してください。そして、
のように「data-main」を使って、対象の JavaScript ファイルを読み込むようにします。また、TypeScript で async/await を使う場合、Promise が必要になるのですが、Promise は IE11 では対応していないため、PolyFill のライブラリも読み込むようにしておきます。
テスト
プロジェクトディレクトリは、以下のようなファイル構成とします。
.vscode launch.json tasks.json index.html require.js main.ts module.ts src main.js main.js.map
このうち、「launch.json」「tasks.json」「index.html」「require.js」は先に述べた通りです。また、「src」ディレクトリ以下はビルドすると自動生成されます。main.ts と mod.ts は、以下の通りです。なお、エントリポイントとなる ts ファイルの名前とトランスパイル後の js ファイルの名前は同じにしておく必要があるようです。
以下、注意事項です。
- エントリポイントとなる ts ファイルとトランスパイル後の js ファイル名とが異なった場合、実行されません
- module.ts というファイル名にすると、いろいろとトラブりました
デバッグを開始すると、Chrome が起動します。ただ、ブレークポイントの設定が間に合わないのか、うまくブレークポイントを設定しても止まらないことがあります。その場合、Visual Studio Code の方から「再起動」するとうまくいきました。
以上の設定で、ts ファイル側にブレークポイントを仕掛けてデバッグすることができます。また、TypeScript のモジュール仕様も利用することができます。また、async/await も対応しています。例えば、mod.ts を以下のように書き換えます。
これを実行すると、Hello 1 が出力されたのちに、1 秒後に Hello2 → Hello 3 と表示されます。IE11 でも問題なく動作します。(Promise については、こちらで紹介しています。)