如何修复使用create-react-app构建后出现的白屏问题?

29

我使用了react-router-dom并构建了我的React应用程序。当我将其部署到服务器上时,页面变成空白页,控制台也没有任何输出。

我的App.js文件内容如下:

import React, { Component } from 'react';
import { Route, Switch, BrowserRouter} from 'react-router-dom';
import Agenda from './components/Agenda/Agenda';
import Planning from './components/Planning/Planning';
class App extends Component {
  render() {
    return (
      <div>
        <BrowserRouter  basename="/">
          <Switch>
            <Route exact path="/"  component={Agenda} />
            <Route path="/planning" component={Planning} />
          </Switch>
        </BrowserRouter>
      </div>
    );
  }
}

export default App;

我的 index.js 文件如下:

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(
        <App/>
, document.getElementById('root'));

我的 index.html :

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link rel="shortcut icon"  href="favicon.ico">
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1, shrink-to-fit=no"
    />
    <meta name="theme-color" content="#000000" />
     <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/material-design-iconic-font/2.2.0/css/material-design-iconic-font.min.css">
     <link href="https://fonts.googleapis.com/css?family=Titillium+Web:300,400,700" rel="stylesheet"> 
     <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.css"/>
     <link rel="manifest" href="manifest.json">
     <link rel="data" href="data.json">
     <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
    <title>Test</title>
  </head>
  <body>
    <div id="root"></div>
    <script src="https://unpkg.com/react@16.0.0/umd/react.production.min.js"></script>
  </body>
</html>

在我的package.json文件中,我有以下内容:
"homepage": "."

当我将homepage改为https://dev.test.com/React并运行时,我得到一个空白页面,例如我部署的地址是:https://dev.test.com/React/它不是公共的。 当我运行serve-s build时,控制台上出现了一个空白屏幕,我获得了如下输出:

enter image description here

我的生产环境中的index.html:

<!doctype html>
<html lang="en">
    <head>
        <meta charset="utf-8"/>
        <link rel="shortcut icon" href="favicon.ico">
        <meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"/>
        <meta name="theme-color" content="#000000"/>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/material-design-iconic-font/2.2.0/css/material-design-iconic-font.min.css">
        <link href="https://fonts.googleapis.com/css?family=Titillium+Web:300,400,700" rel="stylesheet">
        <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.css"/>
        <link rel="manifest" href="manifest.json">
        <link rel="data" href="data.json">
        <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous">
        </script>
        <title>Test</title>
        <link href="/React/static/css/2.2aa93811.chunk.css" rel="stylesheet">
        <link href="/React/static/css/main.ca6e1d23.chunk.css" rel="stylesheet">
    </head>
    <body>
        <div id="root"></div>
        <script src="https://unpkg.com/react@16.0.0/umd/react.production.min.js"></script>
        <script>!function(f){function e(e){for(var r,t,n=e[0],o=e[1],u=e[2],l=0,a=[];l<n.length;l++)t=n[l],c[t]&&a.push(c[t][0]),c[t]=0;for(r in o)Object.prototype.hasOwnProperty.call(o,r)&&(f[r]=o[r]);for(s&&s(e);a.length;)a.shift()();return p.push.apply(p,u||[]),i()}function i(){for(var e,r=0;r<p.length;r++){for(var t=p[r],n=!0,o=1;o<t.length;o++){var u=t[o];0!==c[u]&&(n=!1)}n&&(p.splice(r--,1),e=l(l.s=t[0]))}return e}var t={},c={1:0},p=[];function l(e){if(t[e])return t[e].exports;var r=t[e]={i:e,l:!1,exports:{}};return f[e].call(r.exports,r,r.exports,l),r.l=!0,r.exports}l.m=f,l.c=t,l.d=function(e,r,t){l.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(r,e){if(1&e&&(r=l(r)),8&e)return r;if(4&e&&"object"==typeof r&&r&&r.__esModule)return r;var t=Object.create(null);if(l.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:r}),2&e&&"string"!=typeof r)for(var n in r)l.d(t,n,function(e){return r[e]}.bind(null,n));return t},l.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(r,"a",r),r},l.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},l.p="/ReactCalendar/";var r=window.webpackJsonp=window.webpackJsonp||[],n=r.push.bind(r);r.push=e,r=r.slice();for(var o=0;o<r.length;o++)e(r[o]);var s=n;i()}([])</script>
        <script src="/React/static/js/2.4a7f0704.chunk.js"></script>
        <script src="/React/static/js/main.f9268394.chunk.js"></script>
    </body>
</html>

我该如何修复它?

“/React” 是你的服务器上的目录吗?另外,你能提供生产构建的编译后的 “index.html” 文件吗? - Rallen
@Rallen 是的,/React 是我的服务器上的一个目录,请你检查一下我的帖子好吗?我已经在生产环境中添加了编译后的 index.html。当我在服务器上运行它时,控制台是空的。 - Ichrak Mansour
15个回答

25

尝试将你的BrowserRouter中的basename="/"更改为basename="/React"。如果在子目录中使用,则react-router需要这样做。

根据react-router文档

basename:所有位置的基本URL。如果您的应用程序从服务器的子目录中提供服务,您将希望将其设置为子目录。格式正确的basename应该有一个前导斜杠,但没有尾随斜杠。

