Typescript: --allowJsを使用して大きなJSファイルをインポートするとコンパイラがハングする

作成日 2017年07月08日  ·  3コメント  ·  ソース: microsoft/TypeScript

TypeScriptバージョン: 2.4.1

リプロプロジェクト
大きなJSファイル(動作中のパーサー)(245 Kバイトのcommonjs形式)( --allowJs有効になっている)をインポートすると、コンパイラーが永久にハングします。 提供される最小限の再現プロジェクト: tsc-hang-00

予想される行動:
コンパイルはエラーの有無にかかわらず終了します。

実際の動作:
コンパイルは永久にハングし、CPUを消費し続けます。

テスト条件

  • Windows 10、NodeJS 8.0、TS 2.4.1
  • Travis:Linuxコンテナ、NodeJS 8.0、TS 2.4.1
Bug

最も参考になるコメント

Heya、 https://github.com/filipesilva/tsc-allowjs-big-fileに別のもっと簡単な再現があると言いたかっただけhttps: //github.com/angular/angular-cli/issues/9636#issuecomment-390203543にある@dzonatanの再現に触発されました。

1000個のメソッドを持つクラスがあります。

export class BigClass {
  myVar: any;

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

そのリポジトリでnpm testを実行すると、このtypescriptファイルがjavascriptにコンパイルされ、結果のjavascriptファイルが--allowJsコンパイルされます。

これにより、TS 2.7.2および2.8.4でRangeError: Maximum call stack size exceededエラーが発生します。 ただし、TS 2.9.1では、エラーはスローされず、コンパイルは成功します。

全てのコメント3件

ここで何が起こっているのかをプロファイリングしようとしましたが、CPUプロファイルを任意の時間(1秒でも)キャプチャしようとすると、CPUプロファイルの処理中にChromeプロファイラーがクラッシュします。

プロファイリングは、おそらく245kファイルには役立ちません。これは通常、バグまたはアルゴリズムのパフォーマンスの問題であり、どちらも通常、非常に深いスタックとして表されます。 私の最初のデバッグ方法は、デバッグを開始し、数回一時停止することです。 場所にパターンがないように思われる場合は、プロファイリング(またはキャッシュのprintfデバッグ)にフォールバックします。

'location'には、現在チェックされているノードと、デバッグが一時停止されているときの命令ポインタの2つの関連する意味があります。

Heya、 https://github.com/filipesilva/tsc-allowjs-big-fileに別のもっと簡単な再現があると言いたかっただけhttps: //github.com/angular/angular-cli/issues/9636#issuecomment-390203543にある@dzonatanの再現に触発されました。

1000個のメソッドを持つクラスがあります。

export class BigClass {
  myVar: any;

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

そのリポジトリでnpm testを実行すると、このtypescriptファイルがjavascriptにコンパイルされ、結果のjavascriptファイルが--allowJsコンパイルされます。

これにより、TS 2.7.2および2.8.4でRangeError: Maximum call stack size exceededエラーが発生します。 ただし、TS 2.9.1では、エラーはスローされず、コンパイルは成功します。

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

dlaberge picture dlaberge  ·  3コメント

MartynasZilinskas picture MartynasZilinskas  ·  3コメント

CyrusNajmabadi picture CyrusNajmabadi  ·  3コメント

kyasbal-1994 picture kyasbal-1994  ·  3コメント

manekinekko picture manekinekko  ·  3コメント