2015-09-05 11 views
9

私のプロジェクトのHEADセクションで使用されている外部スクリプトにdefer属性を追加しています。私は複数のdefer'edスクリプトタグの実行順序に関するクエリを持っていました。ブラウザでスクリプトと実行順序を延期する

以下

は、私たちはより良い私のクエリを理解するのに役立ちます私の観察です:

延期属性が存在しているhttp://www.w3.org/TR/html5/scripting-1.html

1として、ページが

を解析し終えたときにスクリプトが実行されます

defer属性が機能します。しかし、私は実行命令に疑問があります。 FFとChromeで違うようです。私porject 1として

ここ
<script defer="defer" src="{SERVER_PATH}/deps.js?1441452359"></script> 
<script defer="defer" src="{SERVER_PATH}/script1.js?1440067073"></script> 
<script defer="defer" src="{SERVER_PATH}/script2.js?1441451916"></script> 

は、20〜50キロバイトのレギュラーサイズ(gzipされた)のscript1-3あり、一方、120キロバイト(gzip圧縮された)の周りの巨大なファイルであるdeps.js。

Firefoxでは、延期されたスクリプトの実行は外観順に開始されますが、同じ順序で完了することはありません。以前のスクリプトが実行を完了しない限り、次のスクリプトの実行は開始されません。 Chromeは理にかなっているようです。

実行順序をテストするために、各スクリプトの最初と最後の行にconsole.logを挿入しました。クロームのコンソール出力の下

Execution Start: deps 
Execution Start: script1 
Execution Start: script2 
// Script Error as script1 needs deps to render completely. 
// Script Error as script2 needs deps to render completely. 
Execution End: deps 

:deps.jsのFirefoxのコンソール出力の下

console.log("Execution Start: deps"); 
// minified deps script content. 
console.log("Execution End: deps"); 

に上記のように

Execution Start: deps 
Execution End: deps 
Execution Start: script1 
Execution End: script1 
Execution Start: script2 
Execution End: script2 

しかし、FFの動作は、常にではありません。 Chromeのように機能することもあります。それはFirefoxのような問題のように見えます。または、deps.jsファイルが重くて小さくなり、レンダリングに時間がかかるためです。

似たような経験を持つ人は誰でも私を助けることができますか?他の情報が必要な場合はお知らせください。

PS:ページの一番下にスクリプトを移動するなどの他の解決策は、私が今見ているものではありません。

+3

ファイルを遅延すると、ファイルに確実に実装されていれば、要素に表示されるようにファイルが実行されることが保証されます。問題の私の好きな説明:http://www.growingwiththeweb.com/2014/02/async-vs-defer-attributes.html –

+1

@NinoŠkopac私はあなたに同意します。彼らは順番に実行する必要があります。しかし、FFは時々differentyに振る舞い、実行開始順序は同じですが、実行終了順序は同じではありません。同じ実装がChromeで正常に動作します。奇妙な –

+0

最新のFFを使用していますか? –

答えて

4

HTML5.0の仕様はこれを言う:

要素は、src属性を持ち、かつ要素が延期属性を持ち、要素が「パーサ挿入」としてフラグが立てられてきた、と要素がない場合非同期属性を持たない

要素は、要素を作成したパーサーのドキュメントに関連付けられた解析が完了したときに実行されるスクリプトのリストの最後に追加する必要があります。

フェッチアルゴリズムが完了した後にネットワークタスクソースがタスクキューに置くタスクは、要素の「準備完了パーサー実行」フラグをセットする必要があります。パーサーはスクリプトの実行を処理します。

したがって、関連付けられているDocumentが解析されるまでスクリプトの実行を延期するとも言われています。また、リストにプッシュされています。したがって、リストの順序は、スクリプトの順序が解析されて挿入される順序にする必要があります。

しかし、私の心配の第二部の種類。基本的には、ネットワークタスクがスクリプトをダウンロードするまで実行されるまでマークされるだけです。次に、... "パーサーはスクリプトの実行を処理します"。私は仕様で見つけることができませんでした何

は、ドキュメントの解析後のスクリプトの実行を覆うケースです。彼らは "パーサー実行の準備が整う"ようにリストの順序でスクリプトを実行し続けますか?または、リスト内のすべてのスクリプトが「パーサー実行の準備ができている」まで待ってから実行します。

スペック(ステップ15):http://www.w3.org/TR/html5/scripting-1.html#script-processing-src-prepare

+0

それは彼らが順番に実行されることを聞きます。すべてがダウンロードされるのを待っている場合、または実装が定義されていない可能性があります。 –

+0

私はそれが最も良い実装である可能性が高いことに同意します。私が書いたとき、この答えは、ブラウザ間で起こりうるさまざまな振る舞いを示唆していました。ほとんどの場合そうではありませんでしたが。 – MinusFour

0

「実行終了」ログは、「実行開始」ログとは異なるイベントループで行われていない限り、私はそれが本当に可能ではないかなと思います。

あなたはそれを保証できますか?そうでない場合は、Firefixがここでマルチスレッドを行うことを意味します。われわれが知っているように、JSのサポートはありません。