如何让babel-polyfill按需加载?
babel-polyfill
可以让我们愉快的使用浏览器不兼容的es6
、es7
的API
,但往往项目中只会用到这些API
的一部分,一个babel-polyfill
压缩后也有近100k的大小,这确实很恐怖。
比如我希望项目里用到Promise
,打包时只加载Promise
的部分代码,而非整个polyfill
。
如何能让babel-polyfill
按需加载呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
preact的模板是单独打包polyfills然后在模板里面加上
<script>window.fetch||document.write('<script src="<%= htmlWebpackPlugin.files.chunks["polyfills"].entry %>"><\/script>')</script>
然后在webpack配置里面排除这个文件自动插入到html模板中
差不多就是那个意思,不知道还有什么好办法
你的意思应该是,根据用户浏览器加载
polyfill
, 而不是在打包阶段解决这个事情,如果你知道你的项目用了哪些可能需要
polyfill
的东西, 引用第三方的polyfill服务
可能比较合适比如只用了
map
,Promise
这样引用,polyfill服务会安需加载https://cdn.polyfill.io/v2/polyfill.js?features=Array.prototype.map,Promise
用"transform-runtime"
.babelrc
类似如下方式
方式1
方式2
上面两种方式的区别,第一种是模块内引入,而第二种是全局的,你可以根据需求选择合理的方式。
babel 7 的 @babel/preset-env 的
useBuiltsIns
提供了相对比较完美的解决方案 :useBuiltIns 默认为 false
根据 browserlist 是否转换新语法与 polyfill 新 API
import '@babel/polyfill'
, 会无视 browserlist 将所有的 polyfill 加载进来import '@babel/polyfill'
, 这样会根据 browserlist 过滤出 需要的polyfill
import '@babel/polyfill'
(加上也无妨,构造时会去掉), 且会根据 browserlist + 业务代码使用到的新 API 按需进行 polyfill