Cybozu Frontend Monthly #35
イベント概要
サイボウズフロントエンドマンスリー は、サイボウズ社内で行っているフロントエンド情報共有会「フロントエンドウィークリー」の公開版です。
その月に気になったフロントエンドの情報を、サイボウズのフロントエンドエキスパートチームのメンバーが共有していきます。
このイベントのハッシュタグは #サイボウズフロントエンドマンスリー です。
※フロントエンドウィークリーとは
毎週火曜の 17:00 〜 18:00
で社内向けに行っているフロントエンドの気になる記事を紹介する会です。2016年3月15日から行われています。
ハッシュタグ
#サイボウズフロントエンドウィークリー
で実況しています。
zennのpublicationにてウィークリーのまとめも投稿していますので、ぜひこちらもご覧ください。 https://zenn.dev/p/cybozu_frontend
開催日
2023年05月30日
イベントページ
https://cybozu.connpass.com/event/283319/
配信URL
https://www.youtube.com/watch?v=1y6cAVTiuh8
メンバー
コンテンツ
👀 Notable Articles
Announcing TypeScript 5.1 RC
- 共有者: sajikix
TypeScript 5.1 の RC が出たので主要なアップデートを紹介します。
Easier Implicit Returns for undefined-Returning Functions
return
文のない関数の返り値の型として undefined
が許容されるようになりました。
- TS5.0 までは return のない関数 は
() => void
か() => any
のどちらかという扱いでした。
Unrelated Types for Getters and Setters
「get の返り値の型」 が 「set の引数の型」 の subtype でなくてはならなという制約がなくなりました。
- TS5.0 までは
set value(v: string | number)
だったらget
はstring
,number
,string | number
のどれかを返す必要があリました。
Decoupled Type-Checking Between JSX Elements and JSX Tag Types
JSX の要素として許容可能な型をカスタマイズできるようになりました。
背景
TS5.0 まではコンポーネントが JSX.Element よりも広い型や異なる型を返したり render したりすると型エラーになります。 例として React は ServerComponents に関連して promise の first class support を提案していますが Promise は現在 JSX.Element の型に含まれません。
TS5.0 までの挙動
TS5.0 まででは JSX 要素をチェックする時に JSX 名前空間の Element 型を利用していました。具体的には JSX 要素がタグ名として有効かどうかをチェックするために、その要素が宣言されているところを参照し返す型や構築する型を取得して、JSX.Element(or JSX.ElementClass)と互換性があるかどうかをチェックしていました。
変更後
TS5.1 からは、JSX.ElementType という型をチェックに利用するように変更され、JSX.ElementType がない場合に JSX.Element 型を利用するようになります。この変更により、ライブラリ側で JSX.ElementType を拡張すれば、既存の JSX.Element 型を変更したり、無視したりすることなく、JSX 要素として許容する型を拡張できます。
これらの変更以外にも typeRoots
周りの挙動変更や、パフォーマンス改善、vscode 上での補完がより便利になるなどのアップデートが入っています。
Cache the World: Turbo Charging Firefox Accessibility Performance and Maintainability
- 共有者: b4h0-c4t
Firefox 113 で刷新されたアクセシビリティエンジンについて、刷新の経緯を解説した記事です。
Web ブラウザの進化とともに、次第にアクセシビリティエンジンが低速化していき問題となっていました。 アクセビリティエンジンが低速になってしまった大きな要因として、ブラウザがセキュリティに対して厳格になり、サンドボックス化や特権の制限によって支援技術がアクセシビリティツリー等のプロセスに関与することができなくなったためと言われています。
当初、Firefox の既存アクセビリティエンジンでは COM 通信等の OS 固有である技術を利用して高速化を図っていましたが、複雑化によって次第にメンテナンスコストが大きくなっていきました。 再検討の末、アクセシビリティエンジンを刷新するプロジェクト「Cache the World」が発足しました。
新しいアクセシビリティエンジンでは、メイン UI プロセスがアクセシビリティツリーのキャッシュを保持します。 そして、その他のプロセスはそのキャッシュに対して非同期でプッシュを実施する、という手法を導入しました。 これにより、OS ごとに実施していた細かな最適化処理を共通化しています。
また、キャッシュの再設計に加えて、いくつかの作業も実施したようです。
- キャッシュの有無に関わらず統一して利用できるアクセシビリティツリーの構築
- コアなアクセビリティコードから Windows 固有のコードを分離
- テキストへのアクセスをテキストコンテナ単位から TextLeafRange と呼ばれるテキスト範囲に対する取り扱いに変更
- Android のアクセシビリティコードの大幅な再設計
- 画面座標とヒットテストのキャッシュ手法の刷新
Chrome のアクセシビリティエンジンとの違い
- キャッシュの状態管理
- Chrome: キャッシュシリアライザーがノードの更新を管理しており、ノードの変更通知を受け取るとノード全体の再シリアライズが走る
- Firefox: ノードの追加・削除によって Show・Hide イベントが発火し、イベントがトリガーされると Show・Hide の正しさによって再キャッシュされます
- 単語の境界情報のキャッシュ
- Chrome: している、キャッシュから単語情報を引き出すことができる
- Firefox: していない、必要な時のみ計算をすることでメモリの節約とキャッシュの複雑さを軽減している
- ヒットテストの実装
- Chrome: ツリー内にキャッシュされている座標から結果を予測し、その後非同期でキャッシュを実施する
- Firefox: ビューポートの情報もキャッシュしており、初回のヒットテストの精度向上を期待している
Announcing Deno KV
- 共有者: nus3
Deno v1.33 のリリースの一つとして Deno KV の beta が発表されました。
Deno KV は Deno にビルトインされているので、依存関係を追加せずにすぐに利用できます。例えば、次のように Deno KV にデータを保存する処理を実装すると
const kv = await Deno.openKv()
const key = ["users", crypto.randomUUID()]
const value = { name: "Alice", created: new Date() }
await kv.set(key, value)
const result = await kv.get(key)
console.log(result.value)
ローカル環境では SQLite にデータが保存され、Deno Deploy にデプロイすると、Deno KV データベースは、FoundationDBを使って Deno 社によって管理されます。
トランザクションを含むデータベースの操作もシンプルに実装できそうでしたし、現在はまだベータ版ですが、Deno Deploy + Deno KV を使うことで、Edge からアクセスできるデータベース込みのアプリケーションを簡単に構築できて良さそうですね。
🗓 Monthly Articles
📖 Framework, Library
- Qwik Reaches v1.0
- Qwik の stable 版である v1 がリリース
- Million.js
- React コンポーネントを比較的簡単に高速化できる仮想 DOM ライブラリ
- 詳しい仕組みはVirtual DOM: Back in Blockで解説されている
- yoavbls/pretty-ts-errors
- TypeScript のエラーを読みやすくしてくれる VSCode 拡張
- Introducing storage on Vercel
- Vercel が Vercel KV、Vercel Postgres、Vercel Blob を提供
- Next.js 13.4
- React Server Component 等が Stable として導入された他、alpha リリースとして Server Actions が追加
- React Canaries: Enabling Incremental Feature Rollout Outside Meta
- React は今後、Canary リリースを実施
- Announcing Vite 4.3
- Vite 4.3 がリリースされました。パフォーマンスが大きく改善された
- パフォーマンス改善のためにやったことは How we made Vite 4.3 faaaaster 🚀で解説
- Preparing for v2
- Remix の v2 リリースに関するドキュメント
- Shipping the biggest update for the components.
- Radix と Tailwind CSS で作られたコンポーネントスニペット集である shadcn/ui のアップデートがあり、Skelton や Calender などの新しいコンポーネントが追加
💬 Languages
- Deno 1.33: Deno 2 is coming
- Deno KV がビルトインされるなど Deno 1.33 がリリース
- Node v20.1.0 Release
- Node.js v20.1.0 がリリース
- fs option に recursive が追加されるなど
🖥 Browsers
- Multiple stylesheets per file
@sheet
という記法を使って、CSS ファイル内に複数の stylesheet を定義する提案
- It’s time to learn oklch color
- CSS で色を指定できる関数の 1 つである oklch() の紹介記事
- 従来の hsl() と比較して、oklch() では人が感じる色の明るさや鮮やかさを考慮した色が生成されるよう
- SpiderMonkey Newsletter (Firefox 112-113)
- Firefox 112 - 113 の Nightly リリースで行われた SpiderMonkey における JavaScript と WebAssembly に関する作業の紹介記事
- React のような最近の Web Framework のパフォーマンスを改善するような最適化を行っている
🦆 Others
- A Gentle Introduction to Islands
- Islands Architecture について Deno の Fresh を例に 解説
- “What’s next for Deno?” by Ryan Dahl (NodeCongress ‘23)
- Ryan Dahl さんによる Deno の今後についての発表
- Node.js 互換の機能、Deno KV、Deno Deploy などを live coding を交えて紹介