@babel/polyfill 再確認
by
muryoimpl
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
@babel/polyfill 再確認 2018 アジャイル事業部 年始のご挨拶 2 月担当: muryoimpl ( 無量井 健)
Slide 2
Slide 2 text
No content
Slide 3
Slide 3 text
そもそも、polyfill って何?
Slide 4
Slide 4 text
Web 開発でいえば、ブラウザが未実装の機能を、導入すること で利用できるようにするコードのこと ネイティブ実装のように 動くようにしてくれるもののこと != 代替関数を用意してくれているライブラリ (lodash のような 便利関数の集まりとは違う) polyfill とは?
Slide 5
Slide 5 text
@babel/polyfill (babel-polyfilll) core-js regenerator-runtime dialog-polyfill (material-design-lite で利用) raf にある polyfill.js (React.js v16 利用時に必要) ( 私が使っている代表的な) polyfill ※ dialog-polyfill は HTML の タグを使うためのものです。
Slide 6
Slide 6 text
最も利用機会が多いのは、 @babel/polyfill だと思うので 改めて利用方法を 確認してみましょう
Slide 7
Slide 7 text
Q: 中身どうなってるの? @babel/polyfill
Slide 8
Slide 8 text
A: core-js 内の shim.js と regenerator-runtime を 取り込んでいるだけ!! @babel/polyfill
Slide 9
Slide 9 text
No content
Slide 10
Slide 10 text
Q: polyfill と Shim の違いって何?
Slide 11
Slide 11 text
A: Shim は旧環境に新API を提供するも の polyfill はShim の一種でブラウザ間の API の差分をなくすもの ※ パテみたいなものが語源? 参考: http://2ality.com/2011/12/shim-vs-polyfill.html
Slide 12
Slide 12 text
No content
Slide 13
Slide 13 text
Q: @babel/preset-env における polyfill の設定を雰囲気でやっている… どうなっているの?
Slide 14
Slide 14 text
.babelrc の設定でみるべきは以下の2つ 1. useBuiltIns 2. targets.browsers // .babelrc { "presets": [ ["@babel/preset-env", { "useBuiltIns": "usage", "targets": { "browsers": ["last 2 versions", "safari 7"] } }] ] }
Slide 15
Slide 15 text
1. useBuiltIns
Slide 16
Slide 16 text
“usage” | “entry” | false の3 つの値をとれる default は false どのように polyfill を import するかが異なる。うまく使うと ファイルサイズを減らせる browserslist から取得した環境に則って、polyfill を差し込む browserslist は後ほど説明する .babelrc の useBuiltIns
Slide 17
Slide 17 text
呼んだ各所に呼んだ関数を含むpolyfill のimport 文を挿入する ファイルに対して1 回しか読み込まない これが一番よさそう import 文を書かないから混乱する?(polyfill ってでも意識し ないものだよね?) var a = new Promise(); ↓ import "core-js/modules/es6.promise"; var a = new Promise(); .babelrc の useBuiltIns: "usage"
Slide 18
Slide 18 text
entry file に書いてある import “babel/polyfill” を置換して、 使っているpolyfill のimport 文を差し込む global で衝突の可能性があるけど、entry file が1 つなら心配 なさそう global._babelpolyfill の値で多重読み込みしているかチェック はしている import "@babel/polyfill"; ↓ // padStart と padEnd を使っている場合 import "core-js/modules/es7.string.pad-start"; import "core-js/modules/es7.string.pad-end"; .babelrc の useBuiltIns: "entry"
Slide 19
Slide 19 text
何もしない entry file に import “babel/polyfill” を書いていれば全 polyfill を読み込む import "babel/polyfill"; .babelrc の useBuiltIns: false
Slide 20
Slide 20 text
2. targets.browsers
Slide 21
Slide 21 text
babel を通して使うJavaScript コードのサポート対象を指定す るパート 内部的には browserslist という npm package を利用してい る browserslist は、クエリをparse して caniuse-lite のデータを 元に対応ブラウザの情報を生成する caniuse-lite は caiuse のデータを元にしている caniuse は https://caniuse.com/ のデータを使っている模様 ここで取得した情報と、preset-env/data の情報をつきあわせ て対象ブラウザに polyfill が必要かどうかを判断している .babelrc の targets.browsers
Slide 22
Slide 22 text
browserslist をコマンドラインで使ってみると↓ のような感じで情報がとれる これと preset-env のdata 以下にある JSON の情報とつきあわせて判断する % npx browserslist "> 1%" and_chr 62 and_uc 11.4 chrome 63 chrome 62 firefox 57 ie 11 ios_saf 11.0-11.2 ios_saf 10.3 op_mini all safari 11 samsung 6.2 samsung 4 .babelrc の targets.browsers
Slide 23
Slide 23 text
No content
Slide 24
Slide 24 text
つまり……
Slide 25
Slide 25 text
ちゃんと指定すると 無駄な polyfill を適用しないで済む 衝突を気にしなくてよい 無駄な import が減る = 容量削減!
Slide 26
Slide 26 text
まとめ
Slide 27
Slide 27 text
polyfill は未実装の機能をnative に動くようにしてくれる、便 利なライブラリ polyfill は shim 一種。ブラウザ間のJavaScript の機能差異を 埋めてくれる .babelrc に useBuildIns があるので使うとよさそう .babelrc に targets.browsers があるので使うとよさそう 雰囲気でなく、あるものちゃんと使っていこう まとめ