Frontend Weekly 2024-03-07
Safari 17.4
2024 年 3 月 5 日に Safari 17.4 がリリースされました。
WebKit Features in Safari 17.4
Block layout with align-content
ブロックレイアウト及びテーブルレイアウトにも align-content を適用できるようになりました。この機能は Chrome 123 でもサポート予定です。
これにより Grid や Flexbox にしなくても良いケースが発生します。align-content: unsafe end; overflow: auto
のパターンなどは、例えばチャットの表示などに使えるかもしれません。
Promise.withResolvers()
Promise.withResolver()がほとんどの環境で利用できるようになりました。
Promise.withResolvers() - JavaScript | MDN
これは次の実装と等価です。
function withResolvers() { let resolve, reject; const promise = new Promise((res, rej) => { resolve = res; reject = rej; }); return { resolve, reject, promise };}
これを使うと、例えば次のようにイベントリスナーの Promise 化が出来ます。この手法は、matsuri-ui の useConfirm でも使われています。
const confirm = () => { confirmDialog.showModal(); const { promise, resolve, reject } = Promise.withResolvers(); confirmDialog.addEventListener("cancel", () => { reject(false); }); confirmDialog.addEventListerner("close", () => { resolve(true); }); return promise;};
const ok = await confirm();
transition-behavior
CSS プロパティの transition-behavior もほとんどの環境で利用できるようになりました。transition-behavior: allow-discrete;
を指定すると、離散プロパティ(display や box-shadowなど)に遷移を適用できます。
@scope
セレクタの適用範囲を指定できる@scope がほとんどの環境で利用できるようになりました。
Switch control
WHATWG で提案されている input[type="checkbox"]
要素の switch
属性が Safari で先行サポートされました。これは role="switch"
及び関連する aria 属性にマッピングされます。現状、利用できる環境はほとんどありません。
また下位互換性の問題はありますが、switch 要素が OpenUI で議論されている他 WHATWG でも触れられています。
Vertical form controls
フォーム関連要素の向きをコントロールできるようになりました。これは既に Chrome や Edge などでも部分的にサポートされています。
あまり使うことはないと思いますが、記憶の隅に置いておくと有効活用できることがあるかもしれません。
TypeScript 5.4
2024 年 3 月 6 日に TypeScript 5.4 がリリースされました。型の改善などが行われた他、NoInfer
Utility Type、Object.groupBy
とMap.groupBy
が追加、Import Attributes を global のImportAttributes
タイプでチェック出来るようになりました。
Announcing TypeScript 5.4 - TypeScript
NoInfer
NoInfer 型が追加された。これを使えば、意図しない型推論を制限することが出来る。
特定の配列にある値が含まれているかを確認する関数を考える。
function hoge<C extends string>(array: C[], value: string) {}
これを型レベルで確認できるようにしたい。
function hoge<C extends string>(array: C[], value: C) {}
これは型で確認できない。
hoge(["image", "video"], "audio");
// 次のような推論が行われてしまう。type C = (typeof array)[number] | typeof value;
このような場合、今までは次のようにする必要があった。
function hoge<C extends string, D extends C>(array: C[], value: D) {}
hoge(["image", "video"], "audio");// Argument of type '"audio"' is not assignable to parameter of type '"image" | "video"'
NoInfer を利用すれば、次のように記述できる。
function hoge<C extends string>(array: C[], value: NoInfer<C>) {}
NoInfer は次のようにも書ける。
export type NoInfer<T> = T & { [K in keyof T]: T[K] };
Pollyfill.io の売却
ブラウザーの互換性を解決するためのサービス Pollyfill.io が、中国の Funnull 社に売却されました。現代のサービスで Pollyfill.io が必要になることはほぼないと思いますが、今でも少なくないサービスで利用されています。
[注意喚起]ブラウザ互換ライブラリ「Polyfill.io」がドメイン名ごと中国企業に売却、Cloudflare と Fastly が代替となる配信を開始
Cloudflare と Fastly がそれぞれ自社の CDN でフォークした Polyfill.io の配信を発表しました。
https://cdnjs.cloudflare.com/polyfill/
Others
Support for Remix with Vite
Support for Remix with Vite – Vercel
ESLint v8.57 - support cjs/mjs
ESLint v8.57.0 released - ESLint - Pluggable JavaScript Linter
Apple が EU での PWA のホームスクリーン追加機能の削除を撤回。ただし、 Safari 以外のブラウザで追加した PWA もホームスクリーンから起動する場合は Safari 上で実行される
Apple says iOS 17.4 won’t remove Home Screen web apps in the EU after all
Figma は、デザイナーとエンジニアが互いに近づくことでパワーを発揮する。
Dev Mode 活用の前に開発者が知っておきたい Figma のこと 10 個+α | Hiroki Tani
【徹底比較】Vue.js と React でレンダリングされる値、されない値
デザインは直線的ではない
90% of designers are unhirable?
iframe を使って安全にブラウザ拡張機能を実装する - mizdra
VS Code 内で React アプリをプロファイルしてパフォーマンスのボトルネックを探しだすアプリ。以前にも少し話題になった気がする。
Million Lint is in public beta
RSA を JS で実装する