Frontend Weekly 2024-05-17
Google I/O 2024
5 月 15 日に Google I/O 2024 が開催されました。Web 関連は次のリンク先で確認できます。
React Conf 2024
React Conf 2024 が 5 月 15 日から 16 日に掛けて開催されました。アーカイブを YouTube で確認することが出来ます。
Day 1
Day 2
React Compiler
React Compiler が OSS として公開されました。Babel plugin として現状提供されており、IR/SSR への変換などは Rust で実装されています。
react/compiler at 149b917c8a4022aeaa170c4fb826107dd2333c68 · facebook/react
どのような変換が行われるかは React Compiler Playground で試すことが出来ます。
合わせて React Compiler のドキュメントも公開されました。
次のような状況のようです。
- フィードバックを受けるために OSS 化された、まだ実験的な機能。
- Vite と Webpack つまり Remix や Next.js でも動く。
- Babel プラグインで提供されているので、Babel を使うように設定すれば使えるのは当たり前ではある。
- Next.js は、既に option での提供を準備しているようです。
- Babel で提供されたことに対してネガティヴな意見が見られるが、コアは Rust で分けて実装されているため、他の手段での提供も十分に考えられる。
react-compiler-healthcheck
やeslint-plugin-react-compiler
を利用することで、正常にコンポーネントやライブラリを最適化できるかを確認できる。- React のルールに従っている、
で問題なく動作することが条件のようです。
- React のルールに従っている、
- 段階的に利用するために、ディレクトリ毎や、オプトインモード(アノテーションモード)によるコンポーネント・フック毎の React Compiler の導入もできる。
compilationMode: "annotation"
オプションを渡すことで、use client
のようにuse memo
を付けたコンポーネントやフックのみに適用できる。ただし、これは早期採用者を支援するための機能とのこと。
Merging Remix and React Router
新しい Remix は React Router v7 としてリリースする予定のようです。
Remix は以前から React Router のフレームワークのようなものでしたが、Vite プラグイン対応や SPA モードにより、Remix と React Router の差分がほぼなくなったことが理由として言及されています。
実際、Remix の機能のほとんどは React Router で既に利用できます。インポート元を@remix-run/*
からreact-router
に切り替えるだけで利用できるようにする予定とのことです。この変更によって React Router から Remix への段階的な移行がよりしやすくなると思われます。
WebKit Features in Safari 17.5
5 月 13 日に Safari 17.5 がリリースされました。
WebKit Features in Safari 17.5
text-wrap: balance
text-wrap: balance がサポートされました。このプロパティを指定すると、各行が均等な長さになるように改行されるようになります。
Safari のサポートによって、ほとんどの環境で利用できるようになりました。
light-dark()
ライトモードとダークモードの色を指定できる light-dark()関数が追加されました。これも Safari のサポートにより、ほとんどの環境で利用できるようになりました。
color-scheme: light dark;color: light-dark(black, white);
@starting-style
@starting-style は、トランジションさせる要素の初期状態を指定できるアットルールです。これもほとんとの環境で利用できるようになりました。
[popover]:popover-open { opacity: 1; transform: scaleX(1);
@starting-style { opacity: 0; transform: scaleX(0); }}
Chrome 125
Chrome 125 がリリースされました。
New in Chrome 125 | Blog | Chrome for Developers
CSS Anchor Positioning
CSS Anchor Positioning は、CSS のみで指定された要素を基準に要素を配置する機能です。Chrome や Edge でしか現状利用できません。
Introducing the CSS anchor positioning API | Blog | Chrome for Developers
これは複数の新しいプロパティや値を含んでおり、色々なことが出来ます。以下に主なパターンを書き出しました。詳しくは記事を見てください。
.anchor { anchor-name: --anchor-el;}/* インセット領域を利用した配置 */.anchored-notice-1 { position: absolute; /* Anchor reference */ position-anchor: --anchor-el; /* Position bottom of anchored elem at top center of anchor */ /* top, left, right, bottom, inline-(start|end), block-(start|end) */ inset-area: top;}/* 絶対配置を利用した配置 */.anchord-notice-2 { position: absolute; /* Anchor reference */ position-anchor: --anchor-el; /* Position bottom of positioned elem at top of anchor */ bottom: anchor(top); right: anchor(right); /* Center justification to the anchor */ justify-self: anchor-center;}.anchord-notice-3 { position: absolute; position-anchor: --anchor-el; inset-area: right span-bottom; /* * 配置位置をアンカーの位置に応じて変更する。 */ position-try-options: --bottom;}/* alternate position */@position-try --bottom { inset-area: bottom;}.anchord-notice-4 { position: absolute; position-anchor: --anchor-el; inset-area: top; /* 自動的に反転させる flip-blockとflip-inlineの組み合わせ*/ position-try-options: flip-block;}.anchord-notice-5 { position: fixed; position-anchor: --anchor-el; /* アンカーが表示されている間、配置された要素を表示し続ける */ position-visibility: anchors-visible; bottom: anchor(top);}
DEMO:
Compute Pressure API
Compute Pressure API がサポートされました。現状 Chrome ぐらいでしか利用できません。
Compute Pressure API | Web Platform | Chrome for Developers
Compute Pressure API は、大きな負荷の変化を検出できます。これによりビデオ会議 Web アプリなどのリアルタイム アプリケーションで、負荷が高まった際に画質を落とすなどの対応ができます。
function callback(records) { const lastRecord = records[records.length - 1]; console.log(`Current pressure ${lastRecord.state}`); if (lastRecord.state === "critical") { // disable video feeds } else if (lastRecord.state === "serious") { // disable video filter effects } else { // enable all video feeds and filter effects }}
const observer = new PressureObserver(callback);await observer.observe("cpu", { sampleInterval: 1000, // 1000ms});
Storage Access API (SAA) extended to non-cookie storage
Storage Access API はクロスサイト Cookie の代替として導入された API です。iframe などを通して別のサイトに埋め込まれたコンテンツに対してサードパーティー Cookie へのアクセスを提供していました。Chrome 125 から indexedDB や localStorage など Cookie 以外のストレージにもアクセスできるようになりました。
CSS round(), mod(), rem()
round()は指定に応じて、四捨五入や切り捨て・切り上げを行います。Chrome のサポートにより、ほとんどの環境で利用できるようになりました。
https://developer.mozilla.org/en-US/docs/Web/CSS/round
mod()、rem()は名前の通りです。
/* Math.round相当。デフォルトはnearest */width: round(var(--width), 50px);/* Math.ceil相当 */width: round(up, 101px, var(--interval));/* Math.floor相当 */width: round(down, var(--height), var(--interval));/* Math.tranc相当 */margin: round(to-zero, -105px, 10px);margin: mod(29vmin, 6vmin); /* 5vmin */rotate: mod(135deg, -90deg); /* -45deg */line-height: rem(21, 2); /* 1 */rotate: rem(140deg, -90deg); /* 50deg */
Others
折りたたみデバイス向けの Device Posture API と Viewport Segments API のオリジントライアルが開始
Origin trial for Foldable APIs | Blog | Chrome for Developers
Console Insights in Chrome DevTools
Google I/O 2024 にて、Chrome DevTools にエラーを Gemini に聞ける機能を搭載することが発表されました。既に米国では実験的機能として提供されているようです。
Chrome 125 DevTools でも紹介されています。
What’s new in DevTools, Chrome 125 | Blog | Chrome for Developers
Playwright v1.44.0
Playwright v1.44.0 がリリースされました。
https://github.com/microsoft/playwright/releases/tag/v1.44.0
- アクセシビリティ用の Assertion の追加
- toHaveAccessibleName()、toHaveAccessibleDescription()、toHaveRole()
- 前回の実行で失敗したテストのみを実行する
--last-failed
フラグの追加
など
Using Playwright to Monitor Third-Party Resources That Could Impact User Experience
Playwight の Request block と Delay 機能を使ってユーザーに影響があるサードパーティスクリプトを特定する方法について解説する記事
Monitor Third-Party Resources that Impact UX with Playwright
MSW v2.3.0
5 月 8 日に MSW v2.3.0 がリリースされました。マイナーアップデートですが、未処理の例外の扱い方が破壊的に変更されています。
https://github.com/mswjs/msw/releases/tag/v2.3.0
MSW v2.3.0 からリクエストハンドラーの未処理のエラーはネットワーク エラーとしてではなく、サーバーエラーとして扱われるようになりました。以前は、ドキュメントでハンドラ内でのエラーのスローが推奨されていたようですが、これは今後非推奨です。
Astro 4.9
5 月 9 日に Astro 4.9 がリリースされました。実験的な機能ですが、サーバサイドでコードを実行する Astro Actions とリクエストのリライト機能が追加されました。
TSKaigi 2024
5 月 11 日に TSKaigi 2024 が開催されました。
Using the Page Visibility API
ページの可視性、タブの切り替えなどでページが見えなくなったことを検知できる Page Visibility API の MDN による解説記事。
Deno による JSDoc によるドキュメント勧め
JSR では、JSDoc を元にドキュメントを生成する。
How to document your JavaScript package
特に Storybook のページで説明されているイメージはないが、Storybook も JSDoc をドキュメントとして扱ってくれる。
Misconceptions about CSS Specificity
CSS の詳細度に関する誤解の解説。スコアは合算じゃない、スタイル属性に指定しても詳細度は変わらない、 !important
も詳細度に影響しない
- 詳細度は合計ではない
- スタイル属性に指定しても詳細度は変わらない(昔は変わったらしい)
- !important も詳細度に影響しない
Node.js の進化に伴い不要となったパッケージ
Node.js の進化に伴い不要となったかもしれないパッケージたち
- node-fetch: 組み込み Fetch API の追加
dotenv
:node --env-file==.env
- Chalk:
util.styleText
API の追加 - Mocha など:
node:test
組み込みテストランナーの追加 - Nodemon:
-watch
フラグの追加 glob
:fs.glob API の追加。v22 から- Yargs など:
util.parseArgs
API の追加
ブラウザのリファラーをどう設定するべきか
現在はデフォルトの設定で安全という主張がされている。