20
フフフフフフフフ GraphQL フフフフフフ 1

フロントエンドで GraphQLを使った所感

  • Upload
    chao-li

  • View
    44

  • Download
    0

Embed Size (px)

Citation preview

Page 1: フロントエンドで GraphQLを使った所感

フロントエンドでGraphQLを使った所感

1

Page 2: フロントエンドで GraphQLを使った所感

自己紹介

名前

 李 超( 31)

経歴

中国上海出身。 2008年来日、 2015年 11月サイバーエージェントに入社。

職種

フルスタック修行中のフロントエンジニア。

広告関連システムの管理画面や SDKの開発を担当している。2

Page 3: フロントエンドで GraphQLを使った所感

目次

・ GraphQLを導入した理由

・実際使った時の問題

・現時点の改善案

・一フロントエンジニアとしての感想

3

Page 4: フロントエンドで GraphQLを使った所感

GraphQLを導入した理由

・柔軟性

スキーマさえ定義すれば好きな組み合わせで取れる。

・可読性

JSONっぽい構文なので、直感的でわかりやすい。

・技術的なチャレンジ

何より新しい技術であること。

4

Page 5: フロントエンドで GraphQLを使った所感

・フロント

AngularJS   1.5.X

・サーバ

Scala    + Sangria

5

Page 6: フロントエンドで GraphQLを使った所感

実際使った時の問題点

・クエリ変換時に罠が多い

・ jsファイルがとにかく重い

・コンソールでデバッグしづらい

・サーバ側で処理の重さが把握しづらい

6

Page 7: フロントエンドで GraphQLを使った所感

クエリ変換時の罠が多い

const str = ‘abcde’;  => `strParam: ”${str}”`

const arr = [1, 2, 3]; => `arrParam: [${arr}]`

const enum = { RED: 0, GREEN: 1 };   ではなく

const enum = { RED: ‘RED’, GREEN: ‘GREEN’ };   じゃないと

 ‘求められているのは enumParam: RED’

‘enumParam: 0’は決して許されない

const obj = { a: 1, b: 2 }; => `${JSON.stringify(obj)}`   orz...

String

Array

Enum

Object7

Page 8: フロントエンドで GraphQLを使った所感

jsファイルがとにかく重い

 短い方 =>

 長い方 =>

8

Page 9: フロントエンドで GraphQLを使った所感

似ているクエリは山ほどある!

すべては jsファイルに入っている!

それは重いよね。。。

更にクエリを最適化すると、バリエーションも増えるので、

もちろん更に重くなる。。。

9

Page 10: フロントエンドで GraphQLを使った所感

コンソールでデバッグしづらい

こちらはとある編集画面のリクエスト一覧

すべてが gqlへの postなので、どれが何をするためのクエリはわからない><

途中でさすがに我慢できなくなり、 _getLoginUserみたいな query stringを目印としてつけたけど。。。

10

Page 11: フロントエンドで GraphQLを使った所感

うん。。。やっぱりわからん。。。

これは人が読めるものではない。。。

中身を見てみると

11

Page 12: フロントエンドで GraphQLを使った所感

サーバ側で処理の重さが把握しづらい

ちょっと極端な例をあげると

まず、下記のような関係があると

class has many students 

student belongs to class

もちろん、親から子、子から親は取れるようにスキーマを定義した

とすると。。。12

Page 13: フロントエンドで GraphQLを使った所感

class { students }   が投げられる => 想定内だと

class { students [{ class }] }   も投げられる => まあ、大丈夫だろ

classes [{ students [{ class }] }]   も投げられる => あれ?ちょっと。。。

 実際はフロントで上記のように好きな組み合わせで投げられる => (@_@);;

「やはりフロントは処理の重さを理解した上で投げましょ」

という属人的なものが出てきてしまう13

Page 14: フロントエンドで GraphQLを使った所感

現時点の改善案(フロント)

・クエリに variablesを利用とセグメント化

・ nodejsの中間サーバを用意し、 GraphQLをすべて中間サーバに移動

・クライアントとサーバのやり取りを RESTに戻す

 14

Page 15: フロントエンドで GraphQLを使った所感

15

Page 16: フロントエンドで GraphQLを使った所感

・ソース記述量が増えるが、クエリ文字列への変換は variablesの型宣言により、小細工をしなくて済む

・マスターデータは使う時基本同じ形にしているのでセグメント化をし、メンテナンス性がよくなる

・使う場面によってほしいカラムが変わるものはセグメント化しない。

16

Page 17: フロントエンドで GraphQLを使った所感

client nodejs resourceserver

request

mergedresponse

merged request 1

merged request 2

response1

response2

GraphQLを nodejsに移動し、 RESTに戻す

17

Page 18: フロントエンドで GraphQLを使った所感

現時点の改善案(サーバ)

色々試してくれたそうだけど、結果 GraphQLをやめることになった

18

Page 19: フロントエンドで GraphQLを使った所感

一フロントエンジニアとしての感想

・ GraphQLでフロントが幸せになったことはない

・ GraphQLには向き不向きがある

向き : インスタやタイムラインなどクエリのバリエーションが少ないもの

不向き : 広告関連の管理画面などテーブル構造が複雑で、クエリのバリエーションが多いもの

・ GraphQLの誕生によって RESTが消えることはないと思う

19

Page 20: フロントエンドで GraphQLを使った所感

ご清聴ありがとうございました!

20