GameWith Developer Blog

GameWith のエンジニア、デザイナーが技術について日々発信していきます。

GameWithのリプレイスについて vol.3 ~俺たちは Shadow DOM で Micro Frontend の理想を追う~ #GameWith #TechWith

はじめに

こんにちは!Incremental Stream Team の @53able です!

GameWithのリプレイスについて第3回目の記事である今回は、 GDS(GameWith Design System) の根底にある方針や考え方について書いていきたいと思います。

前回の記事はこちらから御覧ください

tech.gamewith.co.jp

GDS が目指しているもの

GDS は前回のブログでも書いたように、下記のような世界を目指しています。

  • どんなプロジェクトでも簡単に利用できるHTMLコンポーネントの提供
  • 将来的にデザイナーも UI/UX 改善に利用できるようにしたい
  • 将来的にエコシステムを OSS として公開したい

どんなプロジェクトでも簡単に利用できるHTMLコンポーネントの提供

GDS では Web Components というWeb標準技術を利用して、HTMLコンポーネントを提供しています。

Web フロントエンド アプリケーションを開発する際に考えられるのは Vue や React や Angular などといったフレームワークがあげられます。

これらのフレームワークで開発を行った場合、例えば Vue を採用した際に、React のアプリケーションにコンポーネント提供した場合かなり困難であると考えられます。

そのため、Web 標準である Web Components のコンポーネントモデルを導入することで、様々なフレームワークで書かれたコンポーネントアプリケーションを開発していくとにしました。

Web Components について

提供をしている Web Components は自己完結型です。

そのため、コンポーネントは他のコンポーネントに影響を与えることなく修正し、アップグレードしていくことが可能です。

GDS は僕たちのチームで構築をし開発を行いましたが、ドメインの異なるチームでも積極的に利用をはじめています。

今までの GameWith の開発サイクルやリリースの仕組みなどと分離されているため、他のチームでも利用しやすいです。

例えば あつ森 (あつまれどうぶつの森) 攻略記事でリリースしたツール は GDS を利用して、攻略記事チームが開発をしました。

gamewith.jp

このあつ森のツールは GameWith というアプリケーション内にある、独立したフロントエンドアプリケーションのような動きをします。

以上のことから今後もGDSをGameWithサービス内でスケールさせていきたいと考えているので、このアーキテクチャによるメリット/デメリットを上げておきます。

メリット

  • iframe のような強力な分離。ネームスペーシングは不要です
  • グローバルスタイルが Micro Frontend に影響されないです。既存のアプリケーションとの連携が安全なので、追加的実装に最適です
  • CSS に関して ツールチェーン の必要性を減らせる可能性があります
  • フラグメント(Web Components)は自己完結型です。個別の CSS ファイルの参照はありません

デメリット

  • 古いブラウザではサポートされていません。ポリフィルは存在しますが、重くて、経験則に基づいた実装になっているため、根本解決にはなりません
  • 動作するには JavaScript が必要です
  • プログレッシブエンハンスメントはありません
  • サーバーサイドレンダリングは今、 Declarative Shadow DOM という仕様が策定されており将来的に気軽にできるようになるかもしれませんが、まだ一般的はないようです
  • 異なる Shadow DOM 間で共通のスタイルを共有するのは難しい
  • Bootstrap のようなグローバル CSS クラスを使用するスタイリングアプローチでは動作しません

デメリットへの解決策

GDS では @vue/web-component-wrapper を介して Vue の SFC 内で共通のスタイルを import しています。異なる Shadow DOM 間でのスタイルは、SFC をビルドすることによって共有可能となっています。

Web Components の各種ライフサイクルは、Vue のライフサイクルによって紐付けられているので、 Web Components の実装のソリューションが実現できています。

github.com

今後について

GDS が目指しているのは「どんなプロジェクトでも簡単に利用できる HTML コンポーネントの提供」です。

そのため、より中立的な Web 標準の技術を利用していくのを追求していきたいと思います。

現在の GDS から 提供される Web Components は、複数の Vue SFC をまとめてビルドするので、まだまだ粒度が大きいコンポーネントとなっています。

例えば、ボタンなどは Vue の SFC として存在していますが、ボタン自体が Web Components として提供されているわけではありません。

今後は、ボタンなどといった汎用的な細かいコンポーネントも Web Components として提供することで、Micro Frontend 化を進めていきたいと思います。

さいごに

GameWithのDeveloper向けTwitterアカウントも開設しました。
良かったらフォロー宜しくお願いします!

twitter.com