Typescript: O compilador trava ao importar um arquivo JS grande com --allowJs

Criado em 8 jul. 2017  ·  3Comentários  ·  Fonte: microsoft/TypeScript

Versão TypeScript: 2.4.1

Projeto Repro
Ao importar um grande arquivo JS (um analisador funcional) (formato commonjs de 245 Kbytes) (com --allowJs habilitado) o compilador trava para sempre. Projeto de reprodução mínimo fornecido: tsc-hang-00

Comportamento esperado:
As compilações terminam com ou sem erros.

Comportamento real:
As compilações ficam suspensas para sempre e continuam consumindo CPU.

Condições de teste

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

Comentários muito úteis

Ei, só queria dizer que tenho outra reprodução mais simples em https://github.com/filipesilva/tsc-allowjs-big-file. Foi inspirado pela reprodução de https://github.com/angular/angular-cli/issues/9636#issuecomment -390203543.

Tem apenas uma classe com mil métodos:

export class BigClass {
  myVar: any;

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

Executar npm test nesse repositório irá compilar este arquivo typescript para javascript e, em seguida, compilar o arquivo javascript resultante com --allowJs .

Isso resulta no erro RangeError: Maximum call stack size exceeded com TS 2.7.2 e 2.8.4. No entanto, com o TS 2.9.1, nenhum erro é gerado e a compilação é bem-sucedida.

Todos 3 comentários

Tentei traçar o perfil do que está acontecendo aqui e tentar capturar um perfil de CPU por qualquer período de tempo (mesmo 1s) fará com que o criador de perfil do Chrome trave durante o processamento do perfil de CPU.

A criação de perfil provavelmente não é útil para um arquivo de 245k - geralmente é um bug ou um problema de desempenho de algoritmo, que geralmente se expressam como pilhas muito profundas. Meu método de depuração inicial é começar a depurar e apenas pausar algumas vezes. Vou recorrer à criação de perfil (ou depuração de caches de printf) se não parecer haver um padrão nos locais.

Existem dois significados relevantes de 'localização': qual nó está sendo verificado no momento e onde o ponteiro da instrução está quando a depuração é pausada.

Ei, só queria dizer que tenho outra reprodução mais simples em https://github.com/filipesilva/tsc-allowjs-big-file. Foi inspirado pela reprodução de https://github.com/angular/angular-cli/issues/9636#issuecomment -390203543.

Tem apenas uma classe com mil métodos:

export class BigClass {
  myVar: any;

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

Executar npm test nesse repositório irá compilar este arquivo typescript para javascript e, em seguida, compilar o arquivo javascript resultante com --allowJs .

Isso resulta no erro RangeError: Maximum call stack size exceeded com TS 2.7.2 e 2.8.4. No entanto, com o TS 2.9.1, nenhum erro é gerado e a compilação é bem-sucedida.

Esta página foi útil?
0 / 5 - 0 avaliações