1

私は、難解なJavaScriptを収集するためにクロムデバッガを実行しようとしていますが、スクリプトに対して多数のチャンクを返します。私はクロムが1つのJavaScriptファイルを複数のチャンクに分割する方法を知りたいですか?スクリプトの1つのまとまりは何ですか?Debugger.getScriptSourceはどのように機能しますか?

スクリプトファイルごとに、scriptタグとeval()関数が別々のチャンクが作成されることは承知しています。チャンクが作成される可能性のあるすべてのケースを特定したいだけです。たとえば、lazy parsingは一部の機能に対してチャンクを作成しますか?

プロセスがどのように動作しているかについて誰かが私にいくつかのドキュメントを教えてもらえるとよいでしょう。

Chrome debugging protocol API used

+0

この関数は、単に[idによってスクリプトを取得する](https://cs.chromium.org/chromium/src/v8/src/inspector/v8-debugger-agent-impl.cc?l=662&rcl=f212dbeaa1c0b0c97ef1d01c4cf61a2d920157b8) 。ですから、V8エンジンがソースコードから推測できるIDをどのように割り当てるのでしょうか。 – wOxxOm

答えて

2

Debugger.scriptParsedイベントが見つかりました。各スクリプトのscriptIdを生成するものです。解析された各スクリプトファイルはイベントを発生させ、一意のIDを受け取る必要があります。個々のスクリプトファイルだけでなく、ページソース内の<script>タグの各インスタンスも独自のIDを取得します。

イベントコールバックにはいくつかのパラメータが渡されます。 argumentsオブジェクトをログアウトすることによって、すべての引数を検査できます。たとえば、スクリプトファイルの場合はurlが返され、startLineの場合は、HTMLリソースに表示される<script>タグのオフセットが得られます。

on('Debugger.scriptParsed', function() { 
    console.log(JSON.stringify(arguments, null, 2)(
}); 

調査

あなたの更新の質問への応答では、私の理解では、デバッガモードでは、完全な解析を試みますし、事前に解析して最適化しようとしないということです。私はv8のコードベースを実際に理解することができませんでしたが、私は少しテストを行いました。

ボタンと別のスクリプトファイルでHTMLページを作成しました。私はページロードの直後に1つの関数を実行しました。ボタンをクリックすると、別の機能が実行されます。

document.addEventListener("DOMContentLoaded",() => { 
    document.getElementById('clickMe').addEventListener('click',() => clicked); 
}); 

私はDebugger.scriptParsedからの出力を検査しました。それはすぐにスクリプトファイルを解析しました。ボタンをクリックすると、追加の出力エントリはありませんでした。 evalを使用して動的に呼び出されるclickedを呼び出すようにハンドラーを変更した場合、新しいスクリプトチャンクが出力されました。

eval('clicked()'); 

これは、パーサが実行されるまでそれを知る方法がないため意味があります。同じことがインラインハンドラにも当てはまります。 onclick="doSomething()"

他のチャンクはChromeの拡張機能のURIと内部のURIです。

+0

Debugger.scriptParsedはscriptIdをパラメータとして受け取りませんか?私は、各スクリプトファイル、スクリプトタグ、およびeval()関数が別々のチャンクに解析されることを認識しています。チャンクが作成される可能性のあるすべてのケースを特定したいだけです。たとえば、遅延構文解析でもいくつかの関数のチャンクが作成されますか? –

+0

いいえ、 'Debugger.scriptParsed'はV8内部でトリガされるイベントです。デバッガとは異なります。getScriptSource'は(他のパラメータの中でも) 'scriptId'を受け付ける関数なので、通常は解析コールバックで呼び出します。私はいくつかのメモを追加しました。 –

関連する問題