Typescript: Le compilateur se bloque lors de l'importation d'un gros fichier JS avec --allowJs

Créé le 8 juil. 2017  ·  3Commentaires  ·  Source: microsoft/TypeScript

Version de TypeScript: 2.4.1

Projet Repro
Lors de l'importation d'un gros fichier JS (un analyseur fonctionnel) (format commonjs de 245 Ko) (avec --allowJs activé), le compilateur se bloque pour toujours. Projet de repro minimal fourni: tsc-hang-00

Comportement prévisible:
Les compilations se terminent avec ou sans erreurs.

Comportement réel:
Les compilations sont suspendues pour toujours et continuent de consommer du processeur.

Conditions des tests

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

Commentaire le plus utile

Heya, je voulais juste dire que j'ai une autre repro plus simple à https://github.com/filipesilva/tsc-allowjs-big-file. Il a été inspiré par @dzonatan « s repro à https://github.com/angular/angular-cli/issues/9636#issuecomment -390203543.

Il a juste une classe avec mille méthodes:

export class BigClass {
  myVar: any;

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

L'exécution de npm test sur ce référentiel compilera ce fichier dactylographié en javascript, puis compilera le fichier javascript résultant avec --allowJs .

Cela donne l'erreur RangeError: Maximum call stack size exceeded avec TS 2.7.2 et 2.8.4. Cependant, avec TS 2.9.1, aucune erreur n'est générée et la compilation réussit.

Tous les 3 commentaires

J'ai essayé de profiler ce qui se passe ici et essayer de capturer un profil de processeur pour une durée quelconque (même 1 s) provoquera le crash du profileur Chrome lors du traitement du profil du processeur.

Le profilage n'est probablement pas utile pour un fichier 245k - il s'agit généralement d'un bogue ou d'un problème de performances algorithmiques, qui s'expriment généralement sous la forme de piles très profondes. Ma méthode de débogage initiale consiste à démarrer le débogage et à faire une pause quelques fois. Je reviendrai au profilage (ou au débogage printf des caches) s'il ne semble pas y avoir de modèle dans les emplacements.

Il y a deux significations pertinentes de «emplacement»: quel nœud est en cours de vérification et où se trouve le pointeur d'instruction lorsque le débogage est interrompu.

Heya, je voulais juste dire que j'ai une autre repro plus simple à https://github.com/filipesilva/tsc-allowjs-big-file. Il a été inspiré par @dzonatan « s repro à https://github.com/angular/angular-cli/issues/9636#issuecomment -390203543.

Il a juste une classe avec mille méthodes:

export class BigClass {
  myVar: any;

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

L'exécution de npm test sur ce référentiel compilera ce fichier dactylographié en javascript, puis compilera le fichier javascript résultant avec --allowJs .

Cela donne l'erreur RangeError: Maximum call stack size exceeded avec TS 2.7.2 et 2.8.4. Cependant, avec TS 2.9.1, aucune erreur n'est générée et la compilation réussit.

Cette page vous a été utile?
0 / 5 - 0 notes