На работе у нас есть (вздох!) Поддержка IE 11 для текущего проекта, над которым я работаю. В проекте используется RxJS 6.
Для поддержки большинства функций, которые мы включили, мы использовали Webpack с Babel и core-js (как предложено самой Babel) в качестве полифиллера.
Если мы пытаемся импортировать RxJS, загрузка нашего приложения застревает в определенной строке:
Observable.prototype[_symbol_observable__WEBPACK_IMPORTED_MODULE_2__["observable"]] = function () {
return this;
};
с ошибкой SCRIPT5005: String Expected
.
Мы используем версию с переносом es5RxJS. Таким образом, исходный код машинописного кода должен быть этот .
Я знаю, что символы не поддерживаются в IE 11 согласно таблице совместимости Ecmascript в Kangax и 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
).
Любые подсказки об этой проблеме и как мы могли бырешить это? Может быть, это проблема полизаполнения?
Я прикрепляю сюда под моим конфигом веб-пакета и моим .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"]
}
}
}
Спасибо.