Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
@babel/polyfill 再確認
Search
muryoimpl
January 24, 2018
Technology
1.5k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
@babel/polyfill 再確認
2018/01/24(水) に弊社 コワーキングにて開催されたカレンダー配布回でぐだったLTです
muryoimpl
January 24, 2018
More Decks by muryoimpl
See All by muryoimpl
Rubyで鍛える仕組み化プロヂュース力
muryoimpl
0
2.3k
人魚とたわむれる
muryoimpl
0
68
Kanzawa.rbのLT大会を支える技術の裏側を変更する Ruby on Rails + Litestream 編
muryoimpl
0
2.3k
Kanazawa.rb LT大会用/kzlt コマンドの説明 2024/01版
muryoimpl
0
3.1k
kzltコマンドの新たなソリューションについて
muryoimpl
0
3.1k
俺とTODOアプリ~Linearの変~
muryoimpl
0
2.9k
POSIX文字クラスでの躓き
muryoimpl
0
2.4k
/kzlt コマンドとは
muryoimpl
0
1.1k
meetup.kzrb.org の更新を考える 事前激闘編
muryoimpl
0
1.7k
Other Decks in Technology
See All in Technology
『止めない』を設計する — 制約の中で、事業の根幹を支える判断
hiroyaterui
0
230
ブラウザアプリの継続的パフォーマンスモニタリング (序) / Continuous Browser Application Performance Monitoring; Act 1
moznion
0
110
omasushiというライブラリを作った
polidog
PRO
0
140
#jawssonic2026 あの時代が悪かった ~動かなかったSageMakerと共に迎えたイベント当日~
ktkn1129
0
140
WAF 運用改善の承認サイクル/SRE_BizReach_MIXI_1
visional_engineering_and_design
1
360
Where Is JetBrains AI Heading- — Central CLI, Air Alpha, and the Agentic Development Stack
x5gtrn
PRO
0
140
設計の世代交代を乗り越える、14年続くAndroidアプリの開発戦略
sansantech
PRO
1
150
Bet AI Day 2026丨バクラク Autopilot、業務システムの再設計
layerx
PRO
2
1.6k
Autonomous AI Databaseサービス・アップデート(FY27)/ adb-service-update-jp-fy27
oracle4engineer
PRO
0
130
enechainの内製セルフサービスプラットフォーム
hiyosi
0
130
Bet AI Day 2026丨Production-Ready AI Agents — エンタープライズの実務を任せるための設計と運用
layerx
PRO
4
2.6k
AIで開発は速くなったのに、なぜ現場は楽にならないのか 〜あなたの組織のボトルネックを突き止めるワークショップ〜
jacopen
1
280
Featured
See All Featured
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
520
We Have a Design System, Now What?
morganepeng
55
8.3k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
400
How to build a perfect <img>
jonoalderson
1
6k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
AI: The stuff that nobody shows you
jnunemaker
PRO
9
980
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
500
Skip the Path - Find Your Career Trail
mkilby
1
220
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.7k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
380
Transcript
@babel/polyfill 再確認 2018 アジャイル事業部 年始のご挨拶 2 月担当: muryoimpl ( 無量井
健)
None
そもそも、polyfill って何?
Web 開発でいえば、ブラウザが未実装の機能を、導入すること で利用できるようにするコードのこと ネイティブ実装のように 動くようにしてくれるもののこと != 代替関数を用意してくれているライブラリ (lodash のような 便利関数の集まりとは違う)
polyfill とは?
@babel/polyfill (babel-polyfilll) core-js regenerator-runtime dialog-polyfill (material-design-lite で利用) raf にある polyfill.js
(React.js v16 利用時に必要) ( 私が使っている代表的な) polyfill ※ dialog-polyfill は HTML の <dialog> タグを使うためのものです。
最も利用機会が多いのは、 @babel/polyfill だと思うので 改めて利用方法を 確認してみましょう
Q: 中身どうなってるの? @babel/polyfill
A: core-js 内の shim.js と regenerator-runtime を 取り込んでいるだけ!! @babel/polyfill
None
Q: polyfill と Shim の違いって何? <!--[if lt IE 9]> <script
src="http://html5shim.googlecode.com/svn/trunk/html5.js"> </script> <![endif]-->
A: Shim は旧環境に新API を提供するも の polyfill はShim の一種でブラウザ間の API の差分をなくすもの
※ パテみたいなものが語源? 参考: http://2ality.com/2011/12/shim-vs-polyfill.html
None
Q: @babel/preset-env における polyfill の設定を雰囲気でやっている… どうなっているの?
.babelrc の設定でみるべきは以下の2つ 1. useBuiltIns 2. targets.browsers // .babelrc { "presets":
[ ["@babel/preset-env", { "useBuiltIns": "usage", "targets": { "browsers": ["last 2 versions", "safari 7"] } }] ] }
1. useBuiltIns
“usage” | “entry” | false の3 つの値をとれる default は false
どのように polyfill を import するかが異なる。うまく使うと ファイルサイズを減らせる browserslist から取得した環境に則って、polyfill を差し込む browserslist は後ほど説明する .babelrc の useBuiltIns
呼んだ各所に呼んだ関数を含むpolyfill のimport 文を挿入する ファイルに対して1 回しか読み込まない これが一番よさそう import 文を書かないから混乱する?(polyfill ってでも意識し ないものだよね?)
var a = new Promise(); ↓ import "core-js/modules/es6.promise"; var a = new Promise(); .babelrc の useBuiltIns: "usage"
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"
何もしない entry file に import “babel/polyfill” を書いていれば全 polyfill を読み込む import
"babel/polyfill"; .babelrc の useBuiltIns: false
2. targets.browsers
babel を通して使うJavaScript コードのサポート対象を指定す るパート 内部的には browserslist という npm package を利用してい
る browserslist は、クエリをparse して caniuse-lite のデータを 元に対応ブラウザの情報を生成する caniuse-lite は caiuse のデータを元にしている caniuse は https://caniuse.com/ のデータを使っている模様 ここで取得した情報と、preset-env/data の情報をつきあわせ て対象ブラウザに polyfill が必要かどうかを判断している .babelrc の targets.browsers
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
None
つまり……
ちゃんと指定すると 無駄な polyfill を適用しないで済む 衝突を気にしなくてよい 無駄な import が減る = 容量削減!
まとめ
polyfill は未実装の機能をnative に動くようにしてくれる、便 利なライブラリ polyfill は shim 一種。ブラウザ間のJavaScript の機能差異を 埋めてくれる
.babelrc に useBuildIns があるので使うとよさそう .babelrc に targets.browsers があるので使うとよさそう 雰囲気でなく、あるものちゃんと使っていこう まとめ