Kątowa 2/4/5 nie działa w IE11


124

Próbuję dowiedzieć się, dlaczego moja aplikacja kątowa 2 utknęła na wyświetlaniu Ładowanie ... podczas pracy w przeglądarce IE 11.

Idąc za czyjąś sugestią, wypróbowałem ten plunker, opublikowany przez kogoś w przypadku przepełnienia stosu, zarówno na Chrome, jak i IE 11. Działa dobrze na Chrome, ale nie działa na IE 11. Ten sam błąd, utknąłem na komunikacie „Ładowanie ...”

Plunker to: https://plnkr.co/edit/6zVFbrH5yohwc714gBbk?p=preview

<!DOCTYPE html>
<html>
  <head>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <title>Router Sample</title>
    <link rel="stylesheet" href="style.css">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/es6-shim/0.34.2/es6-shim.min.js"></script>
    <script src="https://code.angularjs.org/2.0.0-beta.1/angular2-polyfills.js"></script>
    <script src="https://code.angularjs.org/tools/system.js"></script>
    <script src="https://code.angularjs.org/tools/typescript.js"></script>
    <script src="https://code.angularjs.org/2.0.0-beta.1/Rx.js"></script>
    <script src="https://code.angularjs.org/2.0.0-beta.1/angular2.dev.js"></script>
    <script src="https://code.angularjs.org/2.0.0-beta.1/http.dev.js"></script>
    <script>
      System.config({
        transpiler: 'typescript', 
        typescriptOptions: { emitDecoratorMetadata: true }, 
        packages: {'src': {defaultExtension: 'ts'}} 
      });
      System.import('src/boot')
            .then(null, console.error.bind(console));
    </script>
  </head>

  <body>
    <my-app>loading...</my-app>
  </body>

</html>

Czy ktoś ma pomysł, dlaczego IE 11 nie uruchamia aplikacji angular 2?

Dziękuję Ci!


Odpowiedź brzmi: na razie użyj wersji 2.0.0-beta.0.
— Pat Bone Crusher Laplante

Odpowiedzi:


187

Najnowsza wersja angular jest domyślnie skonfigurowana tylko dla wiecznie zielonych przeglądarek ...

Obecna konfiguracja dotyczy tak zwanych „wiecznie zielonych” przeglądarek; ostatnie wersje przeglądarek, które aktualizują się automatycznie. Obejmuje to Safari> = 10, Chrome> = 55 (w tym Opera), Edge> = 13 na komputerze oraz iOS 10 i Chrome na urządzeniach mobilnych.
Obejmuje to również firefox, chociaż nie wspomniano.

Więcej informacji na temat obsługi przeglądarek wraz z listą sugerowanych wypełnień dla określonych przeglądarek można znaleźć tutaj. https://angular.io/guide/browser-support#polyfill-libs


Oznacza to, że musisz ręcznie włączyć prawidłowe wypełnienia, aby Angular działał w IE11 i poniżej.


Aby to osiągnąć, przejdź do polyfills.ts( srcdomyślnie w folderze) i po prostu odkomentuj następujące importy:

/***************************************************************************************************
 * BROWSER POLYFILLS
 */

