Babelとの併用を止めてTypeScriptビルド一本化へ
Published at 2017-05-01
最近は社内で Web おじさん業をやる傍ら、プロジェクトコードなども少し触っている。最近では FRESH! でアレコレしていて、クライアントサイドとサーバーサイドの改善もやったり。
- FRESH! Web パフォーマンス改善 〜クライアントサイド編〜 | CyberAgent Developers Blog
- FRESH! Web パフォーマンス改善 〜サーバサイド編〜 | CyberAgent Developers Blog
ふたつ👆ともよくまとまっているので、未読の人は是非読んでください。
あとは開発環境周りもコツコツ直していたりする。Web クライアントの構成要素 - Client Side of █████fresh.tv で触れられている通り、TypeScript と Babel の多段ビルドで運用していた。型を使いたいモチベーションと JSX をコンパイルする事情が合わさってのことだが、最近では TypeScript が JSX に対応しているので、TypeScript ビルドへの統一に踏み切った。
JavaScriptをTypeScriptでビルドする
TypeScript と JSX それぞれの JavaScript へのコンパイルに分かれていて、設定が2箇所に分かれている気持ち悪さと、ビルド結果を Browserify でバンドルする都合で双方の待ち合わせがあったりなどの、ビルド処理の複雑化を招いていた。TypeScript ビルドへ統一することでそれらが一気に解消された上に、ビルド時間への短縮にも繋がった。
ひとまず allowJs を駆使しながら TypeScript への一本化を果たして、ビルド時間が 90s から 70s 程になった。exports.__esModule = true; の優しさ。https://t.co/1nBGdZNcJ0
— 煎茶 🍵 (@1000ch) 2017年4月28日
対応内容としては単純で、babel でビルドしていた .js ファイルを代わりに tsc でビルドするだけ。ここで JavaScript ファイルのコンパイルを有効にするため tsconfig.json に "allowJs": true を入れる。JSX が記述されている .js は順に .tsx に変更していかなければならないが、ほとんど何も変更せずに今まで動作しまっている。
JavaScript のスーパーセットというのと、JSX サポートが最高ということに尽きそう。
eslint/typescript-eslint-parser
FRESH! では ESLint を採用しており、自家製の openfresh/eslint-config-fresh と openfresh/eslint-config-fresh-react をルールにしている(ほとんど xo ベースだけど)。tslint も2分くらい検討したが
、公式の eslint/typescript-eslint-parser が動いてくれたのでこちらを使うことにした。
eslint-config-fresh で parser に babel-eslint を指定していたところ、プロジェクトの .eslintrc で typescript-eslint-parser を指定しても先に babel-eslint が参照されてしまうようでうまく ESLint が動作しなかった(これが仕様なのかどうかはちゃんとに調べていない…)。これは eslint-config-fresh 側で parser を指定しない方向で対処した。