Cybozu Frontend Monthly #51
イベント概要
サイボウズフロントエンドマンスリー は、サイボウズ社内で行っているフロントエンド情報共有会「フロントエンドウィークリー」の公開版です。
その月に気になったフロントエンドの情報を、サイボウズのフロントエンドエキスパートチームのメンバーが共有していきます。
このイベントのハッシュタグは #サイボウズフロントエンドマンスリー です。
※フロントエンドウィークリーとは
毎週火曜の 17:00 〜 18:00
で社内向けに行っているフロントエンドの気になる記事を紹介する会です。2016年3月15日から行われています。
ハッシュタグ
#サイボウズフロントエンドウィークリー
で実況しています。
zennのpublicationにてウィークリーのまとめも投稿していますので、ぜひこちらもご覧ください。 https://zenn.dev/p/cybozu_frontend
開催日
2024年10月29日
イベントページ
https://cybozu.connpass.com/event/333156/
配信URL
https://www.youtube.com/watch?v=w4SNE4RiZ1c
メンバー
コンテンツ
👀 Notable Articles
Svelte 5 is alive
- 共有者: @b4h0_c4t
Svelte 5 がリリースされました。
今回のアップデートでは rune のサポートによって基礎的な記法が大幅に変更されています。
例えば、count
というリアクティブオブジェクトを作成する場合、Svelte4 以前だと
let count = 0
となりますが、Svelte 5 では
let count = $state(0);
となります。
また、slot でのコンポーネント結合が非推奨となり、snnipets による合成がサポートされました。
基本的な children の受け渡しについて、Svelte 4 以前は <slot />
をコンポーネントに差し込み、親コンポーネントが slot を受け取る仕組みでしたが、Svelte 5 では $props
から children を取得してレンダーするようになりました
<script>
let { children } = $props();
</script>
{@render children?.()}
Svelte コンポーネントが Class ではなくなっているため、今後コンポーネントを呼び出す際は mount
や hydrate
といった新たな API を呼び出す必要があります。
詳細な Svelte 4 以前との比較は Svelte 5 migration guide 参照。
First-class Vitest integration
- 共有者: @nus3_
Storybook の 8.3 で Vitest の integration がファーストクラスでサポートされました。
今まで Story を実際にブラウザ上でテストするには Chromatic か Storybook が提供するテストランナーを使うという選択肢しかありませんでしたが、今回のリリースで Vitest のブラウザモード使うことができるようになります。
ドキュメントを見ると、experimental ではありますが、Storybook が提供する Vitest 用のプラグインを setup ファイルや Vitest の config で読み込むことで、Vitest 側で Story 上のテストを実行できるようになります。
Vite を採用するプロダクトであれば、今回のリリースで、ブラウザ上でコンポーネントテストする際の選択肢が増えるのでとても良いですね。
New Values and Functions in CSS
- 共有者: @mugi_uno
2024 年 9 月に W3C より 公開された CSS Values and Units Module Level 5 の Working Draft の内容について、新たに追加された機能についてピックアップして紹介している記事です。従来の CSS では複雑な記述が必要だったものが簡潔に表現できたり、不可能だったことが可能になっていたりと、注目したい機能が多く含まれています。
中でも自分が特に気になったものを幾つか紹介します。
calc-size()
従来でも calc()
を使うことで計算結果を元にしたサイズを利用できましたが、Intrinsic Size(内在サイズ)を元にした計算は不可能でした。具体的には、auto
・min-content
・max-content
・fit-content
などです。
一方、calc-size()
では、Intrinsic Size を元にした計算ができます。代表的な利用例としては、アコーディオンメニューの開閉アニメーションで、開閉後の高さを auto
のままアニメーション可能になったりします。
random()
random-item()
random()
は指定した範囲内からランダムな値を返します。たとえば random(100px, 300px, by 50px)
とした場合、100px・150px・200px・250px・300px のうちいずれかを返します。一方、random-item()
はリスト内からランダムでピックアップします。 random-item(100px, 200px, 500px)
は、100px・200px・500px のいずれかを返します。従来 CSS 単体で乱数を扱うことはできなかったため、可能性が広がる機能ですね。
sibling-count()
/ sibling-index()
sibling-count()
は兄弟要素の数を返し、sibling-index()
は兄弟要素のうち自身のインデックスを返します。たとえば、grid レイアウトにおいて兄弟要素数に応じて columns の数を分割したいケースや、兄弟要素の中で自分が何番目に位置するかによってスタイルを変えたいケースなどで活用できます。
TC39 Advances 10+ ECMAScript Proposals: Key Features to Watch
- 共有者: @sajikix
2024 年 10 月の 8~9 で開催された TC39 の 104th meeting で 10 個以上の Proposal に Stage の Update があり、うち5つは Stage4 になりました。Stage4 になったものは来年の ES2025 として標準化され、メジャーな JS ランタイムでは利用可能になる予定です。今回はそんな Stage4 になった Proposal について紹介します。
Iterator Helpers
Iterator Helpers は Iterator オブジェクトに対して Array と同じような .map()
, .filter()
といったヘルパーメソッドを実装する提案です。Iterator は大規模なデータや長さの確定していないデータを効率的に管理できるというメリットがありますが、変換・操作できるメソッドが存在しないため、うまく活用できていないケースや代わりに配列が利用されるケースが目立っていました。
Iterator Helpers が導入されることで、多少挙動が違うものの普段慣れ親しんた Array のメソッドと同じ感覚で Iterator オブジェクトを利用できるようになります。
Import Attributes と JSON Modules
Import Attributes は import 文の構文を拡張し、モジュール指定子とは別に情報を指定できるようにする Proposal です。主な用途として JS 以外のモジュールのサポートが想定されています。構文としては今までの import 文の後ろに with {[key]:[value]}
という形で情報を追加します。
import json from "./foo.json" with { type: "json" };
またこの Import Attributes から派生・分離した Proposal が JSON Modules です。JSON modules は JSON をモジュールとして読み込んだ時の挙動を統一するための Proposal で、ランタイムによらない JSON 読み込みの動作を定義しています。JSON Modules は Import Attributes を利用して読み込まれることを前提に作られています。
これら2つの Proposal が Stage4 になることで JSON の統一された読み込みがサポートされ、今ままで以上に JSON の利用が手軽かつ安全になりそうです。
Regular Expression Pattern Modifiers
JavaScript 以外の多くの言語では実装されている正規表現の Modifiers 機能を JavaScript でもサポートする Proposal です。Modifiers は正規表現にで指定可能なフラグを部分的に適用(または取消)することができる構文です。
具体的には (?[flag]:)
で部分的なフラグの有効化、 (?-[flag]:)
で部分的なフラグの無効化が可能です。以下の例では、全体に i
フラグがついているため基本的に大文字小文字は区別されませんが、2文字目は (?-i:...)
で i
フラグを無効化しているため大文字小文字を区別します。
const re1 = /^[a-z](?-i:[a-z])$/i // 1文字目は大文字小文字どちらても良いが2文字目は小文字だけ
Promise.try
Promise.try()
は Promise を返す関数かどうかに関わらず、ラップした関数の返り値を Promise にするメソッドです。Promise にするだけであれば Promise.resolve().then(f)
のように書けば良いのですが、この場合関数の実行は必ず次の tick になり同期的でなくなります。そこで処理自体は同期的に行いつつ、Promise と同じセマンティクスを得るための簡単な記法を提供するのがPromise.try()
です。これにより同期関数も非同期関数も最適化されながら同じセマンティクスで実行可能になります。
🗓 Monthly Articles
📖 Framework, Library
- Prisma 5.20.0 release
- Prisma 5.20.0 がリリースされました。
strictUndefinedChecks
が Preview 機能として追加された等の変更があります。
- Prisma 5.20.0 がリリースされました。
- Oxc Transformer Alpha | The JavaScript Oxidation Compiler
- Rust 製の TypeScript トランスパイラである OXC Transformer のアルファ版がリリースされました。
- New support eslint 9 by G-Rath · Pull Request #2996 · import-js/eslint-plugin-import
- eslint-plugin-import が v2.31.0 をリリースし、ESLint v9 をサポートしました。
- Storybook 8.3
- Storybook 8.3 がリリースされました。First-class Vitest integration の Experimental リリース等が含まれています。
- Announcing VoidZero - Next Generation Toolchain for JavaScript
- Evan You 氏 が資金調達をして、VoidZero Inc.(void(0))を立ち上げ、次世代 JS ツールチェーンを開発することが公表されました。
- Tauri 2.0 Stable Release
- Rust 製のデスクトップアプリ開発フレームワーク tauri の 2.0 が stable になりました。モバイルアプリケーションとしてのビルド機能の追加等が含まれています。
- ESLint now officially supports linting of JSON and Markdown
- ESLint が公式で JSON と Markdown をサポートしました。
⚡️ Services
- Builder Day 2024: 18 big updates to the Workers platform
- Cloudflare の「Builder Day 2024」で発表された 18 の主要なアップデートについて紹介したブログ記事です。
🖥 Browsers
- WebKit Features in Safari 18.0
- 先月リリースされた Safari 18.0 の新機能まとめです。
- The Web Vitals extension, now in DevTools
- Chrome129 から DevTools のパフォーマンスパネルにて利用可能になる Core Web Vitals 計測についての記事です。
📝 Specifications
- TPAC 2024 meeting
- 2024 年 9 月 23 日から 5 日間にわたって開催された W3C の年次イベントである W3C TPAC のアジェンダです。
- CSS Values and Units Module Level 5
- CSS Values and Units Module Level 5 の Working Draft リリースの紹介記事です。
- CSS Masonry & CSS Grid | CSS-Tricks
- Masonry レイアウトの標準化を図る 2 つのプロポーザルの紹介記事です。
- Prototype: CookieStore API
- CookieStore API が Intent to Prototype となり、Firefox でも実装が始まろうとしています。
- TC39 Advances 10+ ECMAScript Proposals: Key Features to Watch
- TC39 の 104th meeting で update があった ECMAScript の proposal についてまとめられた記事です。
🦆 Others
- 1.3 Million Subtests
- Rust 製ブラウザエンジン Servo の開発進捗について、Web Platform Test で 130 万以上のサブテストを通過したという記事です。
- Announcing BCD Watch
- MDN の Browser Compatibility Data(BCD)を収集した Web サイト BCD Watch が発表されました。
- OpenNext
- Next.js を Vercel 以外のさまざまなプラットフォームでホスティングできるようにするためのオープンソースの取り組みである OpenNext についての記事です。
- Removing Corepack - Speaker Deck
- Node.js Takes Steps Towards Removing Corepack - Socketをもとに、Corepack を Node.js の配布から削除する計画と、その経緯をまとめたスライドです
- End of life for Actions Node16 · GitHub Changelog
- 2024 年 10 月 15 日をもって、GitHub Actions の runner にて Node.js16 のサポートが終了します。
- Server Actions を Server Functions に命名変更
- React v19 より、Server Actions は Server Functions に名称変更されます。
- Typed Linting: The Most Powerful TypeScript Linting Ever
- typescript-eslint が、型情報を利用した lint の優位性や実際の使い方を改めて解説した記事です。
- Web の同意を考えようプロジェクト|さよなら、ダークパターン。
- 「Web の同意を考えようプロジェクト」の流れで、IIJ が主導して「非ダ―クパターン Web サイト(Non-Deceptive Design Accreditation)」制度を運用する一般社団法人ダークパターン対策協会が発足しました。
- Benchmarking the performance of CSS @property
- 最近 Baseline の Newly Available となった@property のベンチマークに関する記事です。
- Vite Conf
- 先日行われた Vite Conf の keynote が公開されました。
- フロントエンドの CI パイプラインを改善して、CI 処理時間と Billable Time を 50%を削減した話
- changed-files という github action 使って、変更があった特定のディレクトリのみテストを実施することで、かかる時間を削減した記事です。
- フロントエンドの標準仕様をとどう追っているか / How I follow the frontend standards specs
- web の標準仕様の情報をどのように追っているのか、それらを社内でどのように共有しているかがまとめられたスライドです。
- 新しい擬似クラス:has()、:is()、:where()を使いこなそう
- 近年利用可能になった新しい擬似クラス :has()、:is()、:where() について仕様や使い所、注意点などを解説した記事です。
- The Disappearance of an Internet Domain
.io
ドメインの今後について、これまでの国別トップレベルドメインの歴史について振り返りながら整理している記事です。