Upgrade to Pro — share decks privately, control downloads, hide ads and more …

フロントエンドエコシステムで効率化する組織開発

okmttdhr
November 26, 2022

 フロントエンドエコシステムで効率化する組織開発

jsconf 2022

okmttdhr

November 26, 2022
Tweet

More Decks by okmttdhr

Other Decks in Programming

Transcript

  1. DMM プラットフォーム事業本部 ( 以下 PF) について 領域: 認証認可, 会員, 決済,

    不正対策, ポイントなど エンジニア数: 120 名以上 フロントエンドのプロダクト数: 40 以上 典型的なリクエスト数: 200~500 RPS
  2. PF におけるフロントエンドの課題 1. 変更容易性の低さ HTML/CSS を他部署に委託し PHP に組み込み ↓ フロントエンドに明るくない人が継ぎ足しで保守

    ↓ テストなし, コーディングスタイルもバラバラ ↓ 変更・リファクタ難易度高 ※`PHP = 悪` ではなく、私たちの場合はこういう状況になっていたという意図
  3. 例. Etsy のフロントエンドエコシステム 参考 The journey to fast production asset

    builds with Webpack Developing in a Monorepo While Still Using Webpack Mobius: Adopting JSX While Prioritizing User Experience Etsy’s Journey to TypeScript
  4. 例. Etsy のフロントエンドエコシステム 解決策 モノレポでの webpack のビルドを高速化・効率化 ( 自作ミドルウェアなど) PHP

    をベースとしたアプリケーションで JSX を SSR したビューを組み込み (Component Islands パターンと命名) TypeScript への移行と社内での教育
  5. PF におけるフロントエンドエコシステム 1. モノレポファースト 2. 共通パッケージ 3. デザインシステム Turtle DMM

    プラットフォームのフロントエンド開発を支えるエコシステム - DMM inside
  6. 1. モノレポファースト 技術スタックの統一 アプリケーションをすぐに開発可能に コマンドひとつ叩くだけでパッケージを作成 (Nx の generator を利用) モノレポでは、小さいパッケージを如何に簡単に作成できるかが重要

    アプリケーションは1 時間もかからずに開発可能な状態に Measure how long it takes for a developer to share a function between two applications. Only when it takes minutes, then folks will do it consistently. https://blog.nrwl.io/how-to- develop-react-apps-like-facebook-microsoft-and-google-bdcafcfbc9be ` `
  7. 1. モノレポファースト CI/CD モノレポにアプリケーションをつくると out of the box で CI/CD

    が稼働 テスト, ビルド, Lint, Storybook, VRT, Docker ビルド, デプロイ, など アプリケーションや開発チームが増えてもスケールする工夫 ( スケーラブル CI/CD with Nx モノレポ - Speaker Deck)
  8. 2. 共通パッケージ 例. ロギング SSR with Next.js の Node.js 環境のロギング

    各種マイクロサービスへと通信するいわゆる BFF としても
  9. 2. 共通パッケージ 例. ロギング マイクロサービスで標準化しているログ項目を満たしたい 標準化することで、複数のマイクロサービス間のログをアーカイブから検索・解析できる。リクエストごとに コンテキスト (Node.js でいうと async

    context) を保つ必要があり、単純にライブラリ( dd-trace ) を使うだ けでは満たせない アクセスログを出力したい APM でも見られるが、アーカイブしたい都合上アクセスログとして残したい ` `
  10. 2. 共通パッケージ 例. ロギング Next.js の Custom Server を使用 server.use(loggerWithContext);

    server.all('*', async (req, res) => { await handle(req, res); logger.accessLog(req, res); });
  11. 2. 共通パッケージ 例. ロギング 使うだけで最低限の可視性を担保 アプリケーション開発者は logger の仕組みを意識する必要は無い import {

    logger } from '@dmm-com/pf-node-logger'; export const getServerSideProps = () => { try { api.get('/api'); ... } catch (e) { logger.error(e); ... } }
  12. 3. デザインシステム Turtle 例. レスポンシブタイポグラフィ レスポンシブデザインにおける課題 PC 向けのフォントサイズが SP では大きすぎる

    複数のブレークポイントでデザインをつくるのはコストがかかる その上でもすべてのデバイスサイズで最適な見え方になるとは限らない
  13. 3. デザインシステム Turtle 例. レスポンシブタイポグラフィ /** * @param scale 各トークン

    (heading1, body1 など) の基準となる大きさ。単位は rem 。 */ const responsiveFontSize = (scale) => { return { /** * xl で拡大し始める */ fontSize: `calc( ${scale} * clamp(1rem, 1vw, 1.625rem))`, /** * sm, md, lg では拡大も縮小もしない */ [mediaQueries.lg]: { fontSize: `${scale}rem`, }, /** * xs から縮小し始める */ [mediaQueries.xs]: { fontSize: `calc( ${scale} * clamp(1rem / 1.125, 0.55rem + 1vw, 1rem))`, }, };
  14. 3. デザインシステム Turtle 例. レスポンシブタイポグラフィ /** * sm, md, lg

    では拡大も縮小もしない */ [mediaQueries.lg]: { fontSize: `${scale}rem`, }, /** * @param scale 各トークン (heading1, body1 など) の基準となる大きさ。単位は rem 。 */ const responsiveFontSize = (scale) => { return { /** * xl で拡大し始める */ fontSize: `calc( ${scale} * clamp(1rem, 1vw, 1.625rem))`, /** * xs から縮小し始める */ [mediaQueries.xs]: { fontSize: `calc( ${scale} * clamp(1rem / 1.125, 0.55rem + 1vw, 1rem))`, }, };
  15. 3. デザインシステム Turtle 例. レスポンシブタイポグラフィ /** * xl で拡大し始める */

    fontSize: `calc( ${scale} * clamp(1rem, 1vw, 1.625rem))`, /** * xs から縮小し始める */ [mediaQueries.xs]: { fontSize: `calc( ${scale} * clamp(1rem / 1.125, 0.55rem + 1vw, 1rem))`, }, /** * @param scale 各トークン (heading1, body1 など) の基準となる大きさ。単位は rem 。 */ const responsiveFontSize = (scale) => { return { /** * sm, md, lg では拡大も縮小もしない */ [mediaQueries.lg]: { fontSize: `${scale}rem`, }, };
  16. 3. デザインシステム Turtle 例. レスポンシブタイポグラフィ /** * @param scale 各トークン

    (heading1, body1 など) の基準となる大きさ。単位は rem 。 */ const responsiveFontSize = (scale) => { return { /** * xl で拡大し始める */ fontSize: `calc( ${scale} * clamp(1rem, 1vw, 1.625rem))`, /** * sm, md, lg では拡大も縮小もしない */ [mediaQueries.lg]: { fontSize: `${scale}rem`, }, /** * xs から縮小し始める */ [mediaQueries.xs]: { fontSize: `calc( ${scale} * clamp(1rem / 1.125, 0.55rem + 1vw, 1rem))`, }, };
  17. PF におけるフロントエンドエコシステムまとめ 1. モノレポファースト 2. 共通パッケージ 3. デザインシステム Turtle 変更容易性,

    開発効率, 拡張性 を底上げしていく⭐️ DMM プラットフォームのフロントエンド開発を支えるエコシステム - DMM inside