Gs9gxzlm

2019-04-02 tagucchCreated on 2019-04-02 by tagucch

    なんかたまにnippo覗いたりするんですけど、ちゃんと毎日書いてる人いてすごいえらいなと思ってます。
    新年度始まったし久々になんか書いてみようかなと思って書いています。

    弊社のプロダクトはサーバーとiOS、Android、Webの三つのクライアントがあって、自分は今のプロジェクトでWeb側をいじっています。
    サーバーはクライアントに対してAPIを提供するアプリケーションで、Railsで作られています。
    iOSとAndroidはそのサーバーとJSONでやりとりしているんですけど、Webだけちょっと特殊で、Web側のリポジトリにもRailsのアプリケーションが存在します。
    サーバー側のRailsとWeb側のRailsがやりとりして、Web側のRailsがViewをレンダリングしているんですけど、このWeb側のRailsではwebpackerというGemを使ってJSをバンドルしています。
    webpackerはRailsのコンテキストでWebpackをラップした感じのGem(という認識)なんですが、こいつがつらいな〜と思っているのでちょっとそれを書こうかなと思います。

    そもそもこの「Web側のRails」というアーキテクチャがおかしくて、単純にSPAで作った上でビジネスロジックも含めてJSに寄せてしまえばよかったんですけど、まあ自分が入社した時点で既にこうやって作られていたものなので仕方がないと言えば仕方がないですね。
    APIサーバー ⇔ Web側サーバー ⇔ クライアント(ブラウザ)という感じの状況なんですけど、すごいめちゃくちゃ良く言うとBFFサーバー的なものとも言えなくもないみたいな感じです。このWeb側のサーバーに、SSRの機構とドメインロジックがうまいこと詰め込めればいいんですけど、まあそううまい話なんてあるわけなくて、ロジックはJSとRailsに分散しています。
    APIサーバーへのリクエストとそのレスポンスも、Web側のRailsとJSと両方で行っていて、どちらでリクエストを行っているとこういう意味付けです、というのもないので単にバラバラです。

    で、まあそういう経緯もあってSPAにしたいというちょっと特殊な事情なんですけど、こういった事情がなくても単にサーバーとクライアントが一緒くたになってRailsのビューテンプレートにJSのコンポーネント埋め込むのはつらいなという気持ちです。
    slimというビューテンプレートにRubyのコードを埋め込めるHTMLみたいな形でビューを書いていて、JSのコンポーネントを呼びだしたい箇所でreact_componentメソッド(今回はreact_on_railsというGemを使っています)から該当コンポーネントを呼び出します。引数にpropsを渡すこともできます。
    ReactとRailsが繋がっていて、Rails側からpropsを渡せるのはいいのですが、それをやると利用しているMobX(軽量Redux的なライブラリです)のデータの流れとは別の口からデータが入ってくるので、複雑性が増します。つらいです。

    webpackerはwebpackをRailsでラップしたGemなんですが、Webpackのconfigの書き方を覚えなくてもいいと思ったらそうではなく、今度はwebpacker独自のconfigの書き方を覚えなくてはいけないので、とくに楽なことはないです。
    また、webpackerやreact_on_railsなどのパッケージをラップしていると、どうしても新しいバージョンに追従するのが難しい(npmで新しいバージョンが出てから、それに追従して更新したGemをRubyGemsに出すことでようやくバージョンが上げられるが、そんな頻繁にバージョンが上がるわけはない)ので、古めのバージョンのJSを使ってしまいがちというのもあります。つらいです。

    つらい話ばかり書いてすいませんでした。
    フロントエンドとバックエンドはなるべく疎結合にして、それぞれの責務を明確にした上で開発を進めたほうがエンジニアは幸せになる気がしています。
    弊社にはフロントエンドエンジニアという職種がなく、サーバーサイドエンジニアがViewまで含めた開発を行っている(別部署に例外な方はいますが)ので、やはりフロントエンドとバックエンドを明確に分け、アプリケーションとしての責務を分散させ、それぞれに専門のエンジニアをつけたほうが良い気がしています。
    先日弊部署のエンジニアチームで弊社開発部の今後について話したのですが、Webフロントエンドに関しての話が結構出てきたので、もっとフロントエンドを強化する体制ができたらいいなと切に願っています。また、そういう体制ができたら自分もそっち側に行きたいですね。