2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

自作RailsアプリをNuxt3 でSPA(SSRあり)化してみた

Last updated at Posted at 2023-01-26

はじめに?

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

現在、Nuxt4にアップデート済み。

Easel

簡易画像ビューア。

機能

・ユーザー登録/ログイン/ログアウト/ユーザープロフィール編集
・画像一覧/画像登録(アップロード、タグ付け)
・画像へのコメント(投稿/一覧/編集/削除)

Nuxt4フロントエンド

Vue.js3 のAPIは Composition API を全面採用。

旧アプリ(Rails)のパーシャルViewを(レイアウトや機能については)そのままVue.jsのSFCに書き換えてUIコンポーネント化してから、変更しています。

利用技術

利用NPMパッケージ

レイアウト: Tailwind CSS v4 + daisyUI v5
入力バリデーション: Regle
国際化(i18n): Vue i18n + Nuxt I18n
通知: Vue Sonner
カレンダー: VCalendar
ページング: vuejs-paginate-next
Googleログイン: Vue3 Google Sign-in
WYSWYGエディタ: Vue Quilly (Quill2)
画像拡大表示: GLightbox、Photoswipe
... etc

Railsバックエンド

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

Rails8.0 + PostgreSQL。

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

利用技術

DBサーバー: PostgreSQL
ストレージサーバー: MinIO (Amazon S3互換)
NoSQLキー/バリュー・ストア: Valkey (Redis互換)(Session Store用)

利用Gem

ログイン認証: devise + devise-jwt
画像アップロード: Shrine
タグ: ActsAsTaggableOn
論理削除: Discard
ページング: Pagy
UIのコンポーネント化: ViewComponent
JSONシリアライザ: Alba
(簡易)管理機能: RailsAdmin
テスト: RSpec
JSモジュールバンドラ: Vite Ruby (vite_rail)
画像プロキシ: imgproxy.rb
... etc

利用NPMパッケージ

レイアウト: Tailwind CSS v4 + daisyUI v5
... etc

旧アプリ(Rails)

バックエンドとフロントエンドが一体化したモノリス。

Hotwire(Stimulus + Turbo)、
画像詳細ページのコメント一覧/投稿/編集/削除機能に
Vue.js3 を採用。

利用Gem

ログイン認証: devise
画像アップロード: Shrine
タグ: ActsAsTaggableOn
論理削除: Discard
ページング: Pagy
UIのコンポーネント化: ViewComponent
JSONシリアライザ: Alba
(簡易)管理機能: RailsAdmin
JSモジュールバンドラ: Vite Ruby (vite_rail)
画像プロキシ: imgproxy.rb
... etc

利用NPMパッケージ

レイアウト: Tailwind CSS v4 + daisyUI v5
... etc

履歴

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

  • Railsまわり:
     アップローダの変更: Refile → Shrine
     ストレージの変更: プロジェクト内 → MinIO (AWS S3互換)
     ページングの変更: Kaminari → Pagy
     JSONシリアライザの変更: JSON:API Serialization Library → Alba
     ログイン認証の変更:Sorcery → devise

  • 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) →
    Propshaft + Vite (vite_rails)

  • JSバンドラ
     Yarn → pnpm

  • JSまわり
     旧Railsフロントエンド:
     Vue.js 2 → 3
     JavaScript → TypeScript
     Luminous → baguetteBox.js → GLightbox
    Nuxtフロントエンド:
     Nuxt3 → Nuxt4
     VueQuill(Quill1) → Vue Quilly(Quill2)
     Vuelidate → Regle

  • DBまわり
     MySQL → PostgreSQL

  • NoSQLキー/バリュー・ストアまわり
     未導入 → Redis → Valkey

  • 画像プロキシ
     未導入 → imgproxy

  • CSSまわり
     Bootstrap 4 → 5 → Tailwind CSS v4 + daisyUI v5

スクリーンショット

画像一覧

(未ログイン)
screencapture-localhost-3030-2025-07-21-06_11_40.png
(ログイン済み)
screencapture-localhost-3030-2025-07-21-06_12_55.png

検索条件

Easel 2025-07-21 06-24-26.png

ログイン

screencapture-localhost-3030-2025-07-21-06_25_07.png

ユーザー登録

screencapture-localhost-3030-2025-07-21-06_26_01.png

ユーザープロフィール

(メールアドレス&パスワードでのログイン)
screencapture-localhost-3030-frames-61-2025-07-21-06_40_03.png

(Googleログイン)
screencapture-localhost-3030-2025-07-21-06_27_32.png

ユーザープロフィール編集

(メールアドレス&パスワードでのログイン)
screencapture-localhost-3030-2025-07-21-06_28_37.png
screencapture-localhost-3030-2025-07-21-06_28_58.png

(Googleログイン)
screencapture-localhost-3030-2025-07-21-06_29_37.png

画像アップロード

screencapture-localhost-3030-frames-new-2025-07-21-06_30_16.png

画像詳細

(ログイン済み)
screencapture-localhost-3030-frames-61-2025-07-21-06_31_56.png
screencapture-localhost-3030-frames-61-2025-07-21-06_32_42.png

(未ログイン)
screencapture-localhost-3030-frames-61-2025-07-21-06_33_15.png

画像プロフィール編集

screencapture-localhost-3030-frames-61-edit-2025-07-21-06_33_46.png

最後に

Nuxt3いいよ、Nuxt3!

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

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

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

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

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?