@babel/polyfill 再確認
by
muryoimpl
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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 があるので使うとよさそう 雰囲気でなく、あるものちゃんと使っていこう まとめ