Ошибка ожидаемого идентификатора IE 11 для оператора распространения, обнаруженная в коде AJV

В моем приложении Angular 6 я получаю консольную ошибку в IE 11 как «Script1010:« Ожидаемый идентификатор ». Нет проблем с вечнозелеными браузерами.

Ошибка возникает при первом "." в функции оператора распространения, идентифицированной в связанном файле js:

function(e,t,n){"use strict";function 1(...e){if(e.length>1)
{e[0]=e[0].slice(0,-1);const t=e.length-1;for(let n=1;n<t;++n)e[n]=e[n].slice(1,-1);return e[t]=e[t].slice(1),e.join("")}

Выполняя поиск по ключевым словам в этой строке кода, я обнаружил, что это происходит из файла ajv.min.js, в частности, возможно, в этом разделе кода из файла:

44: [function(e, r, t) {
        var a;
        a = this,
            function(e) {
                "use strict";

                function C() {
                    for (var e = arguments.length, r = Array(e), t = 0; t < e; t++) r[t] = arguments[t];
                    if (1 < r.length) {
                        r[0] = r[0].slice(0, -1);
                        for (var a = r.length - 1, s = 1; s < a; ++s) r[s] = r[s].slice(1, -1);
                        return r[a] = r[a].slice(1), r.join("")
                    }
                    return r[0]
                }

Очевидно, оператор распространения не переносится во что-то, что IE11 может переварить, и браузер задыхается от первого периода в аргументе функции (... e) с ошибкой «Ожидаемый идентификатор».

Есть ли какие-либо предложения по обходным путям или конкретные полифиллы для решения проблемы?


person Scott B    schedule 13.04.2020    source источник


Ответы (2)


Браузер IE не поддерживает синтаксис распространения и параметр Rest, чтобы получить тот же результат. , вы можете обратиться к следующим методам:

Метод 1:
Использование методов JavaScript (таких как: foreach или метод массива) для циклического перебора параметров или элементов массива вместо использования синтаксиса Spread или параметра Rest. Более подробную информацию можно найти по следующим ссылкам:

Эквивалент оператора распространения в IE - Javascript

IE синтаксиса распространения ES6 не поддерживается

Альтернативы синтаксиса распространения

Метод 2:
с использованием @ babel / polyfill и babel-plugin-transform-object-rest-spread полифиллов. Попробуйте использовать следующую команду для установки полифила:

npm install --save @ babel / polyfill

npm install --save-dev babel-plugin-transform-object-rest-spread

Кроме того, поскольку браузер IE не поддерживает синтаксис ES 6, проверьте файл polyfills.ts и раскомментируйте соответствующий пакет для браузера IE.

/** IE9, IE10 and IE11 requires all of the following polyfills. **/
 import 'core-js/es6/symbol';
 import 'core-js/es6/object';
 import 'core-js/es6/function';
 import 'core-js/es6/parse-int';
 import 'core-js/es6/parse-float';
 import 'core-js/es6/number';
 import 'core-js/es6/math';
 import 'core-js/es6/string';
 import 'core-js/es6/date';
 import 'core-js/es6/array';
 import 'core-js/es6/regexp';
 import 'core-js/es6/map';
 import 'core-js/es6/weak-map';
 import 'core-js/es6/set';

/** IE10 and IE11 requires the following for NgClass support on SVG elements */
// import 'classlist.js';  // Run `npm install --save classlist.js`.

/** IE10 and IE11 requires the following for the Reflect API. */
 import 'core-js/es6/reflect';


/** Evergreen browsers require these. **/
// Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove.
import 'core-js/es7/reflect';
person Zhi Lv    schedule 14.04.2020
comment
+1 Спасибо! Я собираюсь попробовать добавить импорт babel в файл polyfills.ts по умолчанию и посмотреть, решит ли он проблему. - person Scott B; 16.04.2020

Проблема здесь была в punycode.js. Принудительное использование punycode.js до версии 1.4.1 устраняет проблему. Наша версия ajv вызвала загрузку более поздней версии punycode.js, и эта версия содержит код ES6, который запускает IE.

person Scott B    schedule 22.04.2020