🏎

Astro 2.0 と迫る TS 5.0 の気配など : Cybozu Frontend Weekly (2023-01-24号)

2023/01/26に公開

こんにちは! サイボウズ株式会社フロントエンドエキスパートチームの Saji (@sajikix) です。

はじめに

フロントエンドエキスパートチームでは毎週火曜日に Cybozu Frontend Weekly という 「1 週間の間にあったフロントエンドニュースを共有する会」 を社内でに開催しています。

今回は、2023/01/24 の FrontendWeekly で取り上げた記事や話題をまとめたものになります。

取り上げた記事・話題

Bun v0.5 | Bun Blog

https://bun.sh/blog/bun-v0.5.0

Bun v0.5 がリリースされました。主なアップデートは以下のようになっています。

  • package.jsonworkspaces 機能に対応
  • ドメイン名解決のためのビルドイン API である Bun.dns を実装
  • node:readline のサポート
  • socket 生成における  node:tls / node:net との互換性改善
  • WebSocket の Custom headers に対応

また Bun が仕様にない機能や Draft 段階の機能を積極的に入れている点が FrontendWeekly では話題になりました。今回のアップデートで言うと Custom headers in WebSocket などがこの例にあたります。

A long-standing feature request on the WebSocket spec is the ability to set custom headers when opening a WebSocket. While this hasn't yet landed in the WebSocket standard, Bun now implements it.

この機能は引用部分に書かれているように WebSocket の spec にない機能ですが、ユーザの要望の多いものは積極的に採用する姿勢のようです。

同様の例として、現在提案段階の JSX の新しい記法にも対応し、TypeScript にサポートの要望を出しています。(TypeScript 側ではサポートしないと言う結論になったようですが。)

https://twitter.com/jarredsumner/status/1608856049452449792

昨年からは JS ランタイム製作者も交えて標準化を進める Winter CG といった取り組みも始まる中、仕様にない機能を入れていく姿勢に対しては疑問視する声も上がっています。 今後も Bun の方針には注目していきたいところです。

Wasm で JavaScript を動かす意義

https://blog.anatoo.jp/2023-01-18

Wasm で JS を動かす大きな意義として「 Wasm で JavaScript 処理系を動かすことで JavaScript のコードを安全に評価できる点」があるという話です。

Wasm が 「明示的に用意された API 経由でしか外にアクセスできない非常に限定されたコンテキストで実行される」と言う利点を生かした活用方法です。ユーザーの定義した JS プラグインを実行する用途などでは今後活用されていくかもしれません。

Ezno in '23

https://kaleidawave.github.io/posts/ezno-23/

去年の9月ごろに tsc を Rust で置き換えている話を発表した人の続報です。

今現在はプライベートなリポジトリで作業しているものの段階的な公開を目指しており、パーサーがそろそろ公開できそうとのことです。ブログでは最初の発表からのアップデートや苦労した点などを現在開発中のツールが動いてる様子のスクリーンショットを交えつつ説明しています。

バンドラーに Rust を採用する例は増えましたが、TypeScript の型チェックで Rust を利用するライブラリではまだメジャーなものがなく、今後に期待したいところです。

TS 5.0 情報

https://github.com/microsoft/TypeScript/issues/51362

https://speakerdeck.com/uhyo/tuinilai-ru-typescript5-dot-0noxin-ji-neng

TypeScript 5.0 に入りそうなアップデートについてです。

Issue を見る限り、TypeScript5.0 の beta は 1 月末ごろに公開予定のようです。今回は上 2 つの記事をもとに注目なアップデートをいくつか紹介します。

ECMAScript Decorators

ここ数バージョンでずっと Iteration Plan に入っていたものの入ることが叶わなかった ECMAScript Decorators がついに入りそうです。

Legacy Flag Deprecation

さまざまな理由から必要がなくなってきた古いオプションを非推奨にし、廃止していくことになりました。

Support .ts as a Module Specifier for Bundler/Loader Scenarios

ESM 環境下では、import の際に拡張子をつける必要があり、今までは import するファイルが TS ファイルであっても.js拡張子で指定する必要がありました。
今回のアップデートでは allowImportingTsExtensions オプションを有効にし、 JavaScript にトランスパイルしないことを条件に.ts拡張子で import できるようになりました。

Declaration Files for Non-JavaScript Files

CSS ファイルや JSON ファイルなど JS でないファイルに対しても型定義ファイルを作成できるようになります。

Allow Arrays in extends for tsconfig.json Files

複数の tsconfig ファイルを配列形式でまとめて継承できるようになります。

Uhyo さんのスライドでも述べられている通り、TypeScript 5.0 は 「ECMAScript Decorator の実装 + 開発者にとってありがたいオプションや機能の追加」 がメインになりそうです。

