Jake Archibaldが2013年にトピックにさらにポジティブな印象を与えるかもしれない洞察をいくつか示してくれたと思います。
https://www.html5rocks.com/en/tutorials/speed/script-loading/
聖杯は、レンダリングをブロックせずにすぐに一連のスクリプトをダウンロードし、追加された順にできるだけ早く実行することです。残念ながらHTMLはあなたを嫌い、あなたにそれをさせません。
(...)
答えは実際にはHTML5仕様にありますが、スクリプトの読み込みセクションの下部には隠されています。" 非同期IDL属性は、要素が非同期で実行されるかどうかを制御します。要素の" force-async "フラグが設定されている場合、取得時に非同期IDL属性がtrueを返し、設定時に" force-async "が返される必要がありますフラグは最初に設定解除する必要があります... "。
(...)
動的に作成されてドキュメントに追加されるスクリプトは、デフォルトでは非同期です。ダウンロードがすぐに実行されないため、レンダリングがブロックされず、間違った順序で実行される可能性があります。ただし、非同期ではないものとして明示的にマークすることができます。
[
'//other-domain.com/1.js',
'2.js'
].forEach(function(src) {
var script = document.createElement('script');
script.src = src;
script.async = false;
document.head.appendChild(script);
});
これにより、単純なHTMLでは実現できない動作がスクリプトに混在します。スクリプトは明示的に非同期ではないため、実行キューに追加されます。これは、最初のプレーンHTMLの例でスクリプトが追加されたキューと同じです。ただし、動的に作成されることにより、ドキュメントの解析の外部で実行されるため、ダウンロード中にレンダリングがブロックされることはありません(非同期XHRと非同期XHRの読み込みを混同しないでください。これは決して良いことではありません)。
上記のスクリプトは、ページの先頭にインラインで含める必要があり、プログレッシブレンダリングを中断することなくスクリプトダウンロードをできるだけ早くキューに入れ、指定した順序でできるだけ早く実行します。「2.js」は「1.js」より前に無料でダウンロードできますが、「1.js」が正常にダウンロードされて実行されるか、どちらかが失敗するまで実行されません。フラー!非同期ダウンロードですが、実行が順序付けられています!
それでも、これはスクリプトをロードする最も速い方法ではない可能性があります。
(...)上記の例では、ブラウザはスクリプトを解析して実行し、ダウンロードするスクリプトを見つける必要があります。これにより、スクリプトがプリロードスキャナーから隠されます。ブラウザーはこれらのスキャナーを使用して、次にアクセスする可能性が高いページ上のリソースを検出したり、パーサーが別のリソースによってブロックされている間にページリソースを検出したりします。
これをドキュメントの先頭に置くことで、発見しやすさを追加できます。
<link rel="subresource" href="//other-domain.com/1.js">
<link rel="subresource" href="2.js">
これは、ページに1.jsと2.jsが必要であることをブラウザに伝えます。link [rel = subresource]はlink [rel = prefetch]と似ていますが、セマンティクスが異なります。残念ながら現在はChromeでのみサポートされており、リンク要素を介して1回、スクリプト内で2回ロードするスクリプトを宣言する必要があります。
修正:最初に、これらはプリロードスキャナーによって取得されたと述べましたが、そうではなく、通常のパーサーによって取得されました。ただし、プリロードスキャナーはこれらを取得できますが、まだ取得できません。実行可能コードに含まれているスクリプトをプリロードすることはできません。コメントで私を訂正してくれたYoav Weissに感謝します。
async
は新しいものですがdefer
、IE4からIEの一部になっています。defer
最近、他のブラウザに追加されましたが、これらのブラウザの古いバージョンは、ぶらさがりが少ない傾向にあります。