web関連
【javascript】jsファイルを非同期で読み込む「defer/async」について
通常jsファイルは読み込みが始まると読み終わるまで次に進まないから一番最後(閉じのbodyタグ前)に書いているけど「defer/async」を使えば非同期で読み込んでくれるらしいので最後に書かなくてもいいらしいので調べた時のメモ
非同期で読み込む「defer/async」とは?
非同期っていうとピンとこないけど、htmlとjsファイルを並行して読み込んでくれるから表示が早くなるってやつらしい
「defer/async」の違いはjsファイルを読み込むまで一緒で実行する時のタイミングが違う
(async)
//並行して読み込み、完了次第即実行
//(多数のjsファイルで使うと実行がバラバラになったりする)
<script src="./script.js" async></script>
(defer)
//並行して読み込みhtmlの読み込みが完了次第順番に実行
//(多数のjsファイルがあっても上から順番に実行される)
<script src="./script.js" defer></script>
基本的に「defer」を使って、「async」はhtmlファイルが読み込み完了しなくてもさっさと実行させたいjsファイルがあるときに使えばよさそう
通常htmlファイルの読み込みでhead内にjsファイルなんかがあるとjsファイルの読み込みが終わるまでhtml読み込みが止まっちゃうからjsファイルは一番最後に書いてるけど「defer/async」使えばhead内に書いても関係なさそう
参考
<script> タグに async / defer を付けた場合のタイミング
スクリプトの非同期読み込み(async, deferの違い)
外部jsファイルを非同期で読み込むとファイル内のdocument.writeが無視される
「defer/async」を使って非同期で読み込むjsファイル内で「document.write」を使ってると出力されないみたい
こんな感じのエラーが出る
'Document'で 'write'を実行できませんでした。明示的に開かない限り、非同期にロードされた外部スクリプトから文書に書き込むことはできません。
Failed to execute 'write' on 'Document': It isn't possible to write into a document from an asynchronously-loaded external script unless it is explicitly opened.
参考
読み込みのタイミングによっては外部 script のdocument.writeは無視される
外部 script の読み込みのタイミングによってはdocument.writeが無視される場合がある
解決策:iframeを使う
どうしても外部jsファイルでdocument.writeを使いたい場合はiframeで対応ができるみたい
参考
外部ドメイン上のスクリプトのdocument.write処理の代替案について。
とりあえず( ..)φメモメモ
bodyの最後にjsファイルを読み込むかheadタグ内で「defer/async」を使うのどっちがいいのかは後で調べようかな
と思ったら参考記事見つけた
https://qiita.com/sadahiroyoshi/items/1e17a149505da839bc5a