同时,将package.json中的homepage更改为您的生产目标的网址。homepage="."表示它将在位于服务器根目录的每个域上运行(这也是默认行为)。

根据React部署文档

By default, Create React App produces a build assuming your app is hosted at the server root. To override this, specify the homepage in your package.json, for example:

"homepage": "http://mywebsite.com/relativepath",

This will let Create React App correctly infer the root path to use in the generated HTML file.


首页将是 "homepage":"." 还是 "homepage":"https://dev.test.com/React" - Ichrak Mansour
1
你好!能否告诉我你最终使用的主页是哪个?我已经尝试了很多变化。需要使用 http 还是 https?在 relativepath 的位置应该填什么? - Tsabary
我不得不使用我的域名的确切基本URL而不是“.”在“主页”中,因为它没有显示图像。除此之外,这种方法非常有效,谢谢! - Zeeshan Ahmad Khalil

9

我也遇到了同样的问题,并且已经解决了!

如果还有人遇到这个问题,请按照以下步骤操作:

1 - 您需要更新您的浏览器。请参考此链接:https://create-react-app.dev/docs/supported-browsers-features/#configuring-supported-browsers

2 - 您需要在package.json文件中添加"react-router-dom": 依赖项,使用命令npm i react-router-dom

3 - 在您的package.json文件中添加"homepage": ".",

希望这可以帮助到您。


4
请将"homepage": "." 添加到您的 package.json 文件中。 - Kourosh Neyestani
我已经做了这个,但仍然没有运气。 - Érica Santos

6
我也遇到了这个问题,屏幕上出现了空白的白屏,没有错误提示。这些答案都没有解决我的问题。我要在这里留下我的解决方案,以便像我这样的人不会因为一个小错误而浪费2个小时。 请确保将所有文件上传到服务器的 /build 文件夹中。

1
我也做了同样的事情!我的问题仍然存在。我刚刚将构建文件夹中的所有文件上传到S3。当我加载我的S3时,它显示空白屏幕,没有错误。 - uday reddy

5
对我而言比较有效的方法是在BrowserRouter 中添加basename="/index.html"
<BrowserRouter basename="/index.html">
   ...
</BrowserRouter>

3
有太多不同的答案,真是一个灾难。但所有这些答案似乎都帮助了某个人。这个答案对我有帮助!我正在Linux上运行Nginx。 - MickeyDickey

5

作为补充,我知道有很多原因会导致这种情况。我在构建后遇到了白页,并在浏览器控制台中看到了Web chunks的404错误。 我已经在package.json中设置了“homepage”,但感到困惑。

服务器端缓存

然而,我注意到在404消息中,所引用的chunk与我的构建文件夹中的chunk 具有不同的哈希值; 这些“旧”的chunks试图被获取,而不是来自最新构建的具有不同哈希值的文件名的新chunks。

例如,我在浏览器控制台中看到的404错误指向一个具有类似以下哈希值的chunk:

main.f1d2d060.chunk.css // from an old build
     ^^^^^^^^^

然而在 /build 文件夹中,代码块实际上是:

main.adg25e108.chunk.css // from latest build
     ^^^^^^^^^

因此,我意识到某些文件必须被缓存,试图检索旧文件而不是新文件。结果发现我启用了服务器端缓存,旧的网页块正尝试通过asset-manifest.json的缓存版本进行检索... :叹气: ...我可以清除我的网络主机(SiteGround)的缓存。
根据您的主机,清除缓存的方法会有所不同:https://www.siteground.com/kb/clear-site-cache/ 如果您已经尝试了其他一切,请考虑以下问题--仔细检查控制台中404错误的哈希字符串与您的/build文件夹中的哈希字符串是否匹配,否则您可能会面临同样的情况,即asset-manifest.json尝试检索错误的内容。

4

我遇到了相同的“白屏”问题,只需添加以下内容即可解决:

<BrowserRouter basename="/"> 

在index.js文件中,basename="/"对我有用,希望对你也有用。

3
这样重新排列对我有用,从根路径中删除“exact?”。
<Router>
  <Route exact path="/about" component={About} />
  <Route path="/" component={App} />
</Router>


我在我的package.json中使用了hompage=".",但'/about'没有进入相对路径。 - Acushla

3

我在我的 index.html 文件中添加了 basename='/index.html',如下代码所示:

import React from 'react';
import {BrowserRouter as Router, Route, Switch} from 'react-router-dom';
import LoginPage from './components/LoginPage/LoginPage';
import Dashboard from './components/Dashboard/Dashboard';

function App() {
  return (
    <Router basename='/index.html'>
      <Switch>
        <Route path='/' exact component={LoginPage} />
        <Route path='/dashboard' component={Dashboard}/>
      </Switch>
    </Router>
  );
}

export default App;


希望这能有所帮助。

2

以上的答案都对我不起作用。所以我尝试在不同的端口上运行它,结果成功了。

serve -s build -l 4000 

2
这可能是由于您重命名了路由的页面导致的。
我曾经遇到过这种情况,屏幕白屏没有错误提示,原因是我使用了history.push将用户发送到我们已重命名的页面。
但是该页面已不存在,因此只显示一个空白屏幕。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接