1226 文字
6 分

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 でもサポート予定です。

https://stackblitz.com/edit/js-6y3l4r?embed=1&file=index.html&hideExplorer=1&hideNavigation=1&view=preview

これにより 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など)に遷移を適用できます。

transition-behavior - CSS: Cascading Style Sheets | MDN

https://stackblitz.com/edit/js-nz9m9q?embed=1&file=index.html&hideDevTools=1&hideExplorer=1&hideNavigation=1&view=preview

@scope#

セレクタの適用範囲を指定できる@scope がほとんどの環境で利用できるようになりました。

@scope - CSS: カスケーディングスタイルシート | MDN

https://stackblitz.com/edit/js-3xj7db?embed=1&file=index.html&hideDevTools=1&hideExplorer=1&hideNavigation=1

Switch control#

WHATWG で提案されている input[type="checkbox"] 要素の switch 属性が Safari で先行サポートされました。これは role="switch" 及び関連する aria 属性にマッピングされます。現状、利用できる環境はほとんどありません。

https://stackblitz.com/edit/js-9dqi7k?embed=1&file=index.html&hideDevTools=1&hideExplorer=1&hideNavigation=1

また下位互換性の問題はありますが、switch 要素が OpenUI で議論されている他 WHATWG でも触れられています。

https://github.com/whatwg/html/issues/4180

Vertical form controls#

フォーム関連要素の向きをコントロールできるようになりました。これは既に Chrome や Edge などでも部分的にサポートされています。

https://stackblitz.com/edit/js-agjqjj?embed=1&file=index.html&hideExplorer=1&hideNavigation=1&view=preview

あまり使うことはないと思いますが、記憶の隅に置いておくと有効活用できることがあるかもしれません。

TypeScript 5.4#

2024 年 3 月 6 日に TypeScript 5.4 がリリースされました。型の改善などが行われた他、NoInfer Utility Type、Object.groupByMap.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/

https://polyfill-fastly.io/


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 で実装する

Implementing RSA from Scratch in JavaScript

DanGPT - Dan Abramov as an AI

Frontend Weekly 2024-03-07
https://blog.ohirunewani.com/series/frontend-weekly/2024-03-07/
作者
hrdtbs
公開日
2024-03-07
ライセンス
CC BY-NC-SA 4.0