Приложение Angular Polyfill для Angular 14 выдает ошибку

Недавно я обновил свое угловое приложение с версии 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

Любая помощь в решении этой проблемы будет принята с благодарностью. Заранее спасибо.

Я не думаю, что Chrome 69 поддерживает функции ES2022.

Navitas28 31.05.2023 14:39

@ Navitas28 Да, я знаю. Вот почему я добавляю Polyfill для поддержки Chrome 69. Но это не работает. Мне нужна помощь, чтобы отладить проблему.

Nitin Avula 31.05.2023 15:01

Я думаю, что Nivatas28 говорит о том, что цель tsconfig.json установлена ​​​​на ES2022. Все современные браузеры поддерживают es6, согласно документации typescript: typescriptlang.org/tsconfig#target Chrome 69 был выпущен значительно позже ES6. Может быть, это лучшая цель

dj11223344 02.06.2023 19:13
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
2
3
99
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как уже отмечалось, я бы начал с изменения цели вашего компилятора 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 может уменьшить потребность в некоторых полифиллах, но не обязательно устраняет необходимость во всех них. Цель полифиллов — предоставить новые функциональные возможности в старых средах, которые изначально их не поддерживают.

Вот разбивка полифиллов, которые вы упомянули:

  1. import '@angular/localize/init'; - Это пакет локализации Angular, и его необходимость не зависит от вашей цели ECMAScript.

  2. import 'core-js/stable'; — Core-js — это модульная стандартная библиотека для JavaScript, которая включает полифиллы для ECMAScript до 2021 года. Она может вам все еще понадобиться в зависимости от конкретных функций, которые вы используете в своем коде.

  3. import 'regenerator-runtime/runtime'; — Этот полифил специально позволяет вам использовать функции генератора и асинхронные функции в средах, которые изначально не поддерживают их. Если вы используете эти функции, вам все еще может понадобиться этот полифилл, даже с целью ES2015.

  4. 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-chaining
  • Пряжа: yarn add --dev @babel/plugin-transform-optional-chaining
  • пнм: pnpm 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, или я могу удалить его?

Nitin Avula 05.06.2023 03:13

@NitinAvula Я отредактировал ответ, чтобы ответить на ваш комментарий.

VonC 05.06.2023 07:03

Спасибо, я сделал изменения, которые вы сказали. Но когда я тестирую в Chrome 69, я получаю сообщение об ошибке в следующей строке кода: textEncoder?? (textEncoder = новый TextEncoder()); Ошибка Неожиданный токен?. Я провел поиск и обнаружил, что это связано с тем, что chrome 69 не поддерживает функцию дополнительной цепочки. Как я могу добавить полифилл для поддержки необязательных цепочек?

Nitin Avula 05.06.2023 23:46

@NitinAvula Не уверен: я отредактировал ответ, чтобы предложить один возможный вариант.

VonC 06.06.2023 00:15

Другие вопросы по теме