【发布时间】:2019-10-24 16:40:06
【问题描述】:
在工作中,我们有(叹气!)为我正在进行的当前项目支持 IE 11。 该项目使用 RxJS 6。
为了支持我们已经包含的大部分功能,我们使用了带有 Babel 的 Webpack 和 core-js(按照 Babel 本身的建议)作为 polyfill。
如果我们尝试导入 RxJS,我们的应用程序加载会卡在特定的行:
Observable.prototype[_symbol_observable__WEBPACK_IMPORTED_MODULE_2__["observable"]] = function () {
return this;
};
出现错误SCRIPT5005: String Expected。
我们使用的是 RxJS 的 es5 转译版本。所以代码原始打字稿代码应该是this one。
我知道 IE 11 不支持符号,根据 Kangax's Ecmascript compatibility table 并且 core-js 包含符号的 polyfill,我们正在导入所有的 polyfill。
事实上,如果我在通过控制台出错后尝试使用 polyfill 运行它,它会完美运行。
var obj = {};
Object.defineProperty(obj, Symbol.for("test"), {
value: 5
});
奇怪的是,如果我尝试在出错的行上设置断点,我可以毫无问题地单独访问这些组件。
Observable.prototype
_symbol_observable__WEBPACK_IMPORTED_MODULE_2__
_symbol_observable__WEBPACK_IMPORTED_MODULE_2__["observable"]
第二行和第三行返回一个对象。
如果我手动执行Observable.prototype[_symbol_observable__WEBPACK_IMPORTED_MODULE_2__["observable"]],它仍然会返回错误。
不允许通过对象访问Object.prototype(因为使用对象作为索引会使容器对象自动调用键上的.toString())。因此 IE 将这个错误返回给我。或者,至少,我认为这可能是原因。
更奇怪的是Symbol.for("test")返回一个与_symbol_observable__WEBPACK_IMPORTED_MODULE_2__["observable"]相同的对象(用description: test代替observable)。如果我这样做obj[Symbol.for("test")],它会完美运行。
另外,当我在 IE 11 控制台的断点处停止时,我似乎无法创建变量等,所以我什至无法导出该符号以稍后进行测试(它允许我执行 var x = {};或var x = 5,但如果我调用'x',它会抛出'x' is undefined)。
关于这个问题的任何线索以及我们如何解决这个问题? 这可能是 polyfill 的问题吗?
我附在我的 webpack 配置和我的 .babelrc 下方
module.exports = {
module: {
rules: [
{
test: /\.jsx?$/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env', '@babel/preset-react', '@babel/preset-flow'],
},
},
exclude: /node_modules\/(core-js|(react.+)|(rxjs.+))/,
},
...
]
}
}
{
"presets": [
"@babel/preset-react",
"@babel/preset-flow",
["@babel/preset-env", {
"targets": {
"browsers": [
"last 2 versions",
"safari >= 7",
"Explorer 11"
]
},
"useBuiltIns": true
}]
],
"plugins": [
"@babel/plugin-proposal-object-rest-spread",
"@babel/plugin-transform-runtime"
],
"env": {
"test": {
"presets": ["@babel/preset-env", "@babel/preset-react", "@babel/preset-flow"]
}
}
}
谢谢。
【问题讨论】:
-
我发现a post 关于
Symbol不是polyfill 的问题,你可以参考一下。问题的原因是babel配置。Babel不应转换core-js以获得正确的工作。里面有解决方案,可以参考this solution。 -
您好@YuZhou,谢谢您的回复!我已经排除了
core-js在 babel 配置中的转译,它无效。我忘了说。我在上面的帖子中添加了我的.babelrc和 webpack 配置。 -
这似乎是与您的情况有关的特定问题。我无法仅使用上述信息重现该问题。您能否向我们提供a minimal example 和重现该问题的步骤?这样我们就可以更好地了解这个问题并在我们身边进行测试。
-
是的,这似乎是我的情况。错误改变了(万岁!)。我犯了不同的错误。我将创建一个回复以包含所有详细信息。我还将包括我为重现问题而制作的示例。谢谢@YuZhou!
标签: javascript rxjs internet-explorer-11 core-js