Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Railsで作ったサービスを段階的にNext.js+GraphQLに移行してみる
Search
Tomohiro Ikeda
March 23, 2021
Programming
1
1.2k
Railsで作ったサービスを段階的にNext.js+GraphQLに移行してみる
Tomohiro Ikeda
March 23, 2021
Tweet
Share
Other Decks in Programming
See All in Programming
Асинхронность неизбежна: как мы проектировали сервис уведомлений
lamodatech
0
1.3k
盆栽転じて家具となる / Bonsai and Furnitures
aereal
0
1.9k
混沌とした例外処理とエラー監視に秩序をもたらす
morihirok
13
2.3k
ecspresso, ecschedule, lambroll を PipeCDプラグインとして動かしてみた (プロトタイプ) / Running ecspresso, ecschedule, and lambroll as PipeCD Plugins (prototype)
tkikuc
2
1.9k
非ブラウザランタイムとWeb標準 / Non-Browser Runtimes and Web Standards
petamoriken
0
430
週次リリースを実現するための グローバルアプリ開発
tera_ny
1
1.2k
どうして手を動かすよりもチーム内のコードレビューを優先するべきなのか
okashoi
3
870
いりゃあせ、PHPカンファレンス名古屋2025 / Welcome to PHP Conference Nagoya 2025
ttskch
1
180
Запуск 1С:УХ в крупном энтерпрайзе: мечта и реальность ПМа
lamodatech
0
950
Beyond ORM
77web
11
1.6k
各クラウドサービスにおける.NETの対応と見解
ymd65536
0
250
EC2からECSへ 念願のコンテナ移行と巨大レガシーPHPアプリケーションの再構築
sumiyae
3
590
Featured
See All Featured
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
49
2.2k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
For a Future-Friendly Web
brad_frost
176
9.5k
Code Reviewing Like a Champion
maltzj
521
39k
Visualization
eitanlees
146
15k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.5k
jQuery: Nuts, Bolts and Bling
dougneiner
62
7.6k
GraphQLとの向き合い方2022年版
quramy
44
13k
Raft: Consensus for Rubyists
vanstee
137
6.7k
A designer walks into a library…
pauljervisheath
205
24k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Transcript
Railsで作った個⼈サービスを 段階的にNext.js+GraphQLに移⾏してみる 株式会社リスタ @mikeda
今⽇の話 • Railsで作った既存サービスをNext.js+GraphQL化したい • 出来れば開発を⽌めずに少しづつ段階的に移⾏したい • 個⼈検証⽤サービスで試してみた という話をします。
⾃⼰紹介 • @mikeda • 株式会社リスタ CTO
Next.js化したいモチベーション • エンジニアにWEBもアプリも両⽅みてもらいたい • UX改善に興味があるエンジニアを採⽤したい
エンジニアにWEBもアプリも両⽅みてもらいたい
リスタのサービスと使⽤技術 • WEB • JOBLIST / JOBLIST派遣 : Rails •
JOBLISTマガジン : Rails • アプリ • JOBLIST Collect : iOS/Swift, Android/Kotlin • 新規サービス : React Native(未リリース)
WEBとアプリ両⽅やるのがキツイ • WEB・API : Rails • iOS : Swift •
Android : Kotlin • 全部やれるエンジニアはかなりレア
でも担当を分けたくない • 社員のエンジニアが1〜3⼈ • 開発リソースを柔軟に振り分けたい • ベンチャーだから⽅向性はどんどん変わる • 今⽉までは全⼒WEB、来⽉から全⼒でアプリやりたい! •
例えばどちらかしか出来ないエンジニアが1⼈ずつだと、常に 50%/50%でしか開発リソースの配分が出来ない
新規アプリをReact Nativeで作った • React Native + expo + TypeScript •
APIはRailsでREST API ※ コロナ影響でリリース延期中😭 • WEBのエンジニアでもかなりやりやすい • JSでコーディング • スタイルはCSSで書く
全体的にReactによせたい • WEBフロントエンド : React • アプリフロントエンド : React Native
• バックエンド(共通API) : GraphQL? • エンジニアみんなが全てのサービスをみれるようにしたい!
UX改善に興味があるエンジニアを採⽤したい
Railsエンジニアで募集をかけると • サーバーサイドのロジック実装が好き!(できればCSSとか書き たくない)という⼈がいっぱいくる • でもベンチャーではサービスのUX(ユーザー体験)を改善した い!という⼈がほしい
フロントエンドを厚くすると募集傾向変わる? • Railsのフロントエンドは薄い • ビジネスロジック・データ処理は基本サーバーサイド • サーバーサイドに興味のある⼈が来る • React化してフロントエンドを厚くする •
ビジネスロジック・データ処理がフロントエンドに寄る • フロントエンドに興味のある⼈がくる? • UX改善が進みやすくなる?(仮説)
既存のRailsアプリを乗せ換えられるか?
既存Railsアプリを乗せ換えたい • サービスの開発を⽌めずに少しづつ乗せ換えたい • 開発⽌めるとビジネス影響が⼤きいし、プレッシャーにもなる • 開発期間の⾒積もりも難しい • RailsとReactで同じビューが併存しない形で移⾏したい •
ページ単位で移⾏していく、だとそうなってしまう • 両運⽤にするとたいへんだから • サーバー増やしたくない(費⽤をかけたくない)
検証⽤の個⼈サービスを作って試してみる
ざっくり⼿順 • Railsでざっくりサービス作成 • react-railsでビューを徐々にReactコンポーネント化 • RailsをGraphQLサーバー化 & データ取得をGraphQL化 •
Next.js + Vercelに切り替える • RailsはAPI(GraphQL)サーバーになる
関連技術を簡単に説明
React / TypeScript • 省略!
Next.js • Reactベースのフロントエンドフレームワーク • SSR/SSGでSEO・OGP対策出来る • ファイルベースのルーティング
SSR/SSG • SSR : サーバーサイドで動的レンダリング • SSG : サーバーサイドで静的HTML⽣成 •
SEO対策・OGP対応に
Vercel • Next.jsを簡単にデプロイ出来るホスティングサービス • GithubにPR作ったらプレビュー環境を⾃動⽣成 • masterマージしたら本番デプロイ • SSG、画像最適化などいい感じに対応してくれる •
無料でけっこう使える
GraphQL • 専⽤クエリで柔軟にデータの取り出しが出来るAPIサーバー
実際の移⾏作業
Railsでざっくりサービス作成
Railsで作った個⼈サービス • 鉄拳やろうよ.com • (最近「鉄拳7」という格ゲーにハマってます) • まだぜんぜんまともに動いてません • ちゃんとリリース&運⽤したい! •
業務(ゲーム)知識のあるエンジニア募集中! • 初期実装 • Rails / webpacker / typescript / stimulus / HAML / scss
react-railsでビューを徐々にReactコンポーネント化
こういうビューがあったとする パーシャル ビュー
react-railsでReactコンポーネント化 ビュー Reactコンポーネント データの受け渡し(jbuilder)
Reactコンポーネント化を進める
最終的にページ全体をコンポーネント化 ビュー Reactコンポーネント 省略!
react-rails補⾜ • SSRできる(今回は試してない) • プロパティはdata属性で渡される • 安易にto_jsonとかして事故らないように注意
graphql-rubyでRailsをGraphQLサーバー化
graphql-ruby • Railsでいい感じにGraphQLサーバーを実装できるgem
graphql-ruby : 型定義
graphql-ruby : クエリを定義
graphql-ruby : graphiqlで動作確認
graphql-codegenでTypeScript⽤のコード⽣成
graphql-codegen • GraphQLのSchemaからTypeScriptの型定義、クエリ実⾏⽤の React Hookを⾃動⽣成できる。
graphql-codegen : 設定ファイルを作る
graphql-codegen : GraphQLのクエリを書く
graphql-codegen : 実⾏する
graphql-codegen : TypeScriptの型が⽣成される
graphql-codegen : クエリからReact Hookも⽣成される
graphql-codegen : 補⾜ • 更新系クエリ(mutation)、Enum、Unionなどの型も作られる • GraphQLのFragmentを定義しておくとさらに便利 • SSGでapollo-client使えないのがちょっとつらい
APIアクセスをGraphQL化
APIアクセスをGraphQL化 ビューから渡すのやめて Reactコンポーネント側でデータ取得
APIアクセスをGraphQL化 : 補⾜ • この時点では全体共通のApp.tsxがないため、各ページごとに Apollo(GraphQLクライアント)を初期化する必要がある。 • SEO対策が必要なページはSSRする必要がある • 今回は検証サービスのため全てCSRで対応
Next.js + Vercelに切り替え
ページ遷移をNext.js仕様に • aタグをnext/linkのLinkタグでかこむ • jsでのページ遷移はnext/routerに
データ取得・更新を全てGraphQL化 • 残っていた箇所を切り替え
cssの移⾏ 既存のscssをApp.tsxでimportすればだいたいそのまま動く
メタタグの切り替え • next/headを使ってNext.js側で レンダリングするように変更
Vercel連携 • PRを作るとプレビュー環境が⾃動 で作成される • ⼀通り動作確認して問題なければ ドメイン切り替えで移⾏完了!
移⾏後の作業
CSS Modules化 • CSSをコンポーネントごとに分割してメンテナンス性・パフォーマンス向上 • コンポーネントごとに黙々と対応する
その他作業 • SSR / SSG / CSRの調整 • imgタグをnext/imageに変更 •
…
だいたい完了! • すごく⼤変でした
まとめと感想
まとめと感想 • React/TypeScript/GraphQLの開発体験はすごくよい • コード⾃動⽣成でサーバーサイドとフロントエンドの連携が楽 • 型チェックの安⼼感 • IDEでの補完・リファクタリングがかなりやりやすくなる •
移⾏はかなりたいへん • 挙動・パフォーマンスの考え⽅が⼤きく変わり覚えることが多い • ノウハウ無い状態で既存サービス載せ替えるのはかなりの覚悟が必要 • SEOとかOGPとか気にしなくてよければ多少楽できる
終わり • 質問以外でも • 「うちではこんな感じでやってるよ!」 • 「⾃分はこんな感じで移⾏したよ!」 • みたいな話あればぜひ聞きたいです!