LoginSignup
131
111

More than 5 years have passed since last update.

@babel/preset-envのuseBuiltInsを使ってpolyfillする

Last updated at Posted at 2017-09-25

@babel/preset-envのuseBuiltInsに関する記事です。
Babel v7以降で使えるようになるpolyfillを自動補完してくれる機能について紹介します。

更新(2018/08/27)

2018/08/27にBabel v7が正式リリースされました🎉
https://babeljs.io/blog/2018/08/27/7.0.0

Babel v7

@babel/polyfill

  • babelは文法の変換のみ。ブラウザによっては使えない機能はあります。
  • 例えば、IEはPromiseとかSymbolとか使えません。これは文法ではなく、機能です。
  • @babel/polyfillを使えばその辺の穴埋め(polyfill)をしてくます。
  • ソースコードを直接改変する必要があり。以下のようにpolyfillをimportしなければいけません。
import "@babel/polyfill"

@babel/plugin-transform-runtime

  • こちらもpolyfillするbabelのプラグイン
  • babel-polyfillとは違いimportを書く必要がない。babelの設定に追加するだけ
  • babelのプラグインなので変換時にpolyfillします
  • 指定したブラウザとか関係なく問答無用で変換する。ようするにchromeには既に実装済の機能でChromeの最新バージョンに合わせて変換してもChromeがネイティブ対応済のものまでpolyfillします

求めているもの

  • polyfillのためにimportを書いたり、polyfill用のパッケージをインストールしたくない
  • 指定したブラウザやバージョンに無い機能だけpolyfill入れてほしい

@babel/preset-env

  • babel 6の頃はbabel-preset-envだった
  • 指定したブラウザやNodeのバージョンに合わせてネイティブサポートしていない文法のみ変換
  • cssのAutoprefixerのようにbrowserslistを使って文法の変換を行う
  • 上記で書いた「求めているもの」を叶えてくれる優れもの

Install

まずは@babel/preset-envのインストール方法

npm install --save-dev @babel/preset-env

useBuiltIns: "usage"オプション

  • polyfillのための@babel/polyfillのインストールが不要
  • 指定したブラウザやバージョンに合わせて必要なpolyfillだけをimport

@babel/polyfillとbabel-plugin-transform-runtimeのいいとこどり!

Babel v6のbabel-preset-envのpolyfill

useBuiltInsオプションは1.x系からありました。

{
  "presets": [
    [
      "env",
      {
        "targets": {
          "ie": 11
        },
        // trueにすることで必要なpolyfillだけをimportするようにします
        "useBuiltIns": true
      }
    ]
  ]
}
  • 必要なpolyfillのみインポート
  • ただし前述の通り@babel/polyfillをimportしなければいけません。

イメージ的には以下のように@babel/polyfillをimportするコードが必要な分のpolyfillをimportするコードに変換されます

import "@babel/polyfill";

require("babel-polyfill/lib/core-js/modules/es6.promise");

Babel v7の@babel/preset-envからのpolyfill

{
  "presets": [
    [
      "env",
      {
        "targets": {
          "ie": 11
        },
        // 必要な分だけのpolyfillを自動でインポート
        "useBuiltIns": "usage"
      }
    ]
  ]
}
  • @babel/polyfillの別途インストールが不要
  • @babel/polyfillをインポートするコードが不要
  • usageにしてbabelを実行すると勝手に以下ような必要な分だけpolyfillが埋め込まれる

これが自動でコード内に挿入される

require("babel-polyfill/lib/core-js/modules/es6.promise");

開発者はpolyfillいるかいらないか気にしなくてよいようになります

注意

場合によっては別途polyfillが必要だったりもするので万能ではない
以下のような実行しないと型がわからない場合とかは自動でpolyfillできません
そういった場合は必要なpolyfillをimportする必要があります

users.includes("hoge")

GitHubにサンプル置いときました!

shisama/babel-preset-env-useBuiltIns-sample
npm updateしてnpm run buildすれば以下のトランスパイルした結果を出力
- Node.js(4/6/8)
- chrome(v60/v50)
- firefox(v55/beta)
- Safari
- Edge
- IE11

まとめ

  • babelは文法の変換だけ
  • polyfillは@babel/preset-envで "useBuiltIns": "usage" すればどのpolyfillが必要か考えなくてよくなるし、不要なpolyfillは入らない

最後までお読みいただきありがとうございました。質問や不備がございましたらコメント欄またはTwitter(@shisama_)までお願いいたします。

131
111
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
131
111