0

注: 私はこのサイトを開発したわけではありません。

LAB.js を使用して一連のスクリプトをヘッドに非同期的にロードするドキュメントがあります。さらに下には、さらに 2 つの外部スクリプトがあります。

これら 2 つのスクリプトは、しばしば到達不能です。どちらも「非同期」としてマークされており、ドキュメントの読み込みをブロックしません。ただし、他のスクリプトの実行を明らかにブロックします。

明確にするために、最初の一連のスクリプトはすぐにダウンロードされますが、他の 2 つの非同期スクリプトがダウンロードされるまで実行されないようです。

このサイトは公開されておらず、この種の問題は jsfiddle では作成できません。大雑把な説明:

<!doctype html>
<head>
     <!-- This script asynchronously loads many others -->
     <script src="/js/LAB.js"></script>

     <script src="slow-server/js/slowscript1.js" async></script>
</head>
<body>
     <script src="show-server/js/slowscript2.js" async></script>
</body>

Lab.js に関する情報: http://labjs.com/

LAB は、他のいくつかのスクリプト タグを head の前に追加して、非同期にロードします。それらはすべてすぐにダウンロードされますが、「低速サーバー」スクリプトが応答するまで実行されません。時間がかかることもあります。これは、非同期属性を持つスクリプトの動作が正しくないように思えます (Chrome でテストしています)。足りないものはありますか?

4

1 に答える 1

2

この MDN ページから:

これらの属性を使用して選択できる 3 つのモードがあります。async 属性が存在する場合、スクリプトは利用可能になるとすぐに非同期で実行されます。async 属性が存在せず、defer 属性が存在する場合、スクリプトはページの解析が終了したときに実行されます。どちらの属性も存在しない場合、ユーザー エージェントがページの解析を続行する前に、スクリプトが取得され、すぐに実行されます。

そのため、スクリプトに async がある場合、スクリプトはサーバーからすぐにフェッチされますが、DOM の解析は並行して続行されます。その部分は簡単で明確です。

次に、非同期スクリプトがフェッチされるとすぐに実行されます。この実行は、DOM の読み込みが完了する前または後に行われる可能性があり、純粋に読み込み/解析にかかるタイミングに依存します。また、ページ内の他の非非同期スクリプトが実行される前または後に行われる場合もあります。

ブラウザの JavaScript はシングル スレッドであるため、この非同期スクリプトの実行が開始されると、「非同期」であっても、このスクリプトが終了するまで他のスクリプトは実行されないことに注意してください。スクリプトの非同期により、DOM の解析を (ブロックするのではなく) 続行できますが、スクリプトが使用可能になるとスクリプトが実行されなくなり、スクリプトが実行されると、他の処理は実行が完了するまで待機する必要があります。

DOM と DOM 内の通常のスクリプトが読み込まれて実行されるまでスクリプトを実行しないようにする場合は、「async」ではなく「defer」を使用する必要があります。

参考までに、これらすべての実際の仕様について詳しく知りたい場合は、こちらを参照してください


これらすべてがあなたの正確な状況にどのように適用されるかについてより詳細な説明が必要な場合は、あなたの言葉が十分に明確ではないため、少なくとも質問しているスクリプトの疑似コード表現を提供する必要があります.

于 2013-10-25T19:42:34.197 に答える