SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

BizReach Tech Blog

大規模Angular SPA開発に立ち向かうためにアプリとUIを切り分けた話

BizReach Tech Blog 第4回(後編)

Atomic Design+SPA=Atomic Components

 ここで、コンポーネントの粒度について少し紹介したいと思います。

 この2~3年でAtomic Designが認知され導入事例も出てきておりますが、「ワイヤーフレームを持つTemplates」「実際のテキストや画像が入るPages」という概念がSPA(シングルページアプリケーション)では馴染みにくいと考え、Atomic Designから派生しSPA向けに最適化されたAtomic Componentsを参考にして設計を進めました。

 私たちは以下のような構成でコンポーネントを分類しています。

Atoms

 これ以上分解不可能なUIの最小単位。また、これ以上分解することはない粒度のUIもAtomsに配置しています。

  • 例:Avatar、Button、Checkbox、Input Field、Tooltip、etc……

Molecules

 Atomsに属するコンポーネントを繰り返し配置したもの、もしくは複数のAtomsコンポーネントを配置してグループ化したもの。内部で状態を持つことはありません。

  • 例:Dropdown、Nav、Pagination、etc……

Organisms

 Moleculesに属するコンポーネントを複数並べたもの、もしくはOrganismsの中で別のOrganismsを呼び出す必要があるもの。内部で状態を持ち、状態はOrganismsの中だけで完結するものであり、他のOrganismsや上位のEcosystemに干渉を受けることはありません。

  • 例:Popover、Tabs、RichtextEditor、ImageCrop、etc……

Ecosystem

 Atomic DesignではTemplatesに相当するレイヤー。ReactでいうContainer Component的な立ち位置のコンポーネントで、状態管理が求められるレイヤー。Organisms、Molecules、Atoms Componentを用いてEcosystem Componentを実装していきます。

Environments

 ページ全体を指すもので、Atomic DesignではPagesに相当するレイヤー。SPAであればEnvironmentsは基本的には1つだけとなります。また、ページ全体で持たせたい状態(例えば、サイドバーの開閉状態)は、Environmentsレイヤーで持っています。

 HRMOS採用管理では原則として、Organismsまでの粒度のコンポーネントはUI Componentライブラリ側で持たせ、Ecosystemsに関してはいわゆるContainer Componentとして各Angularアプリケーション側で実装するアプローチを採っています。

複雑なComponentの実装には、Angularの公式ライブラリを活用する

 開発当初は多数のサードパーティAngularライブラリを入れてトライ&エラーを繰り返しましたが、現在ではほぼAngular teamが開発しているAngular Material & Angular Component Development Kit(CDK)をベースに、HRMOSオリジナルのスタイルを反映しています。

 Angular CDKは、カスタムUIコンポーネントを作るための根幹となるものです。一言で言えば、UIライブラリを作るためのライブラリと言えます。

 例えばOverlayというコンポーネントは、画面上に別のコンポーネントを重ねて表示するために必要な機能がCDK側で実装・提供されているため、ModalやPopoverといった類のコンポーネントでは、「表示/非表示の制御」と「HRMOSのデザインレギュレーションに沿ったスタイリング」を実装するだけで済むようなるため、開発工数の短縮ができます。

 年に2回あるAngularのメジャーバージョンアップになるだけ早く追従していきたいこと、各コンポーネント単位でユニットテストが記述されており高い品質が担保されていることも、Angular Material/CDKを採用した理由となりました。

リリース作業にかかる負担を減らしながら、頻繁にリリースできる仕組み

 開発中のUI Componentsライブラリを実際のAngularアプリケーションに導入すると、コンポーネントに持たせるパラメーター(@Input アノテーション。Reactでいうpropsに相当するもの)が足りず、想定していたインタラクションが実装できなかったり、実装が不完全で不具合になることがありました。

 ある意味UIコンポーネントを分離したがゆえの弊害ではありますが、この問題を逆手に捉え、頻繁にリリースできる仕組みを作ることにしました(リリースするとはいってもgit tagでバージョン番号のタグをセットし、npm publishするだけです)。

 UI Componentsライブラリをnpm publishした後は、Angularアプリケーション側のpackage.jsonに新しいバージョン番号をセットしてnpm installすることで、最新のコンポーネントが利用できる流れになっています。

 頻繁にリリースが行われると、Angularアプリケーション側の開発を行うエンジニアはCHANGELOG(変更履歴)を見たくなるのは当然のことでしょう。とはいえCHANGELOG.mdファイルを毎回記述するのも面倒なものです。この負荷をなるべく軽減したい想いがあったため、standard-versionを導入しました。

 standard-versionは、gitのcommit logを元に、CHANGELOG.md(変更履歴)の自動生成と、次のバージョン番号を自動的に付けてくれるツールです。git commit時にCommit Message Guidelineに準拠したコミットメッセージを記述する必要がありますが、リリースの際にドキュメントを作る手間が省けるメリットの方が大きいことから、導入を決めました。

次のページ
UI Componentsライブラリを開発したことによるメリット

この記事は参考になりましたか?

BizReach Tech Blog連載記事一覧

もっと読む

この記事の著者

浅井 雅彦(あさマック)(株式会社ビズリーチ)(アサイ マサヒコ)

大御所芸能人を抱える芸能事務所勤務という異色の経歴をもち、その後大手のWeb制作企業にて、ナショナルクライアントの大規模なWeb制作を行う。自社のサービス開発でのやりがいを求め2015年にフロントエンドエンジニアとしてビズリーチに参画。https://twitter.com/mixplace

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/11169 2018/12/06 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー