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あり)化してみた

2
Last updated at Posted at 2023-01-26

はじめに?

自作モノリスRailsアプリを Rails(バックエンド) + Nuxt3(フロントエンド)、に分割して、SPA(SSRあり)化してから、開発継続中。

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

Easel

画像ビューア。

フロントエンド

バックエンド

Vesper

Vue.js/Nuxtベースのモデル駆動開発支援フレームワーク。

Easelのコードベースから分離。

1.0に向け、開発中。

機能

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

・レスポンシブ・デザイン(似非かも?)

スクリーンショット

画像一覧

未ログイン

resize_screencapture-01.png

ログイン済み

resize_screencapture-02.png

検索条件

resize_screencapture-03.png

ログイン

resize_screencapture-04.png

ユーザー登録

resize_screencapture-05.png

ユーザープロフィール

メールアドレス&パスワードでのログイン

resize_screencapture-08.png

Googleログイン

resize_screencapture-06.png

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

メールアドレス&パスワードでのログイン

resize_screencapture-09.png

resize_screencapture-10.png

Googleログイン

resize_screencapture-07.png

画像アップロード

resize_screencapture-15.png

画像詳細

ログイン済み

resize_screencapture-12.png

resize_screencapture-13.png

未ログイン

resize_screencapture-11.png

画像プロフィール編集

resize_screencapture-14.png

構成

フレームワーク
フロントエンド Nuxt4
バックエンド Rails8.1

Nuxt4フロントエンド

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

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

現在は、初期実装から、それなりに変わっています。

利用技術

利用NPMパッケージ

機能 NPMパッケージ
レイアウト: Tailwind CSS v4 + daisyUI v5
入力バリデーション: Regle
国際化(i18n) Vue i18n + Nuxt I18n
通知 Vue Sonner
カレンダー Vue Datepicker
ページング なし (独自実装)
Googleログイン Vue3 Google Sign-in
WYSWYGエディタ Tiptap
画像拡大表示 Photoswipe / GLightbox
... etc

Railsバックエンド

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

Rails8.1 + PostgreSQL。

※ Motor Admin Railsについてはカスタマイズしていません。

利用アプリ

機能 アプリ
DBサーバー PostgreSQL
ストレージサーバー MinIO (Amazon S3互換)
NoSQL/KVストア Valkey (Redis互換)(Session Store用)
画像プロキシ imgproxy

利用Gem

機能 Gem
ログイン認証 devise + devise-jwt
画像アップロード Shrine
タグまわり No Fly List
論理削除 Discard
ページング Pagy
UIのコンポーネント化 ViewComponent
JSONシリアライザ Alba
JSONパーサ/マーシャラー Oj
(簡易)管理機能 Motor Admin Rails
テスト RSpec
フロントエンドツール Rails Vite
画像プロキシ imgproxy.rb
... etc

利用NPMパッケージ

機能 NPMパッケージ
レイアウト Tailwind CSS v4 + daisyUI v5
... etc

旧バージョン(Rails)

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

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

利用Gem

機能 Gem
ログイン認証 devise
画像アップロード Shrine
タグまわり No Fly List
論理削除 Discard
ページング Pagy
UIのコンポーネント化 ViewComponent
JSONシリアライザ Alba
JSONパーサ/マーシャラー Oj
(簡易)管理機能 Motor Admin Rails
フロントエンドツール Rails Vite
画像プロキシ imgproxy.rb
... etc

利用NPMパッケージ

機能 NPMパッケージ
レイアウト Tailwind CSS v4 + daisyUI v5
... etc

履歴

変更箇所
Railsまわり
Rails本体 5.2 → 6 → 7.0 → 7.1 -> 7.2 → 8.0 → 8.1
アップローダ Refile → Shrine
ストレージ プロジェクト内 → MinIO (AWS S3互換)
ページング Kaminari → Pagy
JSONシリアライザ JSON:API Serialization Library → Alba
認証まわり Sorcery → devise
タグまわり ActsAsTaggableOn → No Fly List
管理機能 Rails Admin → Motor Admin Rails
JS/CSSまわり
Sprockets → Sprockets + Webpacker (on Node.js) → Sprockets + esbuild & sass → Propshaft + esbuild & sass (jsbundiling-rails + cssbundling-rails) → Propshaft + Vite Ruby(vite_rails) → Propshaft + Rails Vite
Yarn → pnpm
JSまわり(旧バージョン)
Vue.js 2 → 3
JavaScript → TypeScript
Luminous → baguetteBox.js → GLightbox
Strip → PhotoSwipe
Nuxtフロントエンド
Nuxt3 → Nuxt4
VueQuill(Quill1) → Vue Quilly(Quill2) → Tiptap
Vuelidate → Regle
VCalendar → Vue Datepicker
DBまわり MySQL → PostgreSQL
NoSQL/KVストアまわり 未導入 → Redis → Valkey
画像プロキシ 未導入 → imgproxy
CSSまわり Bootstrap 4 → 5 → Tailwind CSS v4 + daisyUI v5

最後に

Nuxt3/4いいよ、Nuxt3/4!

上記アプリの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?