Cybozu Frontend Monthly #68
イベント概要
サイボウズフロントエンドマンスリー は、サイボウズ社内で行っているフロントエンド情報共有会「フロントエンドウィークリー」の公開版です。
その月に気になったフロントエンドの情報を、サイボウズのフロントエンドエンジニアのメンバーが共有していきます。
このイベントのハッシュタグは #サイボウズフロントエンドマンスリー です。
※フロントエンドウィークリーとは
毎週火曜の 17:00 〜 18:00
で社内向けに行っているフロントエンドの気になる記事を紹介する会です。
2016年3月15日から行われています。
ZennのPublicationにてウィークリーのまとめを投稿していますので、ぜひこちらもご覧ください。 https://zenn.dev/p/cybozu_frontend
開催日
2026年04月28日
イベントページ
https://cybozu.connpass.com/event/390340/
メンバー
コンテンツ
👀 Notable Articles
Post Mortem: axios npm supply chain compromise
- 共有者: @mugi_uno
2026 年 3 月 31 日に、週 1 億回以上ダウンロードされるメジャーなデータフェッチ用ライブラリである axios において、 メンテナーアカウントが乗っ取られ、悪意あるコードが混入されたバージョンが公開される、という事案が発生しました。
この件について、公式から Post Mortem が公開されました。
https://github.com/axios/axios/issues/10636
この中で、メンテナーアカウントが乗っ取られた流れについても説明されていました。 https://securitylabs.datadoghq.com/articles/axios-npm-supply-chain-compromise/#how-the-maintainer-got-compromised
以下、引用です。
- The attacker reached out impersonating the founder of a company, using the real founder’s likeness and branding.
訳: 攻撃者は、本物の創業者の顔写真とブランディングを使用して、会社の創業者を装って連絡を取りました。- They invited the maintainer to a Slack workspace designed to pass as the company’s internal communications. The workspace had channels sharing LinkedIn posts that linked to the real company’s account, fake profiles for the company’s team, and profiles of other open source maintainers.
訳: 攻撃者は、会社の内部通信を模倣する Slack ワークスペースを招待しました。ワークスペースには、本物の会社のアカウントにリンクする LinkedIn 投稿、会社のチームの偽のプロフィール、その他のオープンソースメンテナーのプロフィールが含まれるチャンネルがありました。- They scheduled a Microsoft Teams meeting with what appeared to be a group of people.
訳: 攻撃者は、見た目がグループの人たちとの Microsoft Teams ミーティングを予約しました。- During the call, the maintainer was told a component on their system was out of date and was prompted to install an update. The update was the RAT.
訳: 電話で、メンテナーにシステムのコンポーネントが古くなっていると伝え、更新をインストールするように促しました。更新は RAT (トロイの木馬) でした。
(アカウント自体は 2FA が有効であったものの、復旧コードが利用されたことが予想されるそうです。)
ソーシャルエンジニアリングによる非常に手が込んだ攻撃であり、人間自体を狙われた、という点が注目されました。
昨年末から npm パッケージによるサプライチェーン攻撃が頻発していることもあり、 利用側としては引き続き対策に取り組んでいく必要がありそうです。
- min-release-age の設定 (一定期間経過したバージョンのみ取り込む)
- ignore-scripts (Pre/Post Install Hooks を無視する)
- 認証情報を 1Password などに逃がす
- Dev Container などによる環境の分離
min-release-age は、従来は pnpm や yarn にしか無かった概念ですが、現在では npm 標準で利用可能となっていたり、 pnpm では次期バージョン(v11)では minimumReleaseAge の設定自体がデフォルトになる見込みであったり、 パッケージマネージャ側を更新することでもセキュリティ向上に繋がる可能性もあるため、注意を払っておいたほうが良さそうです。
Vitest のドキュメントに Learn セクションが追加
- 共有者: @nus3
Vitest のドキュメントに Learn セクションが追加されました。 Learn セクションには次の内容が含まれています。
- テストの書き方
- Matchers の使い方
- 非同期コードのテスト方法
- setup と teardown
- Mock
- スナップショットテスト
- テストのプラクティス
- テストのデバッグ方法
- AI を使ったテストの書き方
Learn の各セクションを読んで見ての感想
- 同一ファイル内だとテストケースは順次実行されるけど、
test.concurrentで同一ファイル内でも並列で実行できる - primitive な値は
toBe、object や array はtoEqualで比較してね toBeDefined使ったことなかった- オブジェクトのプロパティの assert
toMatchObjectで指定したプロパティのみ asserttoHavePropertyでドット記法が使える
expect.softを使うと失敗してもテストが続行されるonTestFinishedでテストケース内で、テスト終了後の処理を定義できるvi.spyOnとvi.fnの違い- setup、act、check というテストの構成
- AI エージェントを使用して不具合を修正する際は、まず失敗するテストを作成することから始めよう
- describe のテストは 1~2 層以上深めないでね
- テストファイルが数百行を超える場合はテーマや領域ごとに分割を検討すること
vitest -t "sets the default role"のように-tでテストケースを指定できる- テストケース間で共有の状態を持たないように
text.extendを使うパターン vi.spyOnで戻り値を上書きすると、復元しない限り次のテストにも引き継がれるから、restoreMockしようねvi.mock('./module.js')ではなくvi.mock(import('./module.js'))が良い- TS がモジュールの型チェックできるようになるから
- AI エージェントがよく
vi.mock('./module.js')で書くから気をつけてね
Under the hood of MDN’s new frontend
- 共有者: @sajikix
MDN が React ベースのアーキテクチャから Lit/Web Components・Declarative Shadow DOM・Rspack を活用した新構成に移行した技術的な詳細を解説した記事が公開されました。
以前の実装は Create React App 起点の React SPA だったが、以下のような課題があったそうです。
- 巨大な Webpack 設定
- Sass と CSS 変数が混在した CSS
- レンダーブロッキングな巨大 CSS の配信
- スコープの聞かせることのできていない CSS
またそもそも React SPA 実装でも多くの静的コンテンツはdangerouslySetInnerHTMLで埋め込まれており、単なるラッパーのようになってしまっていました。にも変わらず React SPA のバンドルサイズやレンダリング負荷などは無視できるものではなくユースケースに対してあっていない実装になってしまっていたようです。
むしろ MDN のようなコンテンツは静的なページの中にインタラクティブな要素が点在する構成のため、Web Components を活用した新しいアーキテクチャに移行することになったそうです。
ライブラリとしては Lit を導入し、Lit の html テンプレートリテラルをベースに独自の Server Component のような仕組みを構築しているようです。動的な要素に関しては「ページ読み込み時に DOM を走査して mdn-* 要素を見つけたら対応する element.js を動的 import する」という仕組みで実現しています。
CSS に関しても OuterLayout で実際にレンダリングされたコンポーネント分の CSS だけを <link> で差し込む仕組みを Rspack の compilationStats を利用する形で実装しているようです。
近年では静的なコンテンツなどでは Astro などを採用する例が多い中で、MDN のような大規模サイトで Web Components を活用した例は珍しく、参考になる点が多い記事でした。
🗓 Monthly Articles
📖 Framework, Library
- Vitest 4.1 is out!
- Vite 8 対応に加え、テストケースへのタグ付け機能、
aroundAllフック、非同期リーク検出、GitHub Actions Job Summary 生成など多数の機能が追加された
- Vite 8 対応に加え、テストケースへのタグ付け機能、
- Storybook MCP for React
- AI エージェントにコンポーネント情報を提供し既存コンポーネントの再利用を促進するツール。テスト実行やプレビュー表示でトークン使用量を削減できる
- Storybook 10.3 — Component-driven development for humans and agents
- MCP for React、アクセシビリティ改善、CSF Factories 対応、Vite 8 や Next.js 16.2 への対応などが含まれるリリース
- Next.js Across Platforms: Adapters, OpenNext, and Our Commitments
- Next.js 16.2 で OpenNext と共同開発された Adapter API が安定版として正式化され、Vercel 以外のプラットフォームへのデプロイを標準化する仕組みが整った
- React Compiler 導入で得られた効果と気をつけたいポイント
- 自動メモ化により再レンダリング時間が 93% 削減された一方、オブジェクト参照を保持したまま内部状態を変更する react-hook-form や TanStack 系ライブラリとの非互換が発生し
use no memoで対処した事例
- 自動メモ化により再レンダリング時間が 93% 削減された一方、オブジェクト参照を保持したまま内部状態を変更する react-hook-form や TanStack 系ライブラリとの非互換が発生し
- [flags] land enableTrustedTypesIntegration
- React に Trusted Types API との統合が追加され、DOM API に値を渡す際に TrustedHTML 等の型付きオブジェクトを直接渡せるようになり XSS 対策が強化された
- React Server Components Your Way
- TanStack Start が RSC をフェッチ可能なデータプリミティブとして扱うアプローチを解説。クライアント・ハイブリッド・静的など柔軟な構成を TanStack Query/Router と組み合わせて実現できる
- Tales from the Void: March 2026 Recap
- Vite 8 が Rolldown をバンドラーとして採用し、Oxc の ESLint プラグイン互換性が実装されるなど VoidZero 製 JS ツールチェーンの統合が進む
- Vitest Learn
- 非同期コードのテスト、モック関数、デバッグ、AI を活用したテストの書き方など実践的なコンテンツを扱う Learn セクションが Vitest ドキュメントに追加された
- pnpm v11.0.0-rc.0
minimumReleaseAgeのデフォルトが 1 日に変更され、pnpm ciコマンドの追加やpnpm publish/loginなどがネイティブ実装に移行するなど大型アップデート
- csskit
- Rust で書かれたゼロコンフィグの CSS オールインワンツールチェーン。フォーマット・リント・ミニファイ・トランスパイル・バンドル・分析機能を備えたアルファ版
- yuku
- Zig で書かれた高性能な JavaScript/TypeScript コンパイラ。外部依存なしで仕様への完全準拠を目指し、npm 環境では Oxc より 3〜5 倍高速とされている
- Hybrid Type-Aware Linting: Performance Evaluation
- tsgo を使った linter の実装方法別パフォーマンス検証。同期 FFI で tsgo を呼び出す方式が最もパフォーマンスが良かったという結果をまとめた検証リポジトリ
⚡️ Services
- Dynamic Workers
- Cloudflare がリクエストごとに Worker を動的生成できる機能をオープンベータで提供開始。V8 アイソレートにより従来のコンテナより 100 倍高速な起動を実現
- Introducing EmDash: A WordPress Alternative Built on Cloudflare
- Cloudflare が Astro 6.0 上に構築したフルスタックサーバーレス CMS「EmDash」を発表。プラグインをサンドボックス化した Worker isolates で実行しセキュリティ問題を解決する MIT ライセンスの OSS
- Cloudflare Sandboxes is now generally available
- AI エージェントが安全な分離環境でコード実行・開発できる Cloudflare Sandboxes が GA に。ファイルシステム・シェル・PTY をサポートし、認証情報を安全に注入できる
- Vercel April 2026 security incident
- 第三者 AI ツールの侵害を経由して Vercel の内部システムへの不正アクセスが発生。一部顧客の機密マークなし環境変数が漏洩したインシデントの詳細
- GitHub Stacked PRs
- 大規模な変更を小さく相互依存したプルリクエストに分割して管理できる GitHub の機能。積み重ねた PR を同時マージできる仕組みをネイティブ GitHub 対応と CLI で提供するプライベートベータ版
🖥 Browsers
- More reasons to love Firefox: What’s new now, and what’s coming soon
- Firefox 148/149 の新機能紹介。無料 VPN、分割ビュー、タブノート、AI 搭載スマートウィンドウなどが追加されプライバシー保護と利便性が向上
💬 Languages
- Announcing TypeScript 6.0
- TypeScript 6.0 がリリース。
strict: true・module: esnext・target: es2025がデフォルト化され、ES5 ターゲットや CommonJS/AMD/SystemJS などレガシー設定が非推奨に。Temporal API 型や Map の upsert メソッドも追加
- TypeScript 6.0 がリリース。
- Any String Autocomplete in TypeScript
"one" | "two" | stringと書くとstringに吸収されオートコンプリートが失われる問題に対し、string & {}トリックやtype-festのLiteralUnionで解決する方法を紹介
- Too Much Color
- CSS の oklch/oklab 色空間では小数点 3 桁の精度で視覚的に区別不可能な誤差に収まるという考察。ミニファイアが色値の精度を最適化すべきと提案している
🤖 Runtimes
- Node.js — 2026 年 3 月 セキュリティリリース
- Node.js 20.x〜25.x 向けセキュリティアップデート。TLS SNICallback 例外処理不備や
__proto__ヘッダによる DoS など High 2 件・Medium 5 件・Low 2 件の脆弱性に対応
- Node.js 20.x〜25.x 向けセキュリティアップデート。TLS SNICallback 例外処理不備や
- Java に V8 や CPython を組み込む「Project Detroit」
- Oracle の Project Detroit を解説した記事。JNI・リフレクション・動的プロキシによる 3 層ブリッジ構造で Java から JavaScript エンジン V8 や Python ランタイム CPython を呼び出せる仕組みを紹介
📝 Specifications
- Use of Large Language Models in Standards Work
- W3C アドバイザリーボードが発表した文書。標準化作業における LLM の有用なユースケースと著作権侵害・データ漏洩・不正確さなどのリスクを整理し、利用時の原則を示している
- Web Content Browser for AI Agents Community Group
- AI エージェントが解釈しやすい JSON 形式でウェブページコンテンツを提供する仕様を開発する W3C コミュニティグループが発足。llms.txt とは別に SOM Spec v1.0 を出発点とした仕様・スキーマ・テストスイートの策定を目指す
🦆 Others
- CanisterWorm Hijacks npm Publisher Accounts, Steals Tokens
- 脅威グループ「TeamPCP」が npm 公開トークンを盗んで正規パッケージを悪質なバージョンに置き換える「CanisterWorm」キャンペーンを展開。ICP キャニスターを C2 として使用する新しい手法
- axios compromised on npm: maintainer account hijacked, RAT deployed
- axios の npm メンテナーアカウントが侵害され、マルウェア入りバージョン(1.14.1 / 0.30.4)が公開された。クロスプラットフォーム RAT を仕込んだサプライチェーン攻撃の詳細と ポストモーテム も公開されている
- GitHub Actions に関する相次ぐ侵害事例を振り返り、次なる脅威に備える
- reviewdog・tj-actions・Trivy 等が連鎖的に侵害された事案を分析。メモリダンプ経由のシークレット窃取などの攻撃手法の進化と、依存性の検疫期間設定・バージョン固定化などの対策をまとめたスライド
- SmartHR におけるパスキー実装
- マルチテナント SaaS での RP ID 設計(
smarthr.jpに統一)、Conditional UI とパスキーログインボタンの併用、AAGUID によるパスキー名の自動補完など実装のポイントを解説
- マルチテナント SaaS での RP ID 設計(
- アーキテクチャと組織のインタラクション
- BASE でのモジュラモノリス導入から 4 年間の振り返り。顧客価値検証と分散自律改善は同時最大化できないというトレードオフを組織とアーキテクチャの観点から論じた
- Introducing a new spam policy for “back button hijacking”
- 戻るボタンで広告ページを挟む「バックボタンハイジャック」手法を Google 検索がスパムポリシーとして明示的に禁止すると発表
- Under the hood of MDN’s new frontend
- MDN が React ベースのアーキテクチャから Lit/Web Components・Declarative Shadow DOM・Rspack を活用した新構成に移行した技術的な詳細。ページロード時間を大幅短縮している
- CSS or BS?
- 実在する CSS プロパティと架空のプロパティを見分ける 20 ラウンドのクイズゲーム。600 以上のプロパティを持つ CSS 仕様の広さを体感できる