Django+React+GraphQLでSPAを作ってみた感想
Django+React+GraphQLでSPA(なお1ページのみ)を作ってみた感想を書いていきます。なお、趣味グラマーなので仕事で使う観点では見ていません。あと認証処理も実装してないです。
今回の構成
サーバーはHerokuをつかいました。フロントエンドとバックエンドでサーバーを分けます。最初は一緒のサーバーから配信しようとしたんですけど、ルーティングが(ReactのルーティングとDjangoのが混ざって)めんどいので止めました。
使ったライブラリ
大まかな手順
リポジトリはここ
フロントエンド github.com
バックエンド github.com
つくったのはこれ
https://ararkblog.herokuapp.com/
良さみ
Pythonが便利
まじで声を大にして言いたいんですけど、JSのデータ操作辛すぎる!!!!。特にArrayお前だよ。意味分からん仕様しかないのでPythonを使うと感謝で泣ける。
データ操作が楽
Djangoのモデルが強力なので簡単にGraphQLのレスポンスを書ける。まじで軽く調べてみた感じ、Node系のwebフレームワークはDB操作ほとんど自分でやらなきゃいけない印象があるのでこの点は良い。
graphene-djangoに乗っかれば簡単にページネーションを実装できる。
graphiQLが強い
ブラウザ上でGraphQLのクエリを書いて実行できるgraphiQLっていうのがgraphene-djangoに同梱されてるんですけど、これが便利。簡単なテストをすぐ書ける。
まぁ多分graphiQLは他のツールでも使えると思いますが。
Djangoが管理画面を生成してくれる
Djangoがadminサイトを自動生成してくれるので、データ見てみたり、テストデータ適当に作ったりするのに便利です。他のフレームワークにもあるかどうかはわからない。無い印象。
つらみ
Pythonが動的型
最初Pythonやってた時は、動的型付けサイコー!って感じだったけど、Typescript触ってからは静的型付けサイコー!になったのでPython辛い。補完効かないのが一番つらい。mypy早く進化してくれ・・・。mypyがTypescript並になったらほんとに最強。
あとDjangoの慣習として、モジュールとかメソッドを文字列で指定して、ランタイムで動的に解決するってのがある*1。これをやられるとデプロイはできるけど特定のアクションを行って初めてエラーが出ることがあるので辛い。
文字列じゃなくて直接オブジェクトを指定するようになったりしないのかな?結構冗長になるけど。
ルーティングが辛い
上でもちょっと書いたけど、DjangoでReactRouterとか使おうとすると、DjangoのURLとSPAのURLが衝突するのでめんどくさい。/adminがDjangoのかSPAのURLなのか、判定が面倒くさい。
今回はDjangoとReactでサーバーを分けた。ホントは一緒のサーバーから配信したいけど、SPAのお作法的にはどうなんだろう。あんまりこれについて書いてある資料がみつからなかった。
これはNode系のフレームワークだと解決するのかな?未調査。
使わない機能がおおい
まぁこれはつらみではないけど、テンプレートとビューを使ってないので、大雑把に言って2/3の機能を使ってない。できればミニマムにいきたい。
Pythonの環境構築のベストプラクティスがない
Nodeの環境構築はyarnかnpmを使って簡単にできるけど、PythonはPipenvが死んだせいで戦国時代になりつつある。早く統一されてくれ・・・
結論
バックエンドをNodeにしてもDjangoにしても結局辛みはあるので使いやすい方でやろう。