/** 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/set';

Zwróć uwagę, że komentarz znajduje się dosłownie w pliku, więc łatwo go znaleźć.

Jeśli nadal masz problemy, możesz obniżyć wersję usługi targetdo es5in tsconfig.jsonzgodnie z @MikeDubsugestią. To powoduje zmianę danych wyjściowych kompilacji wszelkich es6definicji na es5definicje. Na przykład grube funkcje strzałkowe ( ()=>{}) zostaną skompilowane do anonimowych funkcji ( function(){}). Listę przeglądarek obsługiwanych przez es6 można znaleźć tutaj .


Uwagi

• W komentarzach @jackOfAllzapytano mnie, czy polifill IE11 są ładowane, nawet jeśli użytkownik jest w wiecznie zielonej przeglądarce, która ich nie potrzebuje. Odpowiedź brzmi: tak! Włączenie IE11 polyfills odbędzie plik PolyFill od ~162KBdo ~258KBdniem 8 sierpnia '17. Zainwestowałem w próbę rozwiązania tego problemu, jednak w tej chwili nie wydaje się to możliwe.

• Jeśli otrzymujesz błędy w IE10 i poniżej, przejdź do ciebie package.jsoni downgrade webpack-dev-serverdo 2.7.1specjalnie. Wyższe wersje nie obsługują już „starszych” wersji IE.


3
Mój projekt Angular 5 również ma ten sam błąd, nawet jeśli odkomentowałem polyfill dla IE, nadal nie mogę działać w przeglądarce IE. Zbyt dziwne ...
— Abby

Odkomentuj wszystkie wspomniane importy, a także importuj NgClass poniżej. Na koniec zainstaluj "npm install --save classlist.js". To zadziałało w moim przypadku.
— Vaibhav

2
@dudewad Eksperymentowałem z utworzeniem 2 oddzielnych pakietów, jednego wyraźnie dla IE11, a następnie opakowaniem tego pakietu w komentarz warunkowy IE, który powstrzymałby go przed przejściem w Chrome.
— Zze,

1
@Zze cóż, to z pewnością o tobie dokładny. Fajnie, podoba mi się to.
— dudewad

1
Komentarze warunkowe @Zze zostały usunięte w IE10, są obsługiwane tylko w IE5-9. Więc twój pakiet IE nie zostanie załadowany dla IE10 +, chyba że specjalnie podsłuchujesz klienta użytkownika, aby dodać swój pakiet do strony w czasie wykonywania.
— bmcminn

22

Miałem dokładnie ten sam problem i żadne z rozwiązań nie zadziałało. Zamiast tego dodano następującą linię w (stronie głównej) .html pod <head>poprawioną.

<meta http-equiv="X-UA-Compatible" content="IE=edge" />

Biorąc pod uwagę informacje z tego SO stackoverflow.com/questions/26346917/… , zalecenie użycia kompatybilnego z X-UA wydaje się być nieprawidłowe.
— Lubiluk

19

Dziś napotkałem ten problem. Znalazłem rozwiązanie na GitHubie, które nie wymaga przechodzenia do późniejszej wersji beta.

Dodaj następujący skrypt do swojego HTML:

<script src="node_modules/angular2/es6/dev/src/testing/shims_for_IE.js"></script>

To rozwiązało problem. Aby uzyskać więcej informacji, możesz śledzić problem z github tutaj: https://github.com/angular/angular/issues/7144


2
to rozwiązanie nie zadziałało dla mnie :( ... [w projekcie VS2015 działającym w IE]
— Ceylan Mumun Kocabaş

12

Stan na luty 2017 r

Korzystając z projektu Angular-Cli , wszystkie linie w polyfills.tspliku były już odkomentowane, więc wszystkie wypełnienia były już używane.

Znalazłem to rozwiązanie tutaj, aby naprawić mój problem.

Podsumowując powyższy link, IE nie obsługuje funkcji strzałek lambda / grubych strzałek, które są cechą es6 . ( To jest, jeśli polyfills.ts nie działa dla Ciebie ).

Rozwiązanie : musisz wybrać es5 , aby działał w dowolnej wersji IE, wsparcie dla tego zostało wprowadzone tylko w nowej przeglądarce Edge przez Microsoft.

Znajduje się w src/tsconfig.json:

"outDir": "../dist/out-tsc",
"sourceMap": true,
"target": "es5",

Ta odpowiedź jest bardzo myląca. Wypełnienia to skrypty, które sprawiają, że IE 9 i nowsze są zgodne ze standardami ES6, jak widać tutaj: angular.io/docs/ts/latest/guide/browser-support.html Nie ma więc znaczenia, czy przeglądarka natywnie obsługuje funkcje strzałek, wypełniacze całkowicie łagodzą ten problem.
— Zze

8
W jaki sposób to, czego doświadczyłem w moim przypadku ... wprowadza w błąd? Wypełnienia były już odkomentowane i nie rozwiązały problemu, który występował w IE11. Nie sądzę, żeby to zasługiwało na głosy przeciw.
— MikeDub

Po ponownym przeczytaniu tego, rozumiem, co próbujesz powiedzieć, ale sposób, w jaki jest to obecnie sformułowane, wygląda na to, że musisz ręcznie zmienić wszystkie swoje .tspliki z używania grubej strzałki na anon funcs. Myślę, że powinieneś wyciąć cytat z tego linku na temat tego, jak różnią się dane wyjściowe kompilatora, jeśli zmienisz cel skryptu ecma, który odtąd łagodzi problem.
— Zze

5
Co więcej, już celuję w es5 w moim tsconfig i nadal mam problemy.
— gh0st

1
@MikeDub Próbowałem użyć twojego rozwiązania, ale nie działa dla IE11. Czy możesz zapewnić mi lepsze podejście.
— Prasanna Sasne

11

Będziesz musiał dostosować plik polyfills.ts do swoich przeglądarek docelowych, odkomentowując odpowiednie sekcje.

/** 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';

1
To jest świetne. Dziękuję Ci.
— AtLeastTheresToast

10

Dla mnie z iexplorer 11 i Angular 2 naprawiłem wszystkie powyższe problemy, wykonując 2 rzeczy:

w index.html dodaj:

<meta http-equiv="X-UA-Compatible" content="IE=edge" />

w odkomentowaniu src \ polyfills.ts :

/** 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';

1
Tak, to działa dla IE11, ale nie dla IE10:ERROR Error: Uncaught (in promise): TypeError: Object doesn't support property or method 'setPrototypeOf' at EmptyError (http://localhost:4200/vendor.js:102653:9)
— Junior Mayhé

10
  1. Usuń komentarz z niektórych importów w pliku polyfill.ts.

/** 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';

Zainstaluj pakiety npm Zauważ, że w komentarzach znajduje się kilka poleceń instalacji npm. Jeśli używasz wczesnej wersji Angular CLI, może istnieć również trzecia. W przypadku wersji Angular CLI 7, 6 i 1.7 należy uruchomić:

npm install --save classlist.js

npm install --save web-animations-js

teraz otwórz IE, wyrenderuj aplikację i sprawdź :)


8

Od września 2017 r. (Wersja węzła = v6.11.3, npm wersja = 3.10.10), tak mi się udało (dzięki @Zze):

Edytować polyfills.ts i usuń komentarz z importu, który jest niezbędny dla IE11.

Dokładniej, edytuj polyfills.ts( srcdomyślnie znajduje się w folderze) i po prostu odkomentuj wszystkie wiersze wymagane dla IE11 (komentarze w pliku wyjaśniają dokładnie, jakie importy są niezbędne do uruchomienia w IE11).

Małe ostrzeżenie: zwróć uwagę podczas usuwania komentarzy w wierszach classlist.jsi web-animations-js. Każda z tych skomentowanych linii ma określony komentarz: musisz uruchomić skojarzone z nimi polecenia npm przed ich odkomentowaniem, w przeciwnym razie przetwarzanie polyfills.ts zepsuje się.

Krótko mówiąc, polyfills to fragmenty kodu, które implementują funkcję przeglądarki internetowej, która jej nie obsługuje. Dlatego w domyślnej konfiguracji polyfills.ts aktywny jest tylko minimalny zestaw importów (ponieważ jest przeznaczony dla tak zwanych „wiecznie zielonych” przeglądarek; ostatnie wersje przeglądarek, które aktualizują się automatycznie ).


8

EDYCJA 2018/05/15 : Można to osiągnąć za pomocą metatagu ; dodaj ten tag do swojego index.html i zignoruj ​​ten post.

To nie jest pełna odpowiedź na pytanie (na odpowiedź technicznego należy zapoznać się @ odpowiedź ZZE za wyżej ), ale jest ważnym krokiem, który potrzebuje do dodania:

TRYB ZGODNOŚCI

Nawet po zastosowaniu odpowiednich wypełniaczy nadal występują problemy z uruchamianiem aplikacji Angular 2+ przy użyciu wypełniaczy w IE11. Jeśli uruchamiasz witrynę poza hostem intranetowym (tj. Jeśli testujesz ją pod adresem http: // localhost lub inna zmapowana nazwa domeny lokalnej), musisz przejść do ustawień widoku zgodności i odznaczyć opcję „Wyświetlaj witryny intranetowe w widoku zgodności”, ponieważ widok zgodności IE11 łamie kilka konwencji zawartych w wypełniaczach ES5 dla Angular.

wprowadź opis obrazu tutaj


1
Jeśli zastosujesz się do tego rozwiązania, musisz to zrobić na wszystkich klientach, na których działa Twoja aplikacja. Dodanie specjalnego tagu do pliku html wymusza działanie przeglądarki w najnowszej dostępnej wersji zamiast w trybie zgodności. Zapoznaj się z następującą odpowiedzią, aby znaleźć tag: stackoverflow.com/a/47777695/4628364
— Poly,

2
Z mojego doświadczenia wynika, że ​​jeśli Twoja aplikacja jest udostępniana na hoście intranetowym, użycie tego metatagu nie zastępuje domyślnego ustawienia przeglądarki IE 11 na „Wyświetlaj witryny intranetowe w widoku zgodności”. Użytkownicy aplikacji intranetowej nadal będą musieli wejść i ręcznie odznaczyć tę opcję, która nie jest idealna. Obecnie szukam obejścia - być może kompiluję do ES5 zamiast ES6.
— Kyle Vassella

6

Mam aplikację Angular4, nawet jak dla mnie też nie działała w przeglądarce IE11, zrobiłem poniższe zmiany, teraz działa poprawnie. Po prostu dodaj poniższy kod w pliku index.html

<meta http-equiv="X-UA-Compatible" content="IE=edge" />

Wystarczy odkomentować poniższe wiersze z pliku polyfills.ts

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';

Te 2 powyższe kroki rozwiążą Twój problem, daj mi znać, jeśli coś tam będzie. Dzięki!!!


Mam już te 2 części odkomentowane, ale nadal nie działa, czy masz inne rozwiązanie
— Menna Ramadan

5

Jeśli nadal masz problemy, że nie wszystkie funkcje JavaScript działają, dodaj tę linię do swoich polyfillów. Naprawia brakującą metodę „wartości”:

import 'core-js/es7/object';

Ta linia naprawia brakującą metodę „zawiera”:

import 'core-js/es7/array'

4

Miałem ten sam problem, jeśli włączyłeś Wyświetlanie witryn intranetowych w widoku zgodności, polyfills.ts nie będzie działać, nadal musisz dodać następujący wiersz, jak powiedziano.

<meta http-equiv="X-UA-Compatible" content="IE=edge" />


2

Udało mi się wykonać następujące kroki, aby poprawić wydajność mojej aplikacji w IE 11 1.) W pliku Index.html dodaj następujące CDN

<script src="https://npmcdn.com/angular2@2.0.0- 
 beta.17/es6/dev/src/testing/shims_for_IE.js"></script>
<script 
src="https://cdnjs.cloudflare.com/ajax/libs/classlist/1.2.201711092/classList.min.js"></script>

2.) W pliku polyfills.ts i dodaj następujący import:

import 'core-js/client/shim';

2

W polyfills.ts

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/es7/array';

import 'core-js/es6/regexp';
import 'core-js/es6/map';
import 'core-js/es6/weak-map';
import 'core-js/es6/weak-set';
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`.

/** Evergreen browsers require these. **/
import 'core-js/es6/reflect';
import 'core-js/es7/reflect';

