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

How to detect features and lazy-load only the needed polyfills with babel / core-js?

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

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

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

所以我想知道:我可以告诉 babel and/or webpack 只包含功能检测,将 polyfill 拆分成单独的块(单独或分成小包),然后在运行时只 "lazy"-加载实际需要的东西?

polyfill.io 之类的服务根据预定义的集合调查您的 User Agent,并基于此为您提供不同的 polyfill 包。你想要做的实际上是完全不同的。

我能想到的一个解决方案是在您的应用程序启动时引入 code splitting into your build (it is on by default in Webpack 4 production build) and create several files in your project, where each would import a different set of polyfills. This will require you to import polyfills manually, but will allow you to have several polyfill chunks, each with a different subset of missing features. After you will have those chunks, you could use some feature detection (probably Modernizr) 并仅动态加载浏览器需要的那些块。请记住,这个过程相当麻烦——您需要手动处理每个 polyfill。它的另一个缺点是,它需要向服务器发出多个请求,这会额外减慢您的应用启动时间。

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