質問: ### 前提・実現したいこと 自分でwebアプリを作ろうと考えています。その自分の考えているアプリの練習としてQiitaと全く同じwebアプリを作れることを目標として勉強しようと思います。(もちろんパクリなので公開などはしません) 質問内容 ---- そのためにどの言語(フレームワーク)を使おうか迷っています。 まず、最初に考えたのが、**vuejsとDjango**です。普段触っている言語がPythonのため、Djangoをバックエンドで書こうと思いました。そして、フロントエンドの本を読んでいて、一番書きやすいなとおもったのがvuejsでした。 しかし、調べてみるとvuejsでバックエンドを書くことや、Djangoでフロントエンドを書くことができるようなことが書かれていた気がして、よくわからなくなってしまったので、質問しました。 回答お願いします。 要点 -- vuejsとDjangoの相違点
回答: ### 結論 個人的に Django から始められることを大変オススメしたいです。 ### Django と Vue.js の違い 動作する場所が違います。 #### Django Django は Python のフレームワークでサーバで動作します。 #### Vue.js Vue.js は JavaScript のフレームワークでクライアント(ブラウザ)で動作します。 ### 疑義 Django でも HTML, CSS, JavaScript を配信することができます。 > > Djangoでフロントエンドを書くことができるようなことが書かれていた気がして、 > > よくわからなくなってしまった > > > * はじめての Django アプリ作成、その 3 これはできません。**SPA** を組む際に **SSR** するために **BFF** として **Node.js** が採用されていることと混同していると思われます。 > > vuejsでバックエンドを書くことや > > > キーワード: SPA, SSR, BFF, Node.js ... ググってみてください。 ### 誤解の原因 SSR - Srever Side Rendering Vue.js で「ブラウザに読み込まれて」、「JavaScript を実行し」、「ページを生成する」というページの構成にすると SEO 上不利になることがあるそうです。 > > 開発はNuxtを使わず、vue-cliで作っていたので、SSR(ServerSideRendering)はできません。 > > 月間100万人以上利用するサービスをSPAにしたあとSEOで苦戦したので、DynamicRenderingを入れた話 - teratail > > > これを避けるためにサーバサイドで HTML, CSS を生成させることがあるそうです。これを SSR と呼ばれているのを目にします。 * 実際Nuxt.jsとExpressでどうやってSSRやるか理解してましたか?自分はよくわかってなかったです【解説】 - Qiita おそらくこれをバックグラウドでも Vue.js が使えると混同していると思われます。 Qiita の記事や Google の公式の発表でも SSR はいらないよ!的なアナウンスはあるらしいの、ゆくゆくは影響は薄らぐと思われますが、とても大きなサービスを運用しているところは使うものと思われます。趣味ならいらないのかなと思うのですが。 * サーバーサイドレンダリング不要論 - Qiita React もそんなに SSR に興味がないみたいです。 > > React は Facebook が SSR にあまり興味が無いので、SSR 周辺のエコシステムに難があり、全てを自分で組み上げる体力が必要。ただし Suspense 周辺でその辺りもテコ入れされるかもしれない。 > > https://gist.github.com/mizchi/106d3c1bb8b8e5b46b45ceeeab0c348b > > > ### Django なのか Vue.js + Firebase を組み合わせて SPA で組むことも考えられます。しかし SPA で作るのは難易度が高く挫折する可能性があります。 まず HTML + CSS + Python(Django) で Qiita のようなサイトを作り、物足りなくなったら JavaScript(Vue.js) を追加して HTML + CSS + JavaScript(Vue.js) + Python(Django) というのが、望ましいように感じます。 Django と Vue.js の連携は以下の本にあります。 * 現場で使える Django REST Framework の教科書(技術書典7バージョン)