Chrome113 から WebGPU が Shipping 予定

https://chromestatus.com/feature/6213121689518080

Chrome113 から WebGPU が Shipping になる予定です。

WebGPU は Web ページ上でシステムの GPU を使用し、処理の重い描画などをより高速化するための Web API です。WebGPU API では描画計算だけでなく、GPU を利用した汎用的な演算をサポートするとしています。

この記事で参照されているデモコードは Next.js で作られており、モダンなフレームワークに慣れた人にとってもわかりやすくなっています。

The truth about CSS selector performance

https://blogs.windows.com/msedgedev/2023/01/17/the-truth-about-css-selector-performance/

Edge の DevTools で CSS セレクタの処理にどれくらい時間が掛かっているか計測できるようになり、その利用方法を実例を交えて紹介しています。

記事ではツールの使い方や実例以外にも「セレクタの評価のされ方」や「どういったセレクターだと計算が遅くなりがちか」といったことも解説されているので参考になりそうです。

直近 1 年では CSS の新しい記法や機能追加が目立っており、:hasプロパティのように書き方によってはパフォーマンスを悪化させる可能性のある記法の追加も行われています。CSS の機能が豊富になるほど、CSS セレクタによるパフォーマンスを意識する機会が増えるのではないかといった意見が FrontendWeekly 参加者から寄せられました。

TypeScript performance lessons while refactoring for v10 | tRPC

https://trpc.io/blog/typescript-performance-lessons

tRPC で型チェックのパフォーマンスを tsc の --generateTrace を使って改善している話です。

