Недавно я обновил свое угловое приложение с версии 14 до версии 15. В связи с необходимостью бизнеса нам необходимо поддерживать Chrome 69 для приложения. Итак, я добавил следующие строки кода в свой файл polyfills.ts:
import '@angular/localize/init';
import 'core-js/stable';
import 'regenerator-runtime/runtime';
import 'zone.js/dist/zone';
КомпиляторOptions в моем tsconfig.json выглядит следующим образом:
"compilerOptions": {
"baseUrl": "./",
"outDir": "./dist/out-tsc",
"sourceMap": true,
"declaration": false,
"downlevelIteration": true,
"experimentalDecorators": true,
"allowSyntheticDefaultImports": true,
"module": "es2020",
"moduleResolution": "node",
"importHelpers": true,
"target": "ES2022",
"typeRoots": [
"node_modules/@types"
],
"lib": [
"es2020",
"dom"
],
"useDefineForClassFields": false
}
Теперь мой код работает в последнем браузере Chrome. Но он не загружается в Chrome 69. Я вижу приведенные ниже строки ошибок в консоли разработчика Chrome 69.
Uncaught SyntaxError: Unexpected token . /polyfills.js:1
Uncaught SyntaxError: Unexpected token . /main.js:1
Любая помощь в решении этой проблемы будет принята с благодарностью. Заранее спасибо.
@ Navitas28 Да, я знаю. Вот почему я добавляю Polyfill для поддержки Chrome 69. Но это не работает. Мне нужна помощь, чтобы отладить проблему.
Я думаю, что Nivatas28 говорит о том, что цель tsconfig.json установлена на ES2022. Все современные браузеры поддерживают es6, согласно документации typescript: typescriptlang.org/tsconfig#target Chrome 69 был выпущен значительно позже ES6. Может быть, это лучшая цель





Как уже отмечалось, я бы начал с изменения цели вашего компилятора TypeScript на более раннюю версию ECMAScript, которая поддерживается более широко.
Сообщение об ошибке «Uncaught SyntaxError: Unexpected token» предполагает, что ваш код включает синтаксис языка, который не поддерживается Chrome 69.
Несмотря на то, что ваша конфигурация TypeScript нацелена на ES2022, Chrome 69 может не полностью поддерживать все функции ES2022, поэтому вы видите эту ошибку. Это указывает на то, что добавленные вами полифилы не обеспечивают необходимую функциональность.
Итак, в вашем файле tsconfig.json измените поле "target" с "ES2022" на "ES2015".
Ваш tsconfig.json будет включать:
"compilerOptions": {
...
"target": "ES2015",
...
}
После внесения этого изменения попробуйте снова скомпилировать и запустить приложение Angular. Если в вашем коде используются какие-либо функции ES2022, недоступные в ES6, компилятор TypeScript теперь преобразует эти функции в код, совместимый с ES6, который Chrome 69 должен понимать.
Обратите внимание, что при установке цели на ES2015 выводимый код JavaScript может быть немного более подробным и немного менее оптимизированным по производительности, чем при настройке на ES2022, потому что некоторые новые языковые функции нельзя использовать напрямую, и вместо этого их необходимо эмулировать с использованием старых конструкций JavaScript. .
Однако это не должно быть серьезной проблемой, если только вы не работаете с очень чувствительным к производительности приложением.
Если я изменю цель на ES2015, мне все еще нужно то, что есть в файле polyfills.ts, или я могу удалить его?
В общем, изменение цели в вашем файле tsconfig.json на ES2015 может уменьшить потребность в некоторых полифиллах, но не обязательно устраняет необходимость во всех них. Цель полифиллов — предоставить новые функциональные возможности в старых средах, которые изначально их не поддерживают.
Вот разбивка полифиллов, которые вы упомянули:
import '@angular/localize/init'; - Это пакет локализации Angular, и его необходимость не зависит от вашей цели ECMAScript.
import 'core-js/stable'; — Core-js — это модульная стандартная библиотека для JavaScript, которая включает полифиллы для ECMAScript до 2021 года. Она может вам все еще понадобиться в зависимости от конкретных функций, которые вы используете в своем коде.
import 'regenerator-runtime/runtime'; — Этот полифил специально позволяет вам использовать функции генератора и асинхронные функции в средах, которые изначально не поддерживают их. Если вы используете эти функции, вам все еще может понадобиться этот полифилл, даже с целью ES2015.
import 'zone.js/dist/zone'; — Это требование для механизма обнаружения изменений Angular и не связано с целью ECMAScript.
Таким образом, вам может понадобиться код в файле polyfills.ts, даже если вы измените цель на ES2015.
Однако важно проверить это на основе конкретных потребностей и зависимостей вашего приложения.
Также стоит отметить, что Angular CLI автоматически включит некоторые необходимые полифиллы на основе вашего файла .browserslistrc.
Я сделал изменения, которые вы сказали. Но когда я тестирую в Chrome 69, я получаю сообщение об ошибке в следующей строке кода:
textEncoder?? (textEncoder = new TextEncoder());Ошибка:
Unexpected token ?.Я провел поиск и выяснил, что это связано с тем, что chrome 69 не поддерживает функцию опциональной цепочки. Как я могу добавить полифилл для поддержки необязательных цепочек?
Чтобы поддерживать необязательную цепочку в вашем приложении Angular, вы можете попробовать использовать Babel-преобразование для дополнительной цепочки.
Во-первых, вам нужно установить плагин Babel. В зависимости от вашего менеджера пакетов вы можете сделать это с помощью одной из следующих команд:
npm install --save-dev @babel/plugin-transform-optional-chainingyarn add --dev @babel/plugin-transform-optional-chainingpnpm add --save-dev @babel/plugin-transform-optional-chainingЗатем вы должны добавить плагин в конфигурацию Babel. В вашем файле babel.config.json добавьте "@babel/plugin-transform-optional-chaining" к массиву plugins:
{
"plugins": ["@babel/plugin-transform-optional-chaining"]
}
Если у вас нет файла babel.config.json, вам нужно будет создать его в корне вашего проекта. Обратите внимание, что этот файл отделен от вашего файла tsconfig.json.
Спасибо @VonC. У меня вопрос вдогонку. Если я изменю цель на ES2015, мне все еще нужно то, что есть в файле polyfills.ts, или я могу удалить его?
@NitinAvula Я отредактировал ответ, чтобы ответить на ваш комментарий.
Спасибо, я сделал изменения, которые вы сказали. Но когда я тестирую в Chrome 69, я получаю сообщение об ошибке в следующей строке кода: textEncoder?? (textEncoder = новый TextEncoder()); Ошибка Неожиданный токен?. Я провел поиск и обнаружил, что это связано с тем, что chrome 69 не поддерживает функцию дополнительной цепочки. Как я могу добавить полифилл для поддержки необязательных цепочек?
@NitinAvula Не уверен: я отредактировал ответ, чтобы предложить один возможный вариант.
Я не думаю, что Chrome 69 поддерживает функции ES2022.