TypeScriptバージョン: 2.4.1
リプロプロジェクト
大きなJSファイル(動作中のパーサー)(245 Kバイトのcommonjs形式)( --allowJs
有効になっている)をインポートすると、コンパイラーが永久にハングします。 提供される最小限の再現プロジェクト: tsc-hang-00
予想される行動:
コンパイルはエラーの有無にかかわらず終了します。
実際の動作:
コンパイルは永久にハングし、CPUを消費し続けます。
テスト条件
ここで何が起こっているのかをプロファイリングしようとしましたが、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では、エラーはスローされず、コンパイルは成功します。
最も参考になるコメント
Heya、 https://github.com/filipesilva/tsc-allowjs-big-fileに別のもっと簡単な再現があると言いたかっただけhttps: //github.com/angular/angular-cli/issues/9636#issuecomment-390203543にある@dzonatanの再現に触発されました。
1000個のメソッドを持つクラスがあります。
そのリポジトリで
npm test
を実行すると、このtypescriptファイルがjavascriptにコンパイルされ、結果のjavascriptファイルが--allowJs
コンパイルされます。これにより、TS 2.7.2および2.8.4で
RangeError: Maximum call stack size exceeded
エラーが発生します。 ただし、TS 2.9.1では、エラーはスローされず、コンパイルは成功します。