/**
 * Required to support Web Animations `@angular/animation`.
 * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation
 **/
import 'web-animations-js';  // Run `npm install --save web-animations-js`.

2

Jeśli żadne inne rozwiązanie nie zadziała, warto zbadać źródło problemu. Może być tak, że moduł npm bezpośrednio wstawia kod ES6, którego nie można przetransponować.

W moim przypadku miałem

SCRIPT1002: błąd składni vendor.js (114536,27) w następującym wierszu:

const ucs2encode = array => String.fromCodePoint(...array);

Przeszukałem folder node_modules i znalazłem, z którego pliku pochodzi linia. Okazało się, że winowajcą był punycode.js który w swojej wersji 2.1.0 korzysta bezpośrednio z ES6.

Po zdegradowaniu do wersji 1.4.1, która używa ES5, problem został rozwiązany.


1
Wielkie dzięki za odpowiedź. Chociaż nie rozwiązało to problemu, pomogło mi jednak znaleźć moduł troublemaker i poinformować jego autora o problemie.
— lucifer63

2

Jak rozwiązać ten problem w Angular8

polyfills.ts odkomentuj, import 'classlist.js'; a import 'web-animations-js';następnie zainstaluj dwie zależności, używając npm install --save classlist.jsi npm install --save web-animations-js.

