2
0

自作RailsアプリをNuxt3 でMPA化してみた

Last updated at Posted at 2023-01-26

はじめに?

自作モノリスRailsアプリを Rails(バックエンド) +
Nuxt3(フロントエンド)、に分割して、MPA化
してみました。

Easel

簡易画像ビューア。

ユーザー登録/ログイン/ログアウト機能、画像アップロード機能、
タグ付け機能、コメント機能、検索機能をもちます。

Nuxt3フロントエンド

Vue.js3 のAPIは Composition API を全面採用しています。

基本、旧フロントエンド(Rails)のパーシャルViewを(レイアウトや
機能については)そのままVue.jsのSFCに書き換え、UIコンポーネント
化しています。

利用技術

利用NPMパッケージ

入力バリデーション: Vuelidate
国際化(i18n): Vue i18n + Nuxt I18n
通知: Vue Sonner
カレンダー: VCalendar
ページング: vuejs-paginate-next

... etc

Railsバックエンド

WEB API と 管理画面(Rails Admin)で構成。

Rails7.1 + PostgreSQL。

※ Rails Adminについてはカスタマイズしていません。
(RailsAdminサイドでModelのdefault_scopeの無効化は
行なっています。)

利用技術

DBサーバー: PostgeSQL
ストレージサーバー: MinIO
NoSQLキー/バリュー・ストア: Redis

利用Gem

ログイン認証: sorcery + sorcery-jwt
画像アップロード: Shrine
タグ: ActsAsTaggableOn
論理削除: Discard
ページング: Pagy
UIのコンポーネント化: ViewComponent
JSONシリアライザ: JSON:API Serialization Library
(簡易)管理機能: RailsAdmin
テスト: RSpec
... etc

旧フロントエンド(Rails)

Railsバックエンドと一体化したモノリス。

Hotwire(Stimulus + Turbo)、部分的に Vue.js3 を採用。

履歴

  • Rails本体:
     5.2 → 6 → 7.0 → 7.1 と、バージョンアップを経てきています。

  • Railsまわり:
     アップローダの移行: Refile → Shrine
     ストレージの変更: プロジェクト内 → MinIO (AWS S3互換)
     ページングの変更: Kaminari → Pagy

  • RailsのJS/CSSまわり:
     Sprockets → Sprockets + Webpacker (on Node.js) →
     Sprockets + esbuild & sass (on Node.js) →
     Propshaft + esbuild & sass (on Node.js)
     (jsbundiling-rails + cssbundling-rails)

  • JSバンドラ
     Yarn → PNpm
     (jsbundling-rails 1.3.0以降 & cssbundling-rails 1.4.0以降
     必要)

  • JSまわり
     旧Railsフロントエンド:
     Vue.js 2 → 3
     JavaScript → TypeScript

  • DBまわり
     MySQL → PostgreSQL

  • CSSまわり
     Bootstrap 4 → 5

最後に

Nuxt3いいよ、Nuxt3!

上記アプリのMPA化に掛かった期間はちょろちょろ作成で数週間。
(初めての Nuxt3 アプリ作成、Nuxtを触るのも初めて。)

React / Next.js / Remix で 数週間で RailsアプリをSPA
or MPA化 する のは、今のところ、自分には無理... と、
以前、書いていましたが、面倒くさがらなければ、今なら時間を
掛ければできそうです、でも、面倒くさいので、しません、
ハマりどころもありそうなので...。

コードの解説は書きません。

コードは、全てを識っている(嘘?です、書いてみただけです)。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0