質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
SPA(Single-page Application)

SPA(Single-page Application)は、単一のWebページのみでコンテンツの切り替えができるWebアプリケーションもしくはWebサイトです。ブラウザでのページ遷移がないため、デスクトップアプリケーションのようなUXを提供します。

GitHub Pages

GitHub Pagesは、GitHubが提供するホスティングサービス。ブログやプロジェクトのWebページをGit/GitHubのリポジトリを用いて簡単に公開できます。静的Webページのためのホスティングサービスで、GitHubのアカウントがあれば無料での利用が可能です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

ウェブアプリケーション

ウェブアプリケーションとは、ウェブ上でアクセスされるアプリケーションのことを呼びます。この場合におけるウェブとは、インターネットやイントラネット上を意味します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

678閲覧

React+Viteで作成してGitHub Pagesにデプロイしたサイトの下層ページが404エラー

Y.Nezi

総合スコア1

SPA(Single-page Application)

SPA(Single-page Application)は、単一のWebページのみでコンテンツの切り替えができるWebアプリケーションもしくはWebサイトです。ブラウザでのページ遷移がないため、デスクトップアプリケーションのようなUXを提供します。

GitHub Pages

GitHub Pagesは、GitHubが提供するホスティングサービス。ブログやプロジェクトのWebページをGit/GitHubのリポジトリを用いて簡単に公開できます。静的Webページのためのホスティングサービスで、GitHubのアカウントがあれば無料での利用が可能です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

ウェブアプリケーション

ウェブアプリケーションとは、ウェブ上でアクセスされるアプリケーションのことを呼びます。この場合におけるウェブとは、インターネットやイントラネット上を意味します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2023/08/17 12:34

編集2023/08/17 12:54

実現したいこと

  • React+Viteで作成したサイトの下層ページを直接URL指定した際に発生する404エラーの解消

前提

  • React+Viteでjsx言語を用いてSPAサイトを作成しています。

  • GitHub Pagesに、Custom GitHub Actions Workflowsを使用する設定でデプロイしています。

  • /ページを表示してからのページ遷移には成功しています。

  • パッケージ管理にはnpmを使用しています。

  • ルーティングにはreact router domを使用しています。

発生している問題・エラーメッセージ

下層のページを直接URL指定(または更新)した時にのみ404エラーが発生しています。

改善に繋がりそうなソースコード

src/App.jsx

1import './style.css' 2 import {Header} from "./components/Header"; 3 import {Dev} from "./components/Dev"; 4 import {Skill} from "./components/Skill"; 5 import {Profile} from "./components/Profile"; 6 import {MiniMemo} from "./components/MiniMemo"; 7 import {Tobaccost} from "./components/Tobaccost"; 8 import {Footer} from "./components/Footer"; 9 import {Bottom} from "./components/Bottom"; 10 import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; 11 12 13 export const App = () => { 14 15 return ( 16 <Router> 17 <div className="container"> 18 19 <Header /> 20 21 <Routes> 22 <Route path='/WorksTest/' element={<Dev />} /> 23 <Route path='/WorksTest/Skill' element={<Skill />} /> 24 <Route path='/WorksTest/Profile' element={<Profile />} /> 25 <Route path='/WorksTest/MiniMemo' element={<MiniMemo />} /> 26 <Route path='/WorksTest/Tobaccost' element={<Tobaccost />} /> 27 </Routes> 28 29 <Footer /> 30 31 <Bottom /> 32 </div> 33 </Router> 34 ) 35 36 }

vite.config.js

1import { defineConfig } from 'vite' 2 import react from '@vitejs/plugin-react-swc' 3 4 // https://vitejs.dev/config/ 5 export default defineConfig({ 6 base: '/WorksTest/', 7 plugins: [react()], 8 })

package.json

1{ 2 "name": "test", 3 "private": true, 4 "version": "0.0.0", 5 "type": "module", 6 "scripts": { 7 "dev": "vite", 8 "build": "vite build", 9 "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", 10 "preview": "vite preview" 11 }, 12 "dependencies": { 13 "cross-env": "^7.0.3", 14 "react": "^18.2.0", 15 "react-burger-menu": "^3.0.9", 16 "react-dom": "^18.2.0", 17 "react-scroll": "^1.8.9" 18 }, 19 "devDependencies": { 20 "@types/react": "^18.2.15", 21 "@types/react-dom": "^18.2.7", 22 "@vitejs/plugin-react-swc": "^3.3.2", 23 "autoprefixer": "^10.4.14", 24 "eslint": "^8.45.0", 25 "eslint-plugin-react": "^7.32.2", 26 "eslint-plugin-react-hooks": "^4.6.0", 27 "eslint-plugin-react-refresh": "^0.4.3", 28 "gh-pages": "^6.0.0", 29 "postcss": "^8.4.27", 30 "react-router-dom": "^6.15.0", 31 "tailwindcss": "^3.3.3", 32 "vite": "^4.4.5" 33 } 34 }

試したこと1

  1. index.html をコピーして 404.htmlを作成

  2. package.jsonに下記を追記

package.json

1 "scripts": { 2 "postbuild": "cp build/index.html build/404.html", 3 }

試したこと2

  1. 404.htmlを作成(空のパターンとindex.htmlの内容をコピーするパターンを試行)

  2. vite.config.jsに下記を追記

vite.config.js

1 build: { 2 rollupOptions: { 3 input: { 4 main: resolve(__dirname, 'index.html'), 5 404: resolve(__dirname, '404.html'), 6 } 7 } 8 }

補足情報

恐らく404ページが表示される場合にindex.htmlを参照するようにビルドを行う、ということだと思うのですが、現在の知識では改善することが出来ず、ご教授をおねがいしたいです。

バージョン

  • Node.js16.17.1
  • React.js:18.2.0
  • Vite:4.4.9
  • react router v6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

解決しました

結論、1行コードを追記するだけでした。

修正内容

package.jsonのscriptsの項にpostbuildを追記

package.json

1 "scripts": { 2 "postbuild": "cp dist/index.html dist/404.html", 3 }

詳細

やっている事としては質問に記載した「試したこと1」がベースとなっています。

要はビルドを行う際、本番環境にindex.htmlの内容を404.htmlへコピー出来ればいいと理解しました。

GitHubでコミット履歴を見たら、試したことの内容のコミット時に尽くエラーとなっていたため、原因を考えたところ、

  • Reactのみで構築した環境ではbuildした本番環境の内容がbuildディレクトリへ、Viteを生じた場合はdistディレクトリへ保存される

ということに気が付き、buuld =>distへ記載を変えたところ、無事デプロイに成功、404エラーも解消されました。

投稿2023/08/18 01:56

Y.Nezi

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問