この記事のサンプルで使用した package.json
サンプルとかどうでもいい人は次のセクションからどうぞ。
ソースコードは以下本文中に記載。
手順1. ポリフィル導入
IE11に無い関数などを補うためのポリフィルが要る。
以下コマンドで core-js
と react-app-polyfill
をインストール。
そしたら、エントリポイント (webpack.config.js
の entry
に指定しているファイル) の先頭で core-js
と react-app-polyfill
をインポートするようコードを修正。
以下のような感じ。
手順2. ビルド設定
tsconfig.json
の module
に amd
、target
に es5
を設定する。
これをすると、トランスパイルの結果がブラウザ用のES5 (IE11がサポートしてる最後のJSのバージョン) の構文になる。
次に、webpack.config.js
に target: ['web', 'es5']
を追加する。
これをすると、Webpackがバンドル用に生成するコードがブラウザ用のES5の構文になる。
TypeScriptの設定でコード本体をES5に変換して、Webpackの設定でそれをバンドルするためのコードもES5で生成してもらうということ。
手順3. ビルドする
ここでは例として以下のコードを src
ディレクトリ以下に用意した。
アロー関数など、いかにもIE11で動かなさそうなものを使ってる。(※array-move
というnpmパッケージについては後述)
これらのコードを用意して以下コマンドを実行すると、バンドルされたJavaScriptファイル bundle.js
とHTMLファイル index.html
が dist
ディレクトリ以下に生成される。
これでIE11で index.html
を開けば動く……
と思うかもしれないがちょっと待って。
手順EX. バンドル結果にIE11で動かないコードが残っちゃう場合
上記のサンプルに含まれている array-move
というnpmパッケージは、コード内にIE11で動かないアロー関数が含まれてる!
試しにIE11で index.html
を開いてみると、開発者ツールのコンソールに構文エラーが表示されるはず。当該部分のコードを読んでみると、array-move
のものであろうことが分かる。
このように node_modules
内にES5で動かないものがある場合、それらも変換してやる必要がある。
上記の webpack.config.js
では ts-loader
の対象から node_modules
以下をまとめて除外してしまっていた。なので ts-loader
のところを以下の通り include
を使うよう書き換えて、トランスパイル対象を細かく指定できるように変更する。
これで再度以下コマンドを実行して……
生成された dist/index.html
をIE11で開き、開発者ツールのコンソールを見てみると、以下のように全てのコードが動作したことが確認できる。
以上。