This article启发了我将我正在为我的React应用程序加载的polyfill外部化,并且仅将它们加载到需要它们的浏览器中。一个简单的测试:
function browserSupportsAllFeatures() {
return window.Promise && window.fetch && window.regeneratorRuntime
}
然后将确定是否应加载polyfills:
if (browserSupportsAllFeatures()) {
// Browsers that support all features run `main()` immediately.
main()
} else {
// All other browsers loads polyfills and then run `main()`.
loadScript('/path/to/polyfills.js', main)
}
function main(err) {
// Initiate all other code paths.
// If there's an error loading the polyfills, handle that
// case gracefully and track that the error occurred.
}
但是,我在代码中使用了生成器,这似乎有些极端。根据我的理解,babel变换生成器(https://babeljs.io/docs/plugins/transform-regenerator/)和转译的代码也将需要定义
regeneratorRuntime
(使用this package)。所以我的应用失败了,因为导入
regeneratorRuntime
时未定义App
(其中包含使用生成器的代码)。所以我的polyfills为时已晚// import dependencies
import React from 'react'
import { render } from 'react-dom'
import { App } from './components/app'
const renderApp = () => {
render(<App />, document.getElementById('app'))
}
function browserSupportsAllFeatures() {
return window.Promise && window.fetch && window.regeneratorRuntime
}
if (browserSupportsAllFeatures()) {
renderApp()
} else {
loadScript('/path/to/polyfills.js', renderApp);
}
我知道我可以通过在顶部导入再生器来解决此问题,但是这里的目的是外部化polyfill并使其成为有条件的。
所以我的问题是;如何继续使用生成器,但仍将Polyfill包含在
loadScript
调用中? 最佳答案
您可以使用以下方法检查属性:
if (window.hasOwnProperty("regeneratorRuntime")) ...
npm软件包polyfill-io-feature-detection的功能完全相同,请查看此解决方案以了解其如何处理特征检测:
https://github.com/jquintozamora/polyfill-io-feature-detection
关于javascript - 如何有条件地使用Regenerator-Runtime Polyfill?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42739695/