はじめに
TypeScript は JavaScript コードに型付けすることができる優れたトランスパイラですが、変換後の .js
ファイル群をまとめる(バンドルする)機能は備えていません。
また、モダンな Web サイトを構築するときは、CSS Modules や Sass/Less/Stylus といった仕組みを使用するのが常套手段となっています。
そのため、Web サイト用の .js
ファイルを TypeScript を使って作成する場合、webpack などのバンドルツールを組み合わせて使用する必要があります。
- TypeScript …
.ts
ファイルから.js
ファイルへの変換 - webpack … Web サイト用の各種リソースをバンドルする
バンドルツールには様々なものがありますが、大きなシェアを占めているのは webpack なので(2020年現在)、ここでは TypeScript と webpack を組み合わせて使用する方法を説明します。
.js
ファイルをインポートすることが可能になりつつあります。
しかし、Web サイトの最終的なデプロイ時には、各種リソースを最適化(minify など)する必要があるため、まだまだ webpack などのバンドルツールが必要です。関連パッケージのインストール
TypeScript のインストール
プロジェクト用のディレクトリと package.json を作成し、TypeScript をインストールします。
webpack のインストール
webpack 関連のパッケージをインストールします。
webpack
… webpack 本体webpack-cli
… webpack のコマンドラインツールts-loader
… webpack 経由で.ts
ファイルをトランスパイルするhtml-webpack-plugin
….html
ファイルをdist
ディレクトリに出力する
実装
ここでは、下記のようなディレクトリ構成をゴールとします。
Web サーバーにデプロイすべきファイル群(HTML ファイルや JS ファイル)は、dist
ディレクトリ以下に出力されることを想定しています。
ディレクトリ構成
TypeScript の設定 (tsconfig.json)
トランスパイル時の出力先などは webpack 側で制御するので、outDir
などの指定は本質的には必要ありませんが、間違えて tsc
コマンドで直接変換してしまった場合に、変な場所に .js
ファイルが出力されないように念のため指定しておきます。
webpack の設定 (webpack.config.js)
webpack によるバンドル後の結果を dist
ディレクトリに出力することや、TypeScript 関連のコード(.ts
ファイル)を認識させるための設定を行います。
index.html の作成
Web サイトのトップページとなる index.html
を作成します。
このファイルに script
要素を記述しておく必要はありません。
HtmlWebpackPlugin
が src/index.html
を dist/index.html
にコピーするときに、script
要素を自動挿入してくれます。
index.ts の作成
トップページから読み込まれる index.js
ファイルの TypeScript 版を作成します。
ここでは、div
要素のテキストを Hello
に変更しています。
Web サイトのビルド
webpack と TypeScript の設定ができたら、次のようにビルドを実行します。
dist
ディレクトリ以下に、index.html
や index.js
ファイルが出力されるので、出力された index.html
ファイルを開いて、Hello と表示されることを確認します。
ビルド方法は、package.json
でスクリプト定義しておきましょう。
これで、npm run build
でビルドできるようになります。
関連記事
- React + TypeScript の環境を整える (1) 自力で webpack 設定する方法
- Electron で Hello World (2) TypeScript で開発できるようにする
- Node.js で GitHub REST API を使用する (@octokit/rest)
- TypeScriptの型: インタフェースのプロパティを読み取り専用にする (readonly)
- TypeScriptの型: インタフェースを定義する (interface)
- TypeScriptの型: 関数を定義する (function)
- Azure Table Stroage を使ってみる: TableService を Promise 化して使いやすくする