tsc には --generateTrace と言うパフォーマンスとレースのためのオプションがあり、出力されたファイルを Chrome の tracing 機能 (chrome://tracing) などで見ることでどの部分に時間がかかっているかを分析できます。(詳細は公式のドキュメントを参考にしてください。)

今回の記事では --generateTrace 機能の使い方から実際に型推論の遅かった部分の改善までの様子を紹介しています。改善の結果、該当部分の型チェックの時間は 332ms から 136ms に短縮したそうです。プロダクトが大きくなるとどうしても型チェックに時間がかかることが多いですが、一度 --generateTrace オプションを利用して分析してみると良さそうです。

Blink: Intent to Ship: CSS Nesting

https://groups.google.com/a/chromium.org/d/msgid/blink-dev/Y8ph9gk50U2D92f3%40google.com

CSS のネスト記法が Chrome の v112 から入りそうです。

CSS のネスト記法は名前の通り Sass などで可能だった CSS のネスト(入れ子)ができるようになる記法です。WebKit や FireFox も導入に前向きな仕様ですが、Chrome ではいち早く v109 から DevTrial として実装しており、v112 で正式にサポートする予定です。

Test your React Components with Nightwatch and Testing Library

https://labs.pineview.io/test-your-react-components-with-nightwatch-and-testing-library/

Nightwatch と Testing Library を組み合わせて、実際のブラウザ上でコンポーネントのテストができるようになったという話です。

Nightwatch による React のコンポーネントテストサポートが改善しました。また Testing Library にも @nightwatch/testing-library プラグインで対応します。Component の テストは Storybook で使われるフォーマットである CSF で記述できます。記事では丁寧にチュートリアルやサンプルが乗っているので試してみるのに良さそうです。

How to Build a GraphQL Server with Deno

https://deno.com/blog/build-a-graphql-server-with-deno

Deno 公式が公開した Deno で GraphQL サーバーを構築する方法を解説したブログです。動画も踏まえつつ丁寧に解説しているので Deno で GraphQL を扱いたい、試してみたい人は参考にすると良さそうです。

数を扱うのが苦手な人に向けてのデザイン

https://accessible-usable.net/2023/01/entry_230115.html

数を扱うのが苦手な人に向けて配慮すべき事項をまとめた記事になります。

数を扱うのが苦手な人でも誤解や読みにくいこと少なくなるようにどういった工夫ができるかがまとまっています。数を扱うのが苦手な人を排除しないというのはもちろんのこと、苦手意識のない人にとってもより認識しやすくなるような工夫が多いのでデザインや UI 設計で活かせる部分が多そうです。

Next.js 製アプリケーションのコンパイルを約 100 倍高速化した話

https://zenn.dev/mkt/articles/543669021d9a1e

Next.js の trace 機能を利用してパフォーマンスでボトルネックになっている部分を探し大きな改善につなげた話です。

Next.js ではプロセス終了時 .next ディレクトリに trace ファイルを吐き出すのですが、これを next.js/scripts/trace-to-tree.mjs に読み込ませることで各処理にかかっている時間を分析できます。今回の記事ではこの分析から Tailwind CSS の JIT が正しく機能していないことを突き止め、コンパイル時間の大幅な短縮につなげています。

FrontendWeekly 内では trace ファイルの存在やそれを読みやすくしてくれるスクリプトについて「知らなかった」と言う声が多かったです。Next.js を利用していてコンパイルの遅さが気になった時などは試してみましょう。

Astro 2.0

https://astro.build/blog/astro-2/

Astro 2 がリリースされました。( FrontendWeekly 開催時はリリース発表会の告知が出ているだけの段階でした。)

大きなアップデート内容は以下になります。

  • Content Collections API を追加し、Markdown / MDX への型情報を生成し開発者体験を向上
  • SSG SSR を組み合わせた Hybrid Rendering に対応
  • エラー表示を改善
  • dev server の Hot Module Reloading (HMR) を改善
  • Vite 4.0 対応

フロントエンドエキスパートチームではFrontend monthly のサイトを Astro で置き換えたばかりだったのですが、rito さんPR のおかげもあり、既に v2 へ移行済みです。

React の新しいドキュメントがほぼ完成

https://twitter.com/dan_abramov/status/1617543301477060608?s=20&t=L6032_4fySxsmuB_1QYyTw

React の "beta" ドキュメントとして公開していた新ドキュメントのコンテンツがほぼ全て揃ったそうです。既存の React ドキュメントは古い記述も多く、新ドキュメントでは Learn の部分も充実しています。今後は新ドキュメントを参照する方が良さそうですね。

またコンテンツが揃ったので今度は各言語への翻訳プロジェクトが始まるのでは?といった話も FrontendWeekly ではあがっていました。

ヤフートラベルのシステムリニューアル / 一休.com とのシステム統合

https://techblog.yahoo.co.jp/entry/2023012430401564/

Yahoo トラベルと一休.com のシステム統合について解説した記事になります。執筆者である伊藤直也さん(@naoya_ito) が話した動画もあるので合わせて参照すると良さそうです。

https://www.youtube.com/watch?v=JN4kGYbQMJ8&t=1100s

ここまで大きな Web システムを統合した事例は少なく、どのような過程を経て統合したのかが詳しく書かれている記事でもあるので参考になるノウハウも多そうです。

Introducing the WebAssembly JavaScript Promise Integration API · V8

https://v8.dev/blog/jspi

JS の非同期な処理の呼び出しを、Wasm から同期呼び出しのように扱える仕様である JavaScript Promise Integration API (JSPI) が v8 に実装されました。

Web 上の API の多くは、その性質上、非同期型あるのに対して WebAssembly アプリケーションは同期 API を前提に書かれているのが一般的です。また WebAssembly は Promise を直接操作できないため問題はより顕在化します。

これらのギャップを埋めるため JSPI は非同期 API 呼び出しから返された Promise を傍受し、WebAssembly アプリケーションのメインロジックを一時停止します。その後非同期 API が完了するタイミングで、WebAssembly アプリケーションを再開することで API 呼び出しの結果を処理できるようにします。

Node.js でデスクトップアプリを作るツール、Gluon について

https://gluonjs.org/

ElectronTauri などと同じく Node.js ベースでデスクトップアプリが作れるツール、「Gluon」 についてです。

先行するライブラリにない大きな特徴として、内部にブラウザをバンドルせずユーザのインストールしているブラウザを利用するという特徴があります。この特徴によりバンドルサイズを大きく減らすことが可能です。サポートブラウザとしては Chromium 以外にも Firefox に対応しており、 Runtime としても今後 Deno や Bun のサポートを予定しています。

「ユーザのインストールしているブラウザを利用する」というアイデアの面白さ・新しさがある一方で「ブラウザ間やバージョン間での挙動差が起きないか不安」といった声も FrontendWeekly 参加者からは上がりました。

あとがき

TypeScript 5.0 や Astro 2.0 、CSS Nesting のサポートなど新しい機能・仕様が増える楽しい話題もありつつ、広がる仕様とその追従に関して独自の方針を持ってそうな Bun には一抹の不安が残りますね。また今回は処理の重い部分を tracing する方法を解説する記事が多く、パフォーマンス周りのツールやライブラリ標準機能の充実を感じました。

フロントエンドエキスパートチームでは毎月最終火曜の 17 時から Frontend Monthly というイベントを Youtube Live で開催しています。その月のフロントエンド注目ニュースやゲストを呼んでの対談などフロントエンドに関する発信をしていますので是非見てくださいね!

YouTubeのvideoIDが不正ですhttps://www.youtube.com/playlist?list=PLPTndynQK4dxLZFEZgOZjt_zKG-0JWoWy

またフロントエンドエキスパートチームでは、一緒にサイボウズのフロントエンドを最高にする仲間を募集しています! 気になる方は下のリンクをクリック!

https://cybozu.github.io/frontend-expert/

サイボウズ フロントエンド

Discussion