scriptタグとは?defer/async最適化の基本について解説

scriptタグとは?defer/async最適化の基本について解説

ページ速度と安定性に直結するscriptタグの基礎

scriptタグはJavaScriptを外部・インラインで読み込み、実行順や場所により描画へ大きく影響します。基本は外部化し、deferasyncでブロッキングを避けます。まずは レンダリングブロックの回避 を前提に、依存関係と実行タイミングを整理します。

scriptタグの定義(意味としくみ)

標準の使い方は<script src="app.js" defer></script>などで外部スクリプトを読み込みます。deferはHTML解析と並行で取得し、DOM構築後に順序を保って実行します。asyncは取得完了次第に実行し、順序は保証されません。type="module"はES Modulesを有効化し、デフォルトで遅延実行かつスコープがモジュールに限定されます。

実務での論点(配置・使い分け・落とし穴)

依存のない計測などはasync、DOM依存や複数間の順序が必要ならdeferが適します。モジュール化できる箇所はtype="module"で分割し、旧環境にはnomoduleを併記します。CSP運用ではインラインを避け、nonceまたはhashを使用します。重要なCDN資産はintegritycrossoriginで改ざん検知を加えます。判断に迷う場面では defer/asyncの使い分け を最優先で整理します。

  • 基本は外部化+defer、計測系のみasyncを検討
  • モジュールはtype="module"+旧環境へnomodule併用
  • 依存順序があるライブラリはdeferで順序保証
  • インラインは極力避け、CSPのnoncehashで管理
  • CDNはintegritycrossoriginでSRIを有効化

比較・使い分け表

scriptの読み込み方式と挙動
方式意味用途
通常(属性なし)取得・実行でパースを停止基本的に非推奨。小規模デモ等のみ
async並行取得・到着次第に即実行(順序不定)解析に非依存な計測・広告タグ
defer並行取得・DOM完成後に順序通り実行DOM依存スクリプト、複数ライブラリ
type=”module”ESMとして遅延実行・厳格スコープモジュール化・ツリーシェイク前提の開発
inlineHTML内に直接記述(CSPで制約)最小限のブートコードのみ検討

運用上の注意(SEO・パフォーマンス・安全性)

script自体は直接の順位要因ではありませんが、ブロックによりLCPやINPが悪化します。非同期化とコード分割で遅延を抑え、実行は必要ページだけに限定します。CSPで第三者スクリプトを制御し、SRIで改ざんを検知します。モジュール化ではポリフィルの配布範囲を最小にし、type=”module”戦略 を計画的に導入します。

よくある質問(FAQ)

asyncとdeferはどちらを選ぶべきですか?

順序やDOM依存があるならdefer、単独で動く計測系などはasyncが適します。迷ったらまずdeferを基準に設計します。

type=”module”への移行メリットは?

依存を明示でき、ツリーシェイクや遅延読み込みが容易になります。スコープ汚染も避けられ、パフォーマンス最適化と保守性が向上します。

SRI(integrity)は必須ですか?

CDN等の第三者提供スクリプトには推奨です。改ざん検知ができ、セキュリティ品質を底上げできます。自社ホストでも重要資産は検討します。

フッター直前に置けばdeferは不要ですか?

配置だけではネットワークの同時取得ができません。並行取得と順序保証を両立するため、基本はdeferを付ける方が安定します。

scriptタグのまとめ

scriptタグは「どこで・どう読み込み・いつ実行するか」で体験が大きく変わります。外部化を基本にdefer/asyncを適切に選び、type="module"とSRI/CSPで安全かつ高速に運用します。依存関係と実行順を整理し、計測で継続的に最適化しましょう。