Cybozu Frontend Monthly #29
イベント概要
サイボウズフロントエンドマンスリー は、サイボウズ社内で行っているフロントエンド情報共有会「フロントエンドウィークリー」の公開版です。
その月に気になったフロントエンドの情報を、サイボウズのフロントエンドエキスパートチームのメンバーが共有していきます。
このイベントのハッシュタグは #サイボウズフロントエンドマンスリー です。
※フロントエンドウィークリーとは
毎週火曜の 17:00 〜 18:00
で社内向けに行っているフロントエンドの気になる記事を紹介する会です。2016年3月15日から行われています。
ハッシュタグ
#サイボウズフロントエンドウィークリー
で実況しています。
zennのpublicationにてウィークリーのまとめも投稿していますので、ぜひこちらもご覧ください。 https://zenn.dev/p/cybozu_frontend
開催日
2022年11月26日
イベントページ
https://cybozu.connpass.com/event/265151/
メンバー
コンテンツ
今回は JSConf JP 2022 向けの特別版でお送りします
https://jsconf.jp/2022/
2022 年のフロントエンドトピックから、フロントエンドエキスパートチームのメンバーが特に気になったものを簡単にふりかえります。
Nuxt 3.0 stable が満を持してリリース!
- 共有者: @nakajmg
2020 年 9 月の Vue 3 のリリースから 2 年、ついに Nuxt 3.0 がリリースされました。
Composition API への対応や、Vite と Nitro による開発者体験の向上と TypeScript サポートの充実などが含まれています。
この Vue 3 のリリースから Nuxt 3.0 のリリースまでに、ほかフロントエンドフレームワークのリリースがいくつかありました。
- 2020/10 Next.js 10
- 2021/06 Next.js 11
- 2021/10 Next.js 12
- 2021/11 Remix v1
- 2022/08 Astro 1.0
- 2022/10 Next.js 13
後発のフレームワークは、ほかフレームワークで開発者から支持を得た思想や設計、ベストプラクティスなどをうまく取り込んでより洗練されていく印象があります。
現在のフロントエンドフレームワークはどれか一強というわけではなく、ユースケースによって使い分けるものだと考えています。Nuxt 3 がマッチするユースケースがあるのか、ほかフレームワークのポジションと競合していくのか、今後の動向が楽しみです。
Deno 2022 アップデートまとめ
- 共有者: @b4h0_c4t
Deno は 2022 年 1 月から 11 月までの間に v1.18 から v1.28 までの 10 バージョンがリリースされました 今回は 2022 年に公開された Deno Release Note の中でも個人的に気になったいくつかの要素について紹介していきます。
No type-checking by default (v1.22, v1.23)
実行時に型チェックを実施しない挙動がデフォルトになりました。 告知から導入までが結構早かった記憶がありますがどうだったでしょうか。
File watcher watches dynamic imports (v1.23)
ビルトインされているファイルウォッチャーが動的にインポートされたファイルも監視するようになりました。
Type checking and emitting performance improvements (v1.24)
--check
オプションが指定された際に TypeScript コンパイラを利用していたのをやめ、全てのエミットで swc が利用されるようになりました。
また、過去に型チェックを通過したコードに対して再度チェックをかけないようにするなどパフォーマンス面でのリファクタリングがいくつか実施されたようです。
Developer experience improvements (v1.26, v1.27)
開発環境上でのツールの使いやすさは非常に重要です。 Deno v1.26, v1.27 では、Language Server や IDE に関わる幾つかの機能追加が実施されました。
- deno.land
- Inlay Hints
- Registry completions
deno.land でのドキュメント検索機能が一新されて多くの情報にアクセスしやすくなりました。 対応エディタでのインレイヒントが追加され、これまでよりもエディタ上でコードの可動性が向上しました。 また、レジストリ補完がサポートされているエディタでの deno のサードパーティーモジュールの検索性が向上したようです。
npm 互換機能追加 (v1.25~v1.28)
v1.25 の Experimental npm support
からいくつかのリリースを経て v1.28 で正式に npm との互換機能がリリースされました。
この辺りの詳細については 14 時ごろに行われたCurrent state of Npm support in Denoセッションを見るとより深い理解が得られると思います。
2022 年 TypeScript ふりかえり
- 共有者: @sajikix
2022 年、TypeScript は 4 つのメジャーバージョン(4.6 ~ 4.9)がリリースされました。 内容も新しい記法の追加、型の推論の向上、パフォーマンス改善、エディタサポートなど多岐にわたります。 ここでは個人的に大きかった・面白いなと思うアップデートを振り返ります。
Control Flow Analysis for Destructured Discriminated Unions (4.6)
- 判別可能な Union 型を絞り込む前に分割代入をしても、同時に分割代入されたもの同士のセットで型が絞り込まれる。
type Action =
| { kind: "Age, payload: number }
| { kind: "Name", payload: string };
function processAction(action: Action) {
const { kind, payload } = action; // 絞り込む前に分割代入してる
if (kind === "Age") {
// ちゃんとnumberと解釈される
let num = payload * 2
// ...
}
else if (kind === "Name") {
// ちゃんとstringと解釈される
const str = payload.trim();
// ...
}
}
- 上の例だと、4.5 までは同時に型を絞り込むために
action.kind
、action.payload
のように書かないといけなかった。 - 同じ 4.6 で入った
Control Flow Analysis for Dependent Parameters
も同時に展開、分割代入された変数同士を一緒に絞り込む似た機能の一つ
ECMAScript Module Support(4.7)
- TypeScript に念願の ESM サポートが入った
- 以下のような機能が追加された
- package.jsom の type プロパティを見て挙動を変えるように
.mts
,.cts
,.d.mts
,.d.cts
などの拡張子もサポート- package.json の
exports
プロパティで ESM,CJS に応じて参照する型宣言ファイルを指定できる - 利用者側から明示的に ESM/CJS 用の型を参照する方法の提供(resolution-mode)
Improved Intersection Reduction, Union Compatibility, and Narrowing(4.8)
- 4.8 から
unknown
型の定義が厳密になった - 具体的には 4.8 から
unknown
型は{} | null | undefined
として解釈されるようになった - これにより以下のような挙動の変更が生まれる
NonNullable<T>
は「{}
との交差型をとる」ことと同値であると解釈されるようになるunknown
型であってもnull
やundefined
の可能性を排除すると{}
型に絞り込まれる
The satisfies Operator(4.9)
- 新しく
satisfies
operator が導入された。 A satisfies B
と書いた場合、以下のような挙動になる- A の型が B にマッチする : A と B より詳細な型の方に推論を寄せる
- A の型が B にマッチしない : 型エラーを投げる
- このような挙動から「安全な as」のような運用ができて便利
紹介しきれなかったけど面白かった、便利だなとおもったもの
- Instantiation Expressions (4.7) : 関数やコンストラクタに直接型引数を与えられる
- Optional Variance Annotations for Type Parameters (4.7) : 変性を
in
/out
で明示的に宣言できる - extends Constraints on infer Type Variables (4.7) : 任意の infer 型に制約をかけることができる
- Improved Inference for infer Types in Template String Types (4.8) : テンプレート文字列における infer の推論が賢くなる
- Indexed Access Inference Improvements (4.6) : MappedType 内において利用されるインデックスアクセス型の絞り込み
- Auto-Accessors in Classes (4.9) :
accessor
キーワードををつけると getter と setter を生やしてくれる構文
Cloudflare 2022 トピック ふりかえり
- 共有者: @mugi_uno
2022 年内、Cloudflare からの新サービス発表や JS ランタイム標準化などで多く動きがありました。 フロントエンドにおけるアーキテクチャ設計・開発に大きく影響を与える可能性があるものもあり、 代表的なものをいくつかピックアップしてふりかえります。
A Community Group for Web-interoperable JavaScript runtimes
https://blog.cloudflare.com/introducing-the-wintercg/
Vercel・Shopify・Node.js・Deno と連携し、JS ランタイムの API 標準化のためのコミュニティグループ(WinterCG)が設立されました。昨今の Edge Runtime 環境の増加により、各種環境間で JS API の互換性が保てなくなってきています。(記事内では、 fetch()
の差異について言及されています。)
最終的には、コードを書き直すことなく別の環境へ移植可能となる状態を目指しているようです。
A New Hope for Object Storage: R2 enters open beta
https://blog.cloudflare.com/r2-open-beta/ https://blog.cloudflare.com/r2-ga/
AWS S3 互換のストレージサービス。2022/5 に β 版が公開され、2022/9 に一般提供が開始されました。
@aws-sdk/client-s3
を利用し、そのままアクセスすることができます。帯域ではなく、利用ストレージと操作回数が課金対象になります。
Announcing D1: our first SQL database
https://blog.cloudflare.com/introducing-d1/
CDN Edge で動作する SQL データベース。実体は SQLite。 Cloudflare が持つネットワークを利用し、SQLite のリードレプリカを CDN Edge 上に配布する。 Worker から直接アクセス可能。また、上述の R2 上のバックアップや、DB のスナップショットの import/export が行える。 R2 と同様、帯域に課金されず、こちらもストレージと操作に対して料金が発生する。
現在はオープン α として誰でも利用可能な状態です。自分も実際触ってみましたが、GUI or CLI から簡単に DB を作成できました。業務利用もそうですが、個人開発時には DB に困ることも多いため、大きな選択肢になるかもしれません。
And here’s another one: the Next.js Edge Runtime becomes the fourth full-stack framework supported by Cloudflare Pages
https://blog.cloudflare.com/next-on-pages/
Edge ランタイムを利用する Next.js アプリケーションを Cloudflare Pages Functions にデプロイできるようになりました。 元々 Vercel の Edge Functions を対象にデプロイできていましたが、これが Cloudflare でも可能になった形です。1 年間ほどは Cloudflare Pages Functions は β 版の扱いとのことです。上述の D1 や R2 との組み合わせが可能になると、Cloudflare の Edge 上だけで構築可能なアプリケーションの範囲が広がりそうです。
2022 年に主要な Web ブラウザに実装された気になる機能をピックアップ!
- 共有者: @nus3_
主要ブラウザ全てで実装されたもの
<dialog>
https://webkit.org/blog/12209/introducing-the-dialog-element/
- Firefox98と Safari15.4 で実装されたことで、主要ブラウザで
<dialog>
要素が使えるようになった showModal
で表示された<dialog>
要素にスタイルを適応することができる:modal
擬似クラスも実装された:modal
や::backdrop
を使って、ダイアログ関連のスタイリングができるようになった- 個人的な注目ポイントとしては、
<dialog>
+showModal
を使うことで簡単にダイアログ以外の要素を簡単にinert
(不活性)できる部分 - https://nus3.github.io/p-new-features/pages/dialog/index.html
:focus-visible
- Safari15.4で実装されたことで、主要ブラウザで使えるようになった
- マウス操作とキーボード操作でのフォーカスのスタイルを
:focus
、:focus-visible
で分けて定義できる :focus { outline: none; }
からの卒業!- https://nus3.github.io/p-new-features/pages/focus/index.html
@layer
https://cybozu.github.io/frontend-expert/posts/css-cascade-layers
- セレクターの詳細度より、優先してスタイルが適用される Cascade Layers が主要ブラウザに実装された
- 複数のライブラリの CSS を読み込んでセレクタの詳細度の管理が複雑になった時などに Cascade Layers の検討しても良さそう
backdrop-filter
- Firefox103で実装されたことで、主要ブラウザで
backdrop-filter
プロパティが使えるようになった - Safari で使う場合のみ、
-webkit
プレフィックスが必要 backdrop-filter
を指定した要素の背後の領域に対して、ぼかしや色を反転させるなどの変化を与えることができる- https://nus3.github.io/p-new-features/pages/backdrop-filter/index.html
もう少しで主要ブラウザ全てで実装されそうなもの
@container
https://developer.chrome.com/blog/has-with-cq-m105/
- Chrome105とSafari16で実装された
- Firefox が実装されれば、主要ブラウザ全てで Container Queries が使えるようになる
- メディアクエリがビューポートの幅に応じてスタイルを変更できるのに対して、Container Queries では、コンテナ(特定の要素)のサイズに応じてスタイルを変更できる
- Container Queries を使うと、コンポーネント単位でのレスポンシブなスタイル指定が可能に
- https://nus3.github.io/p-new-features/pages/container-queries/index.html
:has()
https://developer.chrome.com/blog/has-with-cq-m105/
- Chrome105とSafari15.4で実装された
- Firefox103 よりフラグ付きで使用可能
:has()
の引数で指定されたセレクターに該当する要素がある場合にスタイルを適用する- https://nus3.github.io/p-new-features/pages/container-queries/index.html
個人的に今後注目しているもの
- Open UI によるブラウザにビルドインされたコンポーネント(
<select>
や dropdown など)のスタイルや拡張の提案 - 実際に Chrome では
popover
属性や<select>
の拡張などを試験的に実装している - キーボード操作やアクセシビリティなど担保されたビルトインのコンポーネントが拡張できるようになる未来・・・