zaktualizuj za tsconfig.jsonpomocą"target":"es5",

następnie ng serveuruchom aplikację i otwórz w IE, będzie działać


1
  1. Odkomentuj sekcję IE w src / polyfill.js,

    / ** IE10 i IE11 wymagają następujących elementów obsługi NgClass na elementach SVG * /

    import 'classlist.js';

  2. Jeśli jakikolwiek błąd kompilacji dla brakującego pakietu,

    npm install classlist.js --save-exact

  3. Pamiętaj, aby dołączyć poniższą linię, aby ustawić domyślny tryb dokumentu IE. W przeciwnym razie otworzy się w wersji 7

 <meta http-equiv="X-UA-Compatible" content="IE=edge" />

0

Wypróbowałem każde rozwiązanie w tym wątku, a także kilka innych, bez powodzenia. Ostatecznie naprawiłem to dla mnie, aby zaktualizować każdy pakiet w moim projekcie, w tym DUŻE zmiany wersji. Więc:

  1. Uruchom npm nieaktualny
  2. Zaktualizuj plik package.json z liczbą wyświetlaną w bieżącej kolumnie z wyników (może to zepsuć projekt, bądź ostrożny)
  3. Uruchom instalację npm
  4. Upewniłem się, że mam również odkomentowane wypełnienia, jak zauważono w innych odpowiedziach.

Otóż ​​to. Chciałbym móc wskazać, która biblioteka jest winowajcą. Rzeczywisty błąd, który otrzymywałem, to „Błąd składni” w vendor.js w Angular 6.


0

Angular 9 po wyjęciu z pudełka powinien teraz działać absolutnie dobrze w IE11.

Wypróbowałem wszystkie wymienione tutaj sugestie i żadna z nich nie zadziałała. Jednak udało mi się wyśledzić to do konkretnej biblioteki, w której importowałem app.module( ZXingScannerModulea dokładnie). Jeśli Twoja aplikacja nie działa w IE11 na pierwszej stronie, spróbuj usunąć biblioteki pojedynczo i sprawdź w IE11 - został całkowicie pominięty we wszystkich moich błędach ostrzegawczych kompilacji. Jeśli okaże się, że tak jest, rozważ podzielenie obszaru witryny, który używa tej biblioteki jako leniwego ładowania modułu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.