HTML の進化:9つのネイティブ API で JS ライブラリを置き換える

ポップオーバー API:JS なしでトップレイヤーのポップアップ

シナリオ:モニタリングダッシュボードで、親要素のoverflow: hiddenに遮られない浮動ウィンドウを表示する必要がある場合。

<button popovertarget="info-panel">詳細表示</button>
<div id="info-panel" popover>
  <h4>リアルタイムメトリクス</h4>
  <p>CPU 使用率: 85%</p>
</div>

ダイアログ API:制御されたモーダルダイアログ

シナリオ:アラーム発生時に、ユーザの明確な確認が必要なモーダルダイアログを表示。

<dialog id="confirmation-modal">
  <form method="dialog">
    <p>アラームを閉じますか?</p>
    <button value="cancel">キャンセル</button>
    <button value="confirm">確認</button>
  </form>
</dialog>

<script>
  const modal = document.getElementById('confirmation-modal');
  modal.showModal();
  modal.addEventListener('close', (event) => {
    console.log('選択結果:', modal.returnValue);
  });
</script>

Speculation Rules API:ページ遷移を瞬時に実現

シナリオ:ダッシュボードのリンク先の分析ページへのアクセスが80%の確率で予測される場合。

<script type="speculationrules">
{
  "prerender": [{
    "source": "list",
    "urls": ["/dashboard/performance"],
    "score": 0.9
  }]
}
</script>

View Transitions API:UIの滑らかな遷移

シナリオ:リストビューから詳細ビューへの切り替え時に、カードがスムーズにアニメーションするようにする。

function changeView() {
  if (!document.startViewTransition) {
    updateLayout();
    return;
  }
  document.startViewTransition(() => {
    updateLayout();
  });
}

.metric-element {
  view-transition-name: card-transition;
}

WebAssembly と JS のゼロコピー通信

シナリオ:大量のデータポイントのトレンドをリアルタイムで計算する必要がある場合。

import init, { processMetrics } from './data_processing.wasm';

async function execute() {
  await init();
  const sharedBuffer = new SharedArrayBuffer(1024);
  const dataView = new Float64Array(sharedBuffer);
  const result = processMetrics(dataView);
}

WebTransport API:HTTP/3 時代のリアルタイム通信

シナリオ:数万台のデバイスから毫秒単位でデータを送信する場合、WebSocket の Head-of-Line Blocking 問題を回避。

const transport = new WebTransport('https://metrics.example.com:443');
await transport.ready;

const writer = transport.datagrams.writable.getWriter();
const data = new TextEncoder().encode(JSON.stringify({ cpu: 85 }));
await writer.write(data);

Intersection Observer API (V2):正確な可視性検出

シナリオ:広告の不正検知や高性能な長リストレンダリング。

const observer = new IntersectionObserver(entries => {
  entries.forEach(entry => {
    if (entry.isIntersecting && entry.isVisible) {
      recordVisibility('element-real-view');
    }
  });
}, {
  trackVisibility: true,
  delay: 50
});

observer.observe(document.getElementById('target-element'));

Compression Streams API:ブラウザネイティブの圧縮

シナリオ:数MBのエラーログを送信前に圧縮。

async function compressAndSend(data) {
  const stream = new Blob([JSON.stringify(data)]).stream();
  const compressed = stream.pipeThrough(new CompressionStream('gzip'));
  const blob = await new Response(compressed).blob();
  navigator.sendBeacon('/logs', blob);
}

File System Access API:Web アプリをローカルツール化

シナリオ:GB単位のローカルログファイルを直接読み書きする分析ツール。

async function editLocalFile() {
  const [handle] = await window.showOpenFilePicker();
  const file = await handle.getFile();
  const writable = await handle.createWritable();
  await writable.write('新規ログエントリ');
  await writable.close();
}

タグ: webtransport WebAssembly IntersectionObserver filesystemaccess compressionstreams

8月5日 08:27 投稿