Babelを運用するに当たって、一部のディレクトリだけ設定を変更することができます。
必要になった動機
作っているシステムの中でService Workerを導入しようとしたのですが、Service Worker内ではfetch
だけでなくcache
も非同期実行となっていて、Promise
だけで書くのも辛くなって、async-await
を使いたくなってきました。
本体プログラムはIE11も切り捨てずに作っていたため、@babel/polyfill
の巨大さが気になってasync-await
を取り入れられずにいたのですが、Service Workerは機能自体がIE11に非対応ですし、本質的に「動かなければそれでいい」と割り切れるものなので、「async-await
をそのまま出力してしまおう」という考えに至りました。
複数の.babelrc
ドットファイル系の設定ファイルではよくある話ですが、.babelrc
でもディレクトリごとにファイルを置いて、設定変更が可能です。Babelのサイトにはnode_modules
を挟んだ場合の制約などが書いてありますが、1つのプロジェクト内で設定する分には問題となりません。
設定を行う
必要な設定は、
-
async-await
の変換を止める - (ついでに)Service Workerと
async-await
に対応できるブラウザ向けのコードを吐かせる
の2つです。@babel/preset-env
で一部のプラグインをexclude
できるとのことだったので、以下のような設定となりました。
{
"presets": [
["@babel/preset-env", {
"modules": false,
// ServiceWorkerとasync-awaitが効く最低限
"targets": {
"chrome": "55",
"firefox": "52",
"ios": "11.4",
"edge": "17"
},
"exclude": ["transform-regenerator"]
}]
]
}
という感じとなりました。なお、途中にコメントが入っていますが、.babelrc
はJSON5を取り入れているため、途中にコメントが入っても構いません。
まとめ
ターゲットが限られる場面では、積極的にターゲットを指定すれば、新しいJavaScriptでコンパクトなコードを生成することができます。