😸

Next.jsでホームページを作ろうと思っている人に向けて

2024/09/07に公開7

ご挨拶

まず初めに、この記事はホームページをフルコードで書いている人物が書いています。
まだ実践が浅く、勉強中の形へ向けての失敗共有談です。

html、css、javascriptでホームページを作っていたけど、次のステージを目指してReactでホームページを作り、SEO的に素のReactはよくないと知ったのでNext.js+React+tailwindcssで作ったという経緯ですが、いざ公開という段階に来ていろいろ失敗したことに気づいた事が多いので、今から挑戦という方が同じ失敗をしないよう、ここに残します。

何が失敗だったのか

簡潔に述べると、作ったホームページをロリポップで公開しようとしたのが失敗でした。

Next.jsはロリポップにそのままアップロードできません。
例えるならロリポップは真っ白なキャンバスです。
絵は描けるけど、描いた絵は動きません。

しかしNext.jsは電池の無いプラレールのようなものです。
このプラレールにはモーターは付いています。
これを動かすには、電力を供給できるレールが必要です。
この電力供給能力のあるサーバーにデプロイしないと動かないのです。

Reactの何がダメなのか

Reactは素晴らしいです。
htmlを直書きしている時、全てのページにnavbarやfooterをつけようと思うと同じコードをコピーしてすべてのページにペーストしていましたが、コンポーネントという概念から作ったパーツを呼び出せば良いので、ファイル一つ一つが非常にさっぱりします。
ただし、javascriptが動作して初めてページが生成されるため、googleの偵察部隊がクロージングする際、ページになにも表示されないということが起こり得ます。
つまりクローザーからすれば、何も書いてないページと見えるのです。
その為、SEO対策としては非常に弱くなってしまいます。

htmlじゃだめなの?

もちろん王道であり、今もcssの進化は続いています。
何もダメではありません。
でもコンポーネントでの製作は非常に快適であり、魅力的です。
tailwindの快適さを知ってしまうと、htmlファイルとcssファイルの行き来が少々煩わしく感じるのは、私だけではないでしょう。
クラス名だけ違う、繰り返し同じ内容のcssを書いてしまったときのなんとも言えない無駄をした感も味わう事がなくなります。

結論

Next.jsを使う人は、あらかじめ使うサーバーをvercelにする。ロリポップやxserverは使わないと決めてください。
使わないようにする、ではありません。検討すらしてはいけないのです。

1から作りなおす事になりますよ。

Discussion

melodycluemelodyclue

SSGとかstatic exportでも...ですかね?

arayashikiarayashiki

コメントありがとうございます!
Next.jsのサーバーサイドレンダリングの性質が失われて、結局はhtmlになる、と言う意味合いで書かせて頂いておりましたが、まだまだ勉強不足な部分が多いので勉強させていただきます!
ありがとうございます!

takecchitakecchi

Next.jsやReact、その他SEOなどに関して誤解されているようなので一つずつ補足させてください。

結論から

Next.jsやReactで書いたWebサイトをロリポップやxserverにアップロードして公開することが出来ます。

初めに

ご存知だとは思いますが、Webサイトは基本的にHTML+JavaScript+CSSといったような構成で動作します。
つまり、最終的にHTML+JavaScript+CSSの形になっていれば、ロリポップやxserverなどのホスティングサービスでも問題なく動作することを意味します。

サーバーサイドJSとクライアントサイドJSについて

JavaScriptにはブラウザ側で実行されるものとサーバー側で実行されるものがあります。

ロリポップは前者はサポートしていますが、後者をサポートしていません。
Next.jsは後者もサポートしている為、このあたりで躓いたのだろうと推測しています。

どうすればよいか

Next.jsにはStatic ExportsというHTML+JavaScript+CSSといった形式で吐き出してくれる機能が存在します。(いわゆるSSGと言われるものになります。)
https://nextjs.org/docs/pages/building-your-application/deploying/static-exports

書き出すタイミングで以下のようなログが出力されるのですが、

Route (app)                               Size     First Load JS
┌ ○ /                                     6.87 kB         131 kB
├ ○ /_not-found                           143 B          89.5 kB
└ ƒ /[username]                           28.1 kB         231 kB

○  (Static)   prerendered as static content
ƒ  (Dynamic)  server-rendered on demand

ƒとなっている箇所はサーバーサイドで処理されるような実装になっている為、当然このままではロリポップ上で動作しません。コードを見直す必要があります。

ƒ (Dynamic)またはλ (Server)となっているものが無ければ出力されたhtml,js,css等をアップロードすることで動作するので是非お試しください。

takecchitakecchi

SEOに関して補足

記事の本質とは外れてしまうのでこちらで

googleの偵察部隊がクロージングする際、ページになにも表示されない

GoogleのクロールはJavaScriptを解釈し、ページの描画を待ってからインデックスしてくれます。
なので素のReactでもSEO的な観点ではあまり問題にはならないかと。

URL 検査ツールがあるのでこちらから確認が可能です。

Next.jsの話であれば前述した静的サイト生成(SSG)を使うことでhtmlにも描画されるので、この問題は完全に回避可能です。

arayashikiarayashiki

コメントありがとうございます!
前の方にも書かせていただきましたが、
Next.jsのサーバーサイドレンダリングの性質が失われて、結局はhtmlになる、と言う意味合いで書かせて頂いておりました

自動で最適化してくれる便利なImageコンポーネントやnext-galleryと言ったものが使えなくなってしまうため、それなら最初からhtmlでいいのでは?と思った次第です。

が、本当にまだまだ勉強不足な部分が多いのでお言葉を踏まえて勉強させていただきます!
ありがとうございます!

takecchitakecchi

サーバーサイドレンダリングの性質が失われて、結局はhtmlになる

申し訳ないのですが、そのような内容を文中で確認することが出来ませんでした。

Next.jsを使う人は、あらかじめ使うサーバーをvercelにする。ロリポップやxserverは使わないと決めてください。
使わないようにする、ではありません。検討すらしてはいけないのです。

また、Next.jsを使ってはいけない理由がSSRが出来ないということだけであれば根拠として弱いです。
Next.jsを使用した静的サイトの開発を大変強い言葉で否定されているので、勉強不足ということであれば尚のこと発言には気を付けた方がよろしいかと。