react router BrowserRoute部署後頁面空白問題

參考:https://www.cnblogs.com/sunLemon/p/9020153.html

 

遇到的問題

項目中控制路由跳轉使用的是BrowserRouter,代碼如下:

複製代碼

ReactDOM.render((
    <BrowserRouter>
        <div className="container">
            <Route path={routePaths.INDEX} exact component={Index} />
            <Route path={routePaths.CARD} component={Card} />
            <Route path={routePaths.BASEINFO} component={BaseInfo} />
            <Route path={routePaths.EDUINFO} component={EduInfo} />
            <Route path={routePaths.FAMILYINFO} component={FamilyInfo} />
            <Route path={routePaths.OTHERINFO} component={OtherInfo} />
            <Route path={routePaths.DETAIL} component={Detail}/>
        </div>
    </BrowserRouter>
    ),
    document.getElementById('app')
);

複製代碼

在開發過程中使用是沒有問題的,但是將頁面上傳至服務器之後,問題就來了:用戶訪問的資源不存在,頁面是空白的。 經過排查懷疑是路徑的問題,將BrowserRouter 改爲 HashRouter之後,問題解決了~

問題分析

首先分析下出現此問題的原因: 在React項目中我們經常需要採用React-Router來配置我們的頁面路由,React-Router 是建立在 history 之上的,常見的history路由方案有三種形式,分別是:

  • hashHistory
  • browserHistory
  • createMemoryHistory

hashHistory 使用 URL 中的 hash(#)部分去創建路由,舉例來說,用戶訪問http://www.example.com/,實際會看到的是http://www.example.com/#/。

複製代碼

<HashRouter>
        <div className="container">
            <Route path='/repos' component={Repos} />
            <Route path='/about' component={About} />
        </div>
    </HashRouter>

複製代碼

上面代碼中,用戶訪問/repos(比如http://localhost:8080/#/repos)時,加載Repos組件;訪問/about(http://localhost:8080/#/about)時,加載About組件。

browserHistory 是使用 React-Router 的應用推薦的 history方案。它使用瀏覽器中的 History API 用於處理 URL,創建一個像example.com/list/123這樣真實的 URL 。

在browserHistory 模式下,URL 是指向真實 URL 的資源路徑,當通過真實 URL 訪問網站的時候,由於路徑是指向服務器的真實路徑,但該路徑下並沒有相關資源,所以用戶訪問的資源不存在。

Memory history 不會在地址欄被操作或讀取。這就解釋了我們是如何實現服務器渲染的。同時它也非常適合測試和其他的渲染環境(像 React Native )。和另外兩種history的一點不同是你必須創建它,這種方式便於測試。

const history = createMemoryHistory(location)

解決辦法

  • 使用hashHistory

本地開發時,使用browserHistory是沒有問題的,這是因爲webpack.config.js中使用 webpack-dev-server 已經做了配置。

 webpackConfig.devServer = {
        contentBase: path.resolve(__dirname, 'build'),
        compress: true, //gzip壓縮
        historyApiFallback: true,
    };
  • 如果要使用browserHistory的話,服務器需要進行相關路由配置,方法見 這裏

參考資料:

  1. https://www.sitepoint.com/react-router-v4-complete-guide/
  2. http://react-guide.github.io/react-router-cn/docs/guides/basics/Histories.html
  3. https://www.thinktxt.com/react/2017/02/26/react-router-browserHistory-refresh-404-solution.html
  4. http://echizen.github.io/tech/2016/07-05-webpack-dev-server-react-router-config
  5. https://jaketrent.com/post/pushstate-webpack-dev-server/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章