如何使用 babel / core-js 检测特征并仅延迟加载所需的 polyfill?



像 polyfill.io 这样的Polyfill服务似乎只向浏览器提供小的功能检测,然后延迟加载实际需要的polyfill。

据我了解 babel 关于填充的文档,babel 总是包含可能需要的全套 polyfill:它将处理一个browserslist,然后包含来自 core-js 的那些最弱浏览器需要的 polyfill。像 webpack 这样的捆绑器可能会将所有这些 polyfill 合并到应用程序中,但没有运行时功能检测。

我的应用程序使用现代 ES 语言功能,但也面向各种浏览器,包括 IE10 和 IE11。这需要大量的 polyfill,并且可能会使捆绑包膨胀,特别是对于可能不需要大多数 polyfill 的现代浏览器。

所以我想知道:我是否可以告诉 babel 和/或 webpack 只包含特征检测,将 polyfill 拆分为单独的块(单独或分成小包(,然后在运行时,只"懒惰"加载实际需要的东西?

像 polyfill.io 这样的服务会根据预定义的集合调查您的User Agent,并在此基础上为您提供不同的 polyfill 捆绑包。你试图做的事情实际上是不同的。

我可以考虑的一个解决方案是将代码拆分引入您的构建中(默认情况下在 Webpack 4 生产构建中处于启用状态(并在您的项目中创建多个文件,每个文件将导入一组不同的 polyfill。这将要求您手动导入填充项,但允许您拥有多个填充项块,每个填充区块都有不同的缺失要素子集。在拥有这些块之后,您可以在应用程序启动时使用一些功能检测(可能是 Modernizr(,并仅动态加载浏览器所需的那些块。请记住,此过程相当繁琐 - 您需要手动包含每个填充物。它的另一个缺点是,它需要向服务器发出多个请求,这会进一步减慢您的应用程序启动时间。

至于您问题的其他部分 - webpack/babel 不会为您执行自动 polyfill 块拆分和运行时功能检查,这些需要手动处理。

最新更新