$30 off During Our Annual Pro Sale. View Details »

電話を切らさない技術 電話自動応答サービスを支える フロントエンド

電話を切らさない技術 電話自動応答サービスを支える フロントエンド

2024/11/23
JSConf.jp 2024
https://jsconf.jp/2024/talk/ivry/

こちらで登壇した際の資料です。

sagawa / barometrica

November 23, 2024
Tweet

More Decks by sagawa / barometrica

Other Decks in Technology

Transcript

  1. ⾃⼰紹介 佐川 善彦(さがわ よしひこ) Software Engineer クライミング‧DJ 趣味 2013 メーカーに新卒⼊社、産業機器を設計

    2019 SWエンジニアに転向、受託開発 2023 IVRyに⼊社、Frontend主軸に⾃社開発 @barometrica
  2. ブラウザ通話を⽀えるフロントエンド:接続の維持 • 複数ページにまたがる共通コンポーネントを Layout として切り出し • ページごとに Layout 指定 •

    同じ Layout の画⾯に遷移する際、 共通コンポーネントを再レンダリングさせない Layout Pattern Header Page1 Header Page2 Header Page3
  3. ブラウザ通話を⽀えるフロントエンド:接続の維持 export function Layout({ children }) { return ( <>

    <Header /> <main>{children}</main> </> ) } components/Layout.tsx export function Page1() { return ... } Page.getLayout = function getLayout(page) { return <Layout>{page}</Layout> } pages/page1.tsx Header Page1 Layout Layout Pattern
  4. ブラウザ通話を⽀えるフロントエンド:接続の維持 • Layout に切り出すことでページ操作による通話処理への影響を排除 ◦ 各画⾯の開発時の通話処理への考慮事項も削減 • ブラウザ通話の使⽤可否も Layout の呼び分けで対応可能に

    Layout に通話処理を切り出して接続状態を保持 Page1 Page2 Page3 CallConainer ‧通話処理 ‧接続保持 ‧... CallConainer ‧通話処理 ‧接続保持 ‧... CallConainer ‧通話処理 ‧接続保持 ‧...
  5. ブラウザ通話を⽀えるフロントエンド:接続の維持 Page1 pages/page1.tsx components/LayoutForCall.tsx export function LayoutForCall({ children }) {

    return ( <CallContainer> {children} </CallContainer> ) } export function HogePage() { return ... } HogePage.getLayout = function getLayout(page) { return <LayoutForCall>{page}</LayoutForCall> } LayoutForCall CallConainer ‧通話処理 ‧接続保持 ‧... Layout に通話処理を切り出して接続状態を保持
  6. • 複雑さの要因 ◦ 外部サービス(Twilio)の SDK が React ⽤に作られていない ◦ 保持すべき状態の数が多い

    • 複雑さによるリスク ◦ 何か不具合があった場合の影響範囲の特定が難化 ◦ 開発の属⼈化 ◦ 機能改善の速度低下 ブラウザ通話を⽀えるフロントエンド:メンテナンス 通話ロジックは複雑になりやすい 保守性を担保したい : 凝集性‧結合性を守りたい
  7. ブラウザ通話を⽀えるフロントエンド:メンテナンス features ディレクトリに通話ロジックを集約 • ただディレクトリに集約しただけでは意図しない形で使われる危険性あり ◦ → Linter のカスタムルールで凝集性‧結合性を担保 .

    ├── src │ ├── features │ │ ├── call │ │ │ ├── index.ts │ │ │ ├── components │ │ │ │ ├── CallContainer │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── hooks.ts
  8. ブラウザ通話を⽀えるフロントエンド:メンテナンス Linter で意図しない外部アクセスを制限 const generateFeatureAccessRules = () => fs .readdirSync(path.join(__dirname,

    'src', 'features'), { withFileTypes: true, }) .filter((dirent) => dirent.isDirectory()) .flatMap((dirent) => [ { module: `src/features/${dirent.name}/**/*`, allowReferenceFrom: [], allowSameModule: true, }, { module: `src/features/${dirent.name}/index.[jt]s{,x}`, allowReferenceFrom: [''], }, ]) .eslintrc.js • 指定したコンポーネントのみ利⽤できるようにして保守性担保 export { CallContainer } from './components/CallContainer' export { CallConfirmModal } from './components/CallConfirmModal' ... features/call/index.ts features ディレクトリ直下の index.ts で export したもののみ ディレクトリ外から参照可
  9. • 正式リリースから4年、プロダクト規模も開発陣も拡⼤の⼀途 • エンジニアの数は3年で 2名から34名へ • 導⼊業界は 94/99 業界に拡⼤ =

    解決したい課題も拡⼤ ◦ → これから①:フロントエンド基盤改善 ◦ → これから②:新機能開発 IVRy の現状 IVRy は急拡⼤のまっただ中 ※⽇本標準産業分類(令和5年)の中分類99業種をもとに計測
  10. IVRy のこれから • リファクタリング ◦ 歴史的経緯による「割れ窓」を直していきたい ◦ 誰でもフロントエンドを触りやすい環境にしていきたい • ⾃動テスト

    ◦ ⼈⼒の QA に頼っている状況 ◦ ブラウザ通話の振る舞いも⾃動でテストしていきたい • パフォーマンス ◦ 最近だとウェブフォント最適化とか • アクセシビリティ • デザインシステム • … これから①:フロントエンド基盤改善
  11. IVRy のこれから これから②:新機能開発 通話相⼿ ⼀次受け+保留 転送先 • 例1: 保留転送 ◦

    さらに複雑化する通話ロジックを いかにシンプルに保つか? ◦ 保留時のUXはどうあるべきか? • 例2: FAX ◦ 「FAXの当たり前」を ブラウザでどう提供するか? ◦ 当たり前をどう超えていくか? FAX相⼿
  12. まとめ • ブラウザ通話で⼤事なこと ◦ 「つながって当たり前」を提供すること • ブラウザ通話を⽀えるフロントエンド ◦ Layout に通話処理を切り出すことで

    画⾯操作の影響なく接続を維持することが可能に ◦ 複雑な通話ロジックを features ディレクトリに集約、 また Linter によるアクセス制御で構造的に保守性を担保 • IVRy のこれから ◦ 急拡⼤に伴い新機能開発‧基盤整備などやっていき!