Typescript: Der Compiler hängt beim Importieren einer großen JS-Datei mit --allowJs

Erstellt am 8. Juli 2017  ·  3Kommentare  ·  Quelle: microsoft/TypeScript

TypeScript-Version: 2.4.1

Repro-Projekt
Beim Importieren einer großen JS-Datei (eines funktionierenden Parsers) (245 KByte CommonJS-Format) (mit aktiviertem --allowJs ) bleibt der Compiler für immer hängen. Minimales Reproprojekt bereitgestellt:

Erwartetes Verhalten:
Zusammenstellungen enden mit oder ohne Fehler.

Tatsächliches Verhalten:
Kompilierungen bleiben für immer hängen und verbrauchen weiterhin CPU.

Testbedingungen

  • Windows 10, NodeJS 8.0, TS 2.4.1
  • Travis: Linux Container, NodeJS 8.0, TS 2.4.1
Bug

Hilfreichster Kommentar

Heya, ich wollte nur sagen, dass ich unter https://github.com/filipesilva/tsc-allowjs-big-file einen weiteren, einfacheren Repro habe @dzonatans Repro unter https://github.com/angular/angular-cli/issues/9636#issuecomment -390203543 inspiriert.

Es gibt nur eine Klasse mit tausend Methoden:

export class BigClass {
  myVar: any;

  method000() { return this.myVar; }
  method001() { return this.myVar; }
  // ...
  method999() { return this.myVar; }
}

Wenn Sie npm test in diesem Repository ausführen, wird diese Typoskriptdatei in Javascript kompiliert und anschließend die resultierende Javascript-Datei mit --allowJs kompiliert.

Dies ergibt den Fehler RangeError: Maximum call stack size exceeded mit TS 2.7.2 und 2.8.4. Mit TS 2.9.1 wird jedoch kein Fehler ausgegeben und die Kompilierung ist erfolgreich.

Alle 3 Kommentare

Ich habe versucht zu profilieren, was hier vor sich geht, und der Versuch, ein CPU-Profil für einen beliebigen Zeitraum (sogar 1s) zu erfassen, führt dazu, dass der Chrome-Profiler während der Verarbeitung des CPU-Profils abstürzt.

Die Profilerstellung ist für eine 245k-Datei wahrscheinlich nicht hilfreich - es handelt sich normalerweise um einen Fehler oder ein algorithmisches Leistungsproblem, die sich beide normalerweise als sehr tiefe Stapel ausdrücken. Meine anfängliche Debugging-Methode besteht darin, mit dem Debuggen zu beginnen und nur einige Male zu pausieren. Ich werde auf die Profilerstellung (oder das Debuggen von Caches im Druck) zurückgreifen, wenn an den Speicherorten kein Muster vorhanden zu sein scheint.

Es gibt zwei relevante Bedeutungen von 'Ort': Welcher Knoten wird gerade überprüft und wo befindet sich der Befehlszeiger, wenn das Debuggen angehalten wird?

Heya, ich wollte nur sagen, dass ich unter https://github.com/filipesilva/tsc-allowjs-big-file einen weiteren, einfacheren Repro habe @dzonatans Repro unter https://github.com/angular/angular-cli/issues/9636#issuecomment -390203543 inspiriert.

Es gibt nur eine Klasse mit tausend Methoden:

export class BigClass {
  myVar: any;

  method000() { return this.myVar; }
  method001() { return this.myVar; }
  // ...
  method999() { return this.myVar; }
}

Wenn Sie npm test in diesem Repository ausführen, wird diese Typoskriptdatei in Javascript kompiliert und anschließend die resultierende Javascript-Datei mit --allowJs kompiliert.

Dies ergibt den Fehler RangeError: Maximum call stack size exceeded mit TS 2.7.2 und 2.8.4. Mit TS 2.9.1 wird jedoch kein Fehler ausgegeben und die Kompilierung ist erfolgreich.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

wmaurer picture wmaurer  ·  3Kommentare

CyrusNajmabadi picture CyrusNajmabadi  ·  3Kommentare

zhuravlikjb picture zhuravlikjb  ·  3Kommentare

Antony-Jones picture Antony-Jones  ·  3Kommentare

dlaberge picture dlaberge  ·  3Kommentare