代码之家  ›  专栏  ›  技术社区  ›  Cockatoolover

React App部署后在gh页面上显示空白屏幕-SO的现有建议已经实现

  •  1
  • Cockatoolover  · 技术社区  · 5 月前

    我正试图使用react Router DOM部署我的反应应用程序,以便使用Github页面进行客户端重定向。

    部署后,我得到一个空页面——除了路由上下文之外的内容,DOM中没有加载任何组件内容。

    作为调试的一部分,我已经完成了Stack Overflow讨论,讨论了这个问题。

    我遵循了中建议的更改 React Router not working with Github Pages 但这并没有解决问题。

    我根据其他堆栈溢出讨论的建议和网站上的建议进行了以下更改 react app Deployment :

    1. 已更换 createBrowserRouter 具有 createHashRouter

    2. 提供 basename 我的 createHashRouter 作为回购名称。

    3. 根据文档检查package.json的主页及其正确性。

    4. 将package.json中的“private”属性设置为false。

    在部署构建时进行上述更改后,构建的index.html显示如下:

    <!doctype html>
    <html lang="en">
    
    <head>
        <meta charset="utf-8" />
        <link rel="icon" href="/FrontEndQuizApp/favicon.ico" />
        <meta name="viewport" content="width=device-width,initial-scale=1" />
        <meta name="theme-color" content="#000000" />
        <meta name="description" content="Web site created using create-react-app" />
        <link rel="apple-touch-icon" href="/FrontEndQuizApp/logo192.png" />
        <link rel="manifest" href="/FrontEndQuizApp/manifest.json" />
        <title>React App</title>
        <script defer="defer" src="/FrontEndQuizApp/static/js/main.ea628bb2.js"></script>
        <link href="/FrontEndQuizApp/static/css/main.2f2eb39d.css" rel="stylesheet">
    </head>
    
    <body><noscript>You need to enable JavaScript to run this app.</noscript>
        <div id="root"></div>
    </body>
    
    </html>
    

    但我的javascript已为网站和浏览器启用。

    我的应用程序中的代码片段如下:

    Index.tsx-实现路由的位置-

    import React from "react";
    import ReactDOM from "react-dom/client";
    import "./index.css";
    import App from "./App";
    import reportWebVitals from "./reportWebVitals";
    import QuestionComp from "./components/QuestionComp";
    import {
      createHashRouter,
      FutureConfig,
      RouterProvider,
    } from "react-router-dom";
    
    import { store } from "./store";
    import { Provider } from "react-redux";
    import { ToggleProvider } from "./components/ThemeToggleContext";
    import ThemeToggle from "./components/ThemeToggel";
    import GlobalBackground from "./components/GlobalBackground";
    
    const router = createHashRouter(
      [
        {
          path: "/*",
          element: <App />,
        },
        {
          path: "/Question",
          element: <QuestionComp />,
        },
      ],
      { basename: "/FrontEndQuizApp" }
    );
    
    // declare function RouterProvider(props: RouterProviderProps): React.ReactElement;
    
    interface RouterProviderProps {
      fallbackElement?: React.ReactNode;
      router: any;
      future?: FutureConfig;
    }
    
    const root = ReactDOM.createRoot(
      document.getElementById("root") as HTMLElement
    );
    
    root.render(
      <React.StrictMode>
        <ToggleProvider>
          <GlobalBackground>
            <ThemeToggle></ThemeToggle>
            <Provider store={store}>
              <RouterProvider router={router} />
            </Provider>
          </GlobalBackground>
        </ToggleProvider>
      </React.StrictMode>
    );
    
    reportWebVitals();
    

    Package.json-为项目设置主页的地方-

    {
      "name": "quizreactapp",
      "version": "0.1.0",
      "private": false,
      "homepage": "https://ayushi186.github.io/FrontEndQuizApp",
      "dependencies": {
        "@redux-devtools/extension": "^3.3.0",
        "@reduxjs/toolkit": "^2.2.7",
        "@testing-library/jest-dom": "^5.17.0",
        "@testing-library/react": "^13.4.0",
        "@testing-library/user-event": "^13.5.0",
        "@types/jest": "^27.5.2",
        "@types/node": "^16.18.101",
        "@types/react": "^18.3.3",
        "@types/react-dom": "^18.3.0",
        "i": "^0.3.7",
        "npm": "^10.8.3",
        "react": "^18.3.1",
        "react-dom": "^18.3.1",
        "react-js-switch": "^1.1.6",
        "react-redux": "^9.1.2",
        "react-router-dom": "^6.24.1",
        "react-scripts": "5.0.1",
        "react-switch": "^7.1.0",
        "redux-devtools-extension": "^2.13.9",
        "sass": "^1.80.3",
        "styled-components": "^6.1.11",
        "typescript": "^4.9.5",
        "web-vitals": "^2.1.4"
      },
      "scripts": {
        "start": "react-scripts start",
        "build": "react-scripts build",
        "test": "react-scripts test",
        "eject": "react-scripts eject",
        "predeploy": "npm run build",
        "deploy": "gh-pages -d build"
      },
      "eslintConfig": {
        "extends": [
          "react-app",
          "react-app/jest"
        ]
      },
      "browserslist": {
        "production": [
          ">0.2%",
          "not dead",
          "not op_mini all"
        ],
        "development": [
          "last 1 chrome version",
          "last 1 firefox version",
          "last 1 safari version"
        ]
      },
      "devDependencies": {
        "gh-pages": "^6.2.0"
      }
    }
    

    部署到gh页面后应用程序的输出-

    my app output after deployment to gh-pages

    1 回复  |  直到 5 月前
        1
  •  0
  •   Drew Reese    5 月前

    问题

    您错误地添加了 basename 属性到路由器配置。如果您手动导航到 "/FrontEndQuizApp" 例如。 "https://ayushi186.github.io/FrontEndQuizApp/#/FrontEndQuizApp" 那么您将正确地看到您的应用程序内容呈现到DOM中。

    app page

    解决方案

    这个 基名 prop主要用于从服务器上的某个子目录托管/提供React应用程序,并且需要让路由器知道它在哪里,以便它可以正确使用URL 路径 ,但是 HashRouter 由于它使用了URL,因此消除了这个问题 搞砸 用于路由和导航。换句话说,应用程序从哪个目录提供服务并不重要。

    当您指定 基名 财产与 哈希路由器 它仍然做着与不使用哈希路由时相同的事情,例如,它通知路由器、路由、链接等所有工作和功能 相对的 对于特定的基名,因此与其从相对工作 "#/" 他们相对工作 "#/FrontEndQuizApp" .

    要解决此差异,请删除 基名 根据路由器配置:

    const router = createHashRouter(
      [
        {
          path: "/*",
          element: <App />,
        },
        {
          path: "/Question",
          element: <QuestionComp />,
        },
      ],
    );
    

    这允许应用程序路由/链接等所有工作和操作 "https://ayushi186.github.io/FrontEndQuizApp/#/" .