2017-10-30 1 views
0

私はpolyfillを使ってPromiseを呼び出し、古いクライアントをフェッチします。私たちは、非同期の使用を推奨してポリフィルサービスからロード タグの属性を延期私のpolyfillやその他のスクリプトの設定は、それらが順番に読み込まれることを保証しますか?

their website彼らは、スクリプトが現代のコードを実行する前に完全にロードされたことを確認するスクリプト・ローダまたはそのコールバックを使用することをお勧めします ノンブロッキングウェイでロードすると、ポリフィルのロードが完了する前または後に、自分の コードが実行されるかどうかがわからないことを意味します。

あなた自身 のコードを実行しようとする前にpolyfillsが存在していることを確認するために、あなたはより洗練されたスクリプト・ローダを使用し、https://cdn.polyfill.io スクリプトタグにonloadイベントハンドラを添付したり、単純に評価するために、私たちの コールバック引数を使用することができますすでに彼らはまだブラウザが「doesnのない限り、彼らは(文書に表示される順序で非同期ロードされていることを保証

しかし、両方のスクリプトでdeferを設定しないでください。polyfillsは がロードされているグローバルコールバックサポートを延期する)?

<script src="https://cdn.polyfill.io/v2/polyfill.min.js" defer></script> 
<script src="modernscript.js" defer></script> 

答えて

2

MDN documentationdefer属性によると、スクリプトのロードがいつ発生するだけでページの読み込み時間のポイントを定義します。あなたはそれを見ることができるcitatedてきたドキュメントから

あなた自身 のコードを実行しようとする前にpolyfillsが存在していることを確認するには、あなたはhttps://cdn.polyfill.ioにonloadハンドラを添付することができます スクリプトタグ

1deferスクリプトが実行された場合、それははっきりと見ることができません(この回答へのコメントの中に指摘したように)ので、)、可能なブラウザ実装の違いを念頭に置いてください。そのような動作に頼るのは最善の考えではないかもしれません。

だから、より良い方法は、いずれか、次のようになります。

  1. 最初<script>タグに提案onloadハンドラを追加し、この内のコードをロードするためのダイナミック<script>タグを作成するには、いくつかのスクリプト・ローダ(例えばRequireJS
  2. を使用しますハンドラ
  3. Promise polyfillとコードをバンドルし(webpackなどの手動またはバンドラを使用)、単一のバンドルとしてロードします。
+0

もしあなたがこの回答を見ると、https://stackoverflow.com/a/32413657/5918874で、人々は実行の順序を保証すると信じているようです。またここに:https://www.sitepoint.com/non-blocking-async-defer/。私はpolyfill.ioドキュメントを正確に言及しました。なぜなら、それらが反対であると述べているからです(しかし、それは非同期と組み合わせた遅延についても言います)。そして、mozillaのドキュメントはそれについて何も言わない。それは変だ。 – vsjn3290ckjnaoij2jikndckjb

+0

これはおそらく私の間違いです:通常のスクリプトの読み込みプロセスは動作をブロックしています。 'async'スクリプトは非同期で読み込まれます。' defer'スクリプトは読み込みを開始する時点が異なる時点を定義しているようです。 polyfill.io docsは 'async'と' defer'属性の両方を追加することを提案しています。そのため、彼らは 'onload'ハンドラを追加することを提案しています。私は混乱を避けるために私の答えを取り除きます。 – Flying

+0

コメントの情報を含めるように回答を更新することにしました。スペックには明確な振る舞い定義がないので、そのようなタイプの負荷に頼るのを避け、代わりに他の選択肢を検討する方が良いでしょう。 – Flying

関連する問題