2018年8月27日、Babel6 から2年の時を経て Babel7 がリリースされたということで、変更点をまとめてみました。
目次:
- npmパッケージを @babel 名前空間に移行
- 年ごとのプリセット(preset-es2015 など)とステージごとのプリセット(preset-stage-0 など)を削除
- 提案段階のプラグイン名を変更(transform から proposal へ)
- プラグインやプリセットの peerDependency に @babel/core を追加
- babel-upgrade ツール
- 設定ファイルをJavaScriptで記述可能に(babel.config.js)
- 処理速度の改善
- TypeScript をサポート(@babel/preset-typescript)
- JSXフラグメントをサポート(@babel/plugin-transform-react-jsx)
よくわからない部分はよくわからなかったので省略しました。全体を知りたい方は公式ページをご覧ください。
npmパッケージを @babel 名前空間に移行
babel-core は @babel/core というように、npmパッケージは全て @babel 名前空間に移行するようです。
例えば babel-core の npm ページを見ると Published 4 months ago とか書かれててバージョンも 6.26.3 が最新になっているので、移行前のパッケージのほうはもう今後更新されないのでしょう。
年ごとのプリセットとステージごとのプリセットを廃止
@babel/preset-es2015 などの年ごとのプリセットや @babel/preset-stage-0 などのステージごとのプリセットを廃止し、今後は @babel/preset-env を使うように、とのことです。
ステージごとのプリセットはnpmページの依存関係を見れば分かる通りnpm install @babel/preset-stage-0 とやっても何もインストールされなくなりました。
年ごとの方はまだ生きているようですが、いずれ消える可能性が大きいんじゃないでしょうか。
提案段階のプラグイン名を変更
ステージ0から3までのまだ提案段階の仕様は、分かりやすさのために transform ではなく proposal という名前をつけることになりました。
今まで babel-plugin-transform-class-properties だったのが @babel/plugin-proposal-class-properties というふうになるみたいです。
プラグインやプリセットなどの peerDependency に @babel/core を追加
Babel6 の @babel/core と Babel7 用プラグインを同時に使うということを避けるようにするため、各プリセットやプラグインに Babel7 の@babel/core を依存関係として追加するようです。今までは依存関係を持っていなかったので、バージョンの異なる(互換性のない) @babel/core とプラグインを同時に使ってしまうということが起きていたみたいです。
この変更よって、今後は以下のように明示的に @babel/core をインストールする必要があります。
- $ npm install -D @babel/core @babel/cli @babel/preset-env
babel-upgrade ツール
依存関係や設定ファイルを自動的に Bebel7 用に更新してくれるツールらしいです。詳細についてはGitHubページのreadme.mdをみた方が早いでしょう。
@babel 名前空間への変更や @babel/preset-stage-x の削除、transform から proposal への変更などを自動的にやってくれるみたいです。
設定ファイルをJavaScriptで記述可能に
今まで Babel の設定は .babelrc で行なっていましたが、 Babel7 ではbabel.config.js でJavaScriptでの記述が可能になりました。
- module.exports = {
- presets: [
- [
- "@babel/preset-env", {
- "targets": "last 2 versions"
- }
- ]
- ]
- };
何が嬉しいかというと、JavaScript なので条件分岐が書けます。開発用と本番用で設定を変えたいけどファイルを分けるほどではない場合とかに重宝するでしょう。
さらに、overrides を使うことでフォルダごとの設定が可能になります。.babelrc を使う場合はフォルダごとに .babelrc を置かなくてはならなかったみたいですが、babel.config.js であればルートディレクトリに置いたファイルで全てのフォルダの設定が個別に行えます。
おわり
名前が結構変わったりしているので、ネットとかに転がってる package.json や .babelrc のちょっと古い設定をそのままコピペして使うと思わぬ沼にはまる可能性大です。怖いですね。
気をつけます。気をつけましょう。