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

Hatena Engineer Seminar #21 GraphQLでフロントエンドとバックエンドを分離する

magaming
September 08, 2022
1.8k

Hatena Engineer Seminar #21 GraphQLでフロントエンドとバックエンドを分離する

magaming

September 08, 2022
Tweet

Transcript

  1. Xslate の例 4 <div class="banners"> [% FOR banner IN banners

    %] [% IF banner.url %] <a href="[% banner.url %]"> <img src="[% banner.image_url %]" alt="[% banner.alt %]"> </a> [% ELSE %] <img src="[% banner.image_url %]" alt="[% banner.alt %]"> [% END %] [% END %] </div>
  2. なぜ GraphQL を使いたいか • Web でも GraphQL を使えば、アプリと実装 が一本化されて開発コストが下がるのでは? •

    Xslate の書き心地がイマイチなので、できれ ばフロントエンドの環境を刷新したい ◦ 型チェックが甘い ◦ linter/formatter が良いのが無い… 7
  3. フロントエンドの環境は? • 社内で実績のある Next.js + Apollo Client ? • しかし新たに環境を作るのはコストが高い…

    • 次のメディアのリリース日はもう決まってい るので、今から環境を作るのはスケジュール 的に厳しい… 10
  4. Web で GraphQL を使うとは • GraphQL に Web で必要な field

    を生やす • Perl で GraphQL を叩いて、帰ってきた結果 をテンプレートエンジンに渡す 12 Controller GraphQLで データ集める テンプレート エンジン Routing Render
  5. Before 13 sub top { my $banners = Giga::Service::Banner->banners; my

    $blog_entries = Giga::Service::Blog->entries; my $ranking = Giga::Service::Ranking->ranking; … # 集めたデータを Xslate に渡してレンダリング, 数が多いとその分記述が増える $c->render_html('top.html', banners => $banners, blog_entries => $blog_entries, ranking => $ranking, … ); };
  6. After 14 sub top { my $query = q| query

    { banners { imageUrl alt } } … |; # 様々なデータを集めるのが1つのクエリで簡潔に表現できる! my $result = Giga::GraphQL->execute_via_server($c, { query => $query }); $c->render_html('top.html', data => $result->data); # 結果をまるっと渡すのでスッキリ };
  7. 良かった点 • Web で GraphQL がいけそうと分かって、フ ロントエンドとバックエンドの分離を自信を 持って進められた • 次のメディアを開発するときに

    Next.js の環 境を作ったが、Web で必要な field はすでに 生やせていたので環境作りに注力できた • 16