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

コンポーネントライブラリとして作る、ポータブルなデータ分析 / make data ...

コンポーネントライブラリとして作る、ポータブルなデータ分析 / make data analysis portable as a component library

データ分析β(社内通称: moana)は STORES の各プロダクトのデータを一元収集・分析し、オーナーさんに提供するプラットフォームです。 一方でこのデータを各プロダクトの管理画面上にも表示したいというニーズが高まっています。 そのために、データの取得と UI の表示をまるごと提供するウィジェット風のものを、コンポーネントライブラリのようにパッケージングしようとしています。

クロスフレームワークを実現するためのリアルタイム試行錯誤の様子をお伝えします。 様々な会社が集まった経緯のある STORES ならではの特色を感じていただければと思います。

Hisako Harada (tttttahiti)

October 03, 2024
Tweet

Other Decks in Programming

Transcript

  1. 「新しい」とは?
 ① 今までにはなかったさまだ。初めてだ。「 ―・い発 明」「―・い経験」 
 ② 従来のものとは違っている。旧来のやり方を改め ている。「 ―・い企画」「 ―・い考え方」 


    ③ できたばかりだ。できてからあまり日時が過ぎてい ない。「―・い洋服」「 ―・い法律」 
 ④ なまものが取れたばかりで,生き生きとしている。 新鮮だ。「 ―・い野菜」「 ―・い魚」
 7 出典: スーパー大辞林

  2. 「新しい」とは?
 ① 今までにはなかったさまだ。初めてだ。「 ―・い発 明」「―・い経験」 
 ② 従来のものとは違っている。旧来のやり方を改め ている。「 ―・い企画」「 ―・い考え方」 


    ③ できたばかりだ。できてからあまり日時が過ぎてい ない。「―・い洋服」「 ―・い法律」 
 ④ なまものが取れたばかりで,生き生きとしている。 新鮮だ。「 ―・い野菜」「 ―・い魚」
 8 出典: スーパー大辞林

  3. 「新しい」とは?
 ① 今までにはなかったさまだ。初めてだ。「 ―・い発 明」「―・い経験」 
 ② 従来のものとは違っている。旧来のやり方を改め ている。「 ―・い企画」「 ―・い考え方」 


    ③ できたばかりだ。できてからあまり日時が過ぎてい ない。「―・い洋服」「 ―・い法律」 
 ④ なまものが取れたばかりで,生き生きとしている。 新鮮だ。「 ―・い野菜」「 ―・い魚」
 9 出典: スーパー大辞林

  4. 「新しい」とは?
 ① 今までにはなかったさまだ。初めてだ。「 ―・い発 明」「―・い経験」 
 ② 従来のものとは違っている。旧来のやり方を改め ている。「 ―・い企画」「 ―・い考え方」 


    ③ できたばかりだ。できてからあまり日時が過ぎてい ない。「―・い洋服」「 ―・い法律」 
 ④ なまものが取れたばかりで,生き生きとしている。 新鮮だ。「 ―・い野菜」「 ―・い魚」
 10 出典: スーパー大辞林

  5. 「新しい」とは?
 ① 今までにはなかったさまだ。初めてだ。「 ―・い発 明」「―・い経験」 
 ② 従来のものとは違っている。旧来のやり方を改め ている。「 ―・い企画」「 ―・い考え方」 


    ③ できたばかりだ。できてからあまり日時が過ぎてい ない。「―・い洋服」「 ―・い法律」 
 ④ なまものが取れたばかりで,生き生きとしている。 新鮮だ。「 ―・い野菜」「 ―・い魚」
 11 出典: スーパー大辞林

  6. 「新しい」とは?
 ① 今までにはなかったさまだ。初めてだ。「 ―・い発 明」「―・い経験」 
 ② 従来のものとは違っている。旧来のやり方を改め ている。「 ―・い企画」「 ―・い考え方」 


    ③ できたばかりだ。できてからあまり日時が過ぎてい ない。「―・い洋服」「 ―・い法律」 
 ④ なまものが取れたばかりで,生き生きとしている。 新鮮だ。「 ―・い野菜」「 ―・い魚」
 12 出典: スーパー大辞林

  7. ネット
 ショップ
 ・
 レジ
 ブランド
 アプリ
 予約
 データ分析β
 
 


    
 
 根本の課題「クロスフレームワーク」 
 26 系
 系

  8. 根本の課題「クロスフレームワーク」 
 28 API
 ネットショップ 
 レジ
 ブランドアプリ 
 予約


    データ分析 β
 Request
 Response
 Install
 portable-moana
 React
 portable-moana
 Vue
 Install

  9. 根本の課題「クロスフレームワーク」 
 31 portable-moana
 widget
 API
 ネットショップ 
 レジ
 ブランドアプリ

    
 予約
 データ分析 β
 Request
 Response
 embed
 これ
 一個!
 <iframe />
  10. 根本の課題「クロスフレームワーク」 
 34 portable-moana
 Web Components
 API
 ネットショップ 
 レジ


    ブランドアプリ 
 予約
 データ分析 β
 Request
 Response
 Install
 これ
 一個!

  11. やってみよう Take.1
 • SSR できないのを実体験 
 ◦ 特にデータ分析 β は

    App Router なので一 筋縄じゃいかなそう 
 • ていうか Web Components で今出して るグラフとか再現できんの? 
 44 怪しい
 雲行き

  12. やってみよう Take.1 からのどうしよう
 45 Cookpad さんの
 React を Web Components

    で包んで Rails で使っている事例
 https://techlife.cookpad.com/entry/2022/12/29/090000
  13. ブランドアプリ 
 portable-moana
 web-components
 やってみよう Take.1 からのどうしよう
 46 wrap
 portable-moana


    react
 予約
 データ分析 β
 直接
 install
 ネットショップ 
 レジ
 包んだ方をinstall

  14. ブランドアプリ 
 portable-moana
 web-components
 まず React のコンポーネントライブラリを作る 
 51 wrap


    portable-moana
 react
 予約
 データ分析 β
 直接
 install
 ネットショップ 
 レジ
 包んだ方をinstall
 成功!

  15. import { createRoot } from "react-dom/client"; import { MoanaSampleButton as

    SampleButton } from "@heyinc/portable-moana-react"; import sanitize from "@heyinc/portable-moana-react/dist/assets/sanitize.css?inline"; import styles from "@heyinc/portable-moana-react/dist/assets/index.css?inline"; import { LitElement } from "lit"; import { customElement } from "lit/decorators.js"; @customElement("moana-sample-button") export class MoanaSampleButton extends LitElement { connectedCallback() { const domNode = document.createElement("div"); const shadow = this.attachShadow({ mode: "closed" }); shadow.appendChild(domNode); const sanitizeSheet = new CSSStyleSheet(); sanitizeSheet.replaceSync(sanitize); const styleSheet = new CSSStyleSheet(); styleSheet.replaceSync(styles); shadow.adoptedStyleSheets = [sanitizeSheet, styleSheet]; const root = createRoot(domNode); const label = this.getAttribute("label") || "ボタン"; root.render(<SampleButton label={label}></SampleButton>); } } declare global { interface HTMLElementTagNameMap { "moana-sample-button": MoanaSampleButton; } } 

  16. React コンポーネントライブラリを Web Components で包む
 1. shadowDOMを作る
 2. CSS を

    inline で読み込んで adoptedStyleSheets で shadowDOM にくっつける 
 3. react-dom でレンダリング 
 54
  17. ブランドアプリ 
 portable-moana
 web-components
 React コンポーネントライブラリを Web Components で包む
 56

    wrap
 portable-moana
 react
 予約
 データ分析 β
 直接
 install
 ネットショップ 
 レジ
 包んだ方をinstall
 作った!

  18. ブランドアプリ 
 portable-moana
 web-components
 Web Components ライブラリを Nuxt で使う
 59

    wrap
 portable-moana
 react
 予約
 データ分析 β
 直接
 install
 ネットショップ 
 レジ
 包んだ方をinstall
 難あり

  19. 仮説
 Web Components ライブラリを Nuxt で使う
 • SSR: true のときのみ発生

    
 ◦ @lit-labs/ssr では HTMLElement はエミュレートさ れてないから 
 60 Nuxt で SSR してるプ ロダクトないし 
 保留でいっか〜 

  20. クソデカ bundle size
 • react-dom を bundle せず依存関係にす る
 ◦

    使用側で react-dom のバージョン管理 が必要になる 
 • 軽量な Preact で置き換えられないか? 
 63
  21. クソデカ bundle size
 • react-dom を bundle せず依存関係にす る
 ◦

    使用側で react-dom のバージョン管理 が必要になる 
 • 軽量な preact で置き換えられないか? 
 68 難あり
 こっちで行く 

  22. これまで
 69 ブラウザで動か ない
 課題
 クロス
 フレーム
 ワーク 課題
 Web

    Components 
 やろう React と
 相性悪い React 版と Web Components ラップ版
 作ろう
 bundle size 
 がでかすぎる 課題
 Preact でレンダ リングしよ う 課題に次ぐ課題 
 取繕いに次ぐ取繕い 
 課題