Typescript: El compilador se bloquea al importar un archivo JS grande con --allowJs

Creado en 8 jul. 2017  ·  3Comentarios  ·  Fuente: microsoft/TypeScript

Versión de TypeScript: 2.4.1

Proyecto Repro
Al importar un archivo JS grande (un analizador que funciona) (formato commonjs de 245 Kbytes) (con --allowJs habilitado), el compilador se bloquea para siempre. Proyecto de reproducción mínima proporcionado: tsc-hang-00

Comportamiento esperado:
Las compilaciones terminan con o sin errores.

Comportamiento real:
Las compilaciones se cuelgan para siempre y siguen consumiendo CPU.

Condiciones de las pruebas

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

Comentario más útil

Oye, solo quería decir que tengo otra reproducción más simple en https://github.com/filipesilva/tsc-allowjs-big-file. Se inspiró en la reproducción de https://github.com/angular/angular-cli/issues/9636#issuecomment -390203543.

Solo tiene una clase con mil métodos:

export class BigClass {
  myVar: any;

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

Ejecutar npm test en ese repositorio compilará este archivo mecanografiado en javascript, y luego compilará el archivo javascript resultante con --allowJs .

Esto produce el error RangeError: Maximum call stack size exceeded con TS 2.7.2 y 2.8.4. Sin embargo, con TS 2.9.1, no se produce ningún error y la compilación se realiza correctamente.

Todos 3 comentarios

Intenté perfilar lo que está sucediendo aquí e intentar capturar un perfil de CPU durante cualquier período de tiempo (incluso 1 s) hará que el generador de perfiles de Chrome se bloquee mientras procesa el perfil de la CPU.

La creación de perfiles probablemente no sea útil para un archivo de 245k; generalmente es un error o un problema de rendimiento algorítmico, los cuales generalmente se expresan como pilas muy profundas. Mi método de depuración inicial es comenzar a depurar y hacer una pausa unas cuantas veces. Volveré a la creación de perfiles (o la depuración de cachés mediante printf) si no parece haber un patrón en las ubicaciones.

Hay dos significados relevantes de 'ubicación': qué nodo se está comprobando actualmente y dónde está el puntero de instrucción cuando se pausa la depuración.

Oye, solo quería decir que tengo otra reproducción más simple en https://github.com/filipesilva/tsc-allowjs-big-file. Se inspiró en la reproducción de https://github.com/angular/angular-cli/issues/9636#issuecomment -390203543.

Solo tiene una clase con mil métodos:

export class BigClass {
  myVar: any;

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

Ejecutar npm test en ese repositorio compilará este archivo mecanografiado en javascript, y luego compilará el archivo javascript resultante con --allowJs .

Esto produce el error RangeError: Maximum call stack size exceeded con TS 2.7.2 y 2.8.4. Sin embargo, con TS 2.9.1, no se produce ningún error y la compilación se realiza correctamente.

¿Fue útil esta página
0 / 5 - 0 calificaciones