Typescript: ЗависаниС компилятора ΠΏΡ€ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π΅ большого Ρ„Π°ΠΉΠ»Π° JS с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ --allowJs

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 8 июл. 2017  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: microsoft/TypeScript

ВСрсия TypeScript: 2.4.1

Π Π΅ΠΏΡ€ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚
ΠŸΡ€ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π΅ большого JS-Ρ„Π°ΠΉΠ»Π° (Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ парсСр) (245 ΠšΠ±Π°ΠΉΡ‚ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ commonjs) (с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ --allowJs ) компилятор зависаСт навсСгда. ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»Π΅Π½ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΏΡ€ΠΎ- ΠΏΡ€ΠΎΠ΅ΠΊΡ‚:

ОТидаСмоС повСдСниС:
Π‘Π±ΠΎΡ€ΠΊΠΈ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ с ошибками ΠΈΠ»ΠΈ Π±Π΅Π· Π½ΠΈΡ….

ЀактичСскоС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅:
ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ зависаСт навсСгда ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ процСссор.

Условия испытаний

  • Windows 10, NodeJS 8.0, TS 2.4.1
  • Врэвис: ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Linux, NodeJS 8.0, TS 2.4.1

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, просто Ρ…ΠΎΡ‚Π΅Π» ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ мСня Π΅ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅, Π±ΠΎΠ»Π΅Π΅ простоС воспроизвСдСниС Π½Π° https://github.com/filipesilva/tsc-allowjs-big-file. Он Π±Ρ‹Π» Π²Π΄ΠΎΡ…Π½ΠΎΠ²Π»Π΅Π½ Ρ€Π΅ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠ΅ΠΉ @dzonatan Π½Π° https://github.com/angular/angular-cli/issues/9636#issuecomment -390203543.

Π£ Π½Π΅Π³ΠΎ просто Π΅ΡΡ‚ΡŒ класс с тысячСй ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²:

export class BigClass {
  myVar: any;

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

Запуск npm test Π² этом Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ скомпилируСт этот Ρ„Π°ΠΉΠ» машинописного тСкста Π² javascript, Π° Π·Π°Ρ‚Π΅ΠΌ скомпилируСт ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» javascript с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ --allowJs .

Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ошибкС RangeError: Maximum call stack size exceeded с TS 2.7.2 ΠΈ 2.8.4. Однако Π² TS 2.9.1 ошибок Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈ компиляция Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.

ВсС 3 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π― попытался ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ здСсь происходит, ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ ЦП Π½Π° любой ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (Π΄Π°ΠΆΠ΅ 1 с) ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ сбою ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ° Chrome ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ профиля ЦП.

ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, вСроятно, бСсполСзно для Ρ„Π°ΠΉΠ»Π° 245k - ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ это ошибка ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с алгоритмичСской ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π² ΠΎΡ‡Π΅Π½ΡŒ Π³Π»ΡƒΠ±ΠΎΠΊΠΈΡ… стСках. Мой ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ - Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΈ просто ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠ°ΡƒΠ·Ρƒ нСсколько Ρ€Π°Π·. Π― Π²Π΅Ρ€Π½ΡƒΡΡŒ ΠΊ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ (ΠΈΠ»ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ кСшСй с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ printf), Ссли ΠΌΠ½Π΅ каТСтся, Ρ‡Ρ‚ΠΎ Π² локациях Π½Π΅Ρ‚ шаблона.

Π£ слова «мСстополоТСниС» Π΅ΡΡ‚ΡŒ Π΄Π²Π° Π²Π°ΠΆΠ½Ρ‹Ρ… значСния: ΠΊΠ°ΠΊΠΎΠΉ ΡƒΠ·Π΅Π» Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ провСряСтся, ΠΈ Π³Π΄Π΅ находится ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ инструкции, ΠΊΠΎΠ³Π΄Π° ΠΎΡ‚Π»Π°Π΄ΠΊΠ° приостановлСна.

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, просто Ρ…ΠΎΡ‚Π΅Π» ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ мСня Π΅ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅, Π±ΠΎΠ»Π΅Π΅ простоС воспроизвСдСниС Π½Π° https://github.com/filipesilva/tsc-allowjs-big-file. Он Π±Ρ‹Π» Π²Π΄ΠΎΡ…Π½ΠΎΠ²Π»Π΅Π½ Ρ€Π΅ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠ΅ΠΉ @dzonatan Π½Π° https://github.com/angular/angular-cli/issues/9636#issuecomment -390203543.

Π£ Π½Π΅Π³ΠΎ просто Π΅ΡΡ‚ΡŒ класс с тысячСй ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²:

export class BigClass {
  myVar: any;

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

Запуск npm test Π² этом Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ скомпилируСт этот Ρ„Π°ΠΉΠ» машинописного тСкста Π² javascript, Π° Π·Π°Ρ‚Π΅ΠΌ скомпилируСт ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» javascript с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ --allowJs .

Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ошибкС RangeError: Maximum call stack size exceeded с TS 2.7.2 ΠΈ 2.8.4. Однако Π² TS 2.9.1 ошибок Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈ компиляция Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