最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

react-router browserHistory刷新頁面404問題解決方法

 更新時間:2017年12月29日 09:58:42   作者:熊建剛  
本篇文章主要介紹了react-router browserHistory刷新頁面404問題解決方法,非常具有實用價值,需要的朋友可以參考下

使用React開發(fā)新項目時,遇見了刷新頁面,直接訪問二級或三級路由時,訪問失敗,出現(xiàn)404或資源加載異常的情況,本篇針對此問題進行分析并總結解決方案。

背景

使用webpack-dev-server做本地開發(fā)服務器時,正常情況只需要簡單使用webpack-dev-server指令啟動即可,但是當項目處于以下兩種情況時,往往需要有嵌套路由和異步加載路由:

  1. 我們使用react-router這種路由庫構建單頁面應用路由;
  2. 使用html-webpack-plugin插件動態(tài)將加載js的<script>標簽注入html文檔;

這時,訪問localhost:9090是可以正常加載頁面和js等文件的,但是當我們需要訪問二級甚至三級路由或者刷新頁面時,如localhost:9090/posts/92時,可能會出現(xiàn)兩種情況:

  1. 頁面加載失敗,返回Cannot Get(404);
  2. 服務響應,但是沒有返回webpack處理輸出的html文件,導致無法加載js資源,第二種情況如圖:

那么我們怎么處理才能正常訪問,各頁面路由呢?博主追蹤溯源,查找文檔配置后解決了問題,本篇就是對整個解決問題過程的總結。

分析問題

發(fā)現(xiàn)問題后,我們就要開始分析,解決問題了,我們判斷這個問題一般是兩方面原因造成:

  1. react-router路前端由配置;
  2. webpack-dev-server服務配置;

react-router

因為前端路由更容易確定問題,更方便分析,而且對于react-router更熟悉,所以首先去查詢react-router路由庫相關配置信息,發(fā)現(xiàn)文檔中提到了使用browserHistory時,會創(chuàng)建真實的URL,處理初始/請求沒有問題,但是對于跳轉路由后,刷新頁面或者直接訪問該URL時,會發(fā)現(xiàn)無法正確相應,更多信息查看參考文檔,文檔中也提供了幾種服務器配置解決方式:

Node

const express = require('express')
const path = require('path')
const port = process.env.PORT || 8080
const app = express()

// 通常用于加載靜態(tài)資源
app.use(express.static(__dirname + '/public'))

// 在你應用 JavaScript 文件中包含了一個 script 標簽
// 的 index.html 中處理任何一個 route
app.get('*', function (request, response){
 response.sendFile(path.resolve(__dirname, 'public', 'index.html'))
})

app.listen(port)
console.log("server started on port " + port)

在使用Node作為服務時,需要使用通配符*監(jiān)聽所有請求,返回目標html文檔(引用js資源的html)。

Nginx

如果使用的是nginx服務器,則只需要使用try_files 指令:

server {
 ...
 location / {
  try_files $uri /index.html
 }
}

Apache

如果使用Apache服務器,則需要在項目根目錄創(chuàng)建.htaccess文件,文件包含如下內容:

RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]

以下都是針對服務器的配置,可惜的是我們目前還沒引入相關服務器,只是使用了webpack-dev-server的內置服務,但是我們已經(jīng)找到問題所在了,就是路由請求無法匹配返回html文檔,所以接下來就該去webpack-dev-server文檔中查找解決方式了。

webpack-dev-server

在這里不得不吐槽一下webpack-dev-server官方文檔,博主反復看了幾遍,才看清楚了問題所在,這里也分兩種情況:

  1. 沒有修改output.publicPath,即webpack配置文件中沒有聲明值,屬于默認情況;
  2. 設置了output.publicPath為自定義值;

點此查看文檔

默認情況

默認情況下,沒有修改output.publicPath值,只需要設置webpack-dev-server的historyApiFallback配置:

devServer: {
 historyApiFallback: true
}

If you are using the HTML5 history API you probably need to serve your index.html in place of 404 responses, which can be done by setting historyApiFallback: true

如果你的應用使用HTML5 history API,你可能需要使用index.html響應404或者問題請求,只需要設置g historyApiFallback: true即可

自定義值

However, if you have modified output.publicPath in your Webpack configuration, you need to specify the URL to redirect to. This is done using the historyApiFallback.index option

如果你在webpack配置文件中修改了 output.publicPath 值,那么你就需要聲明請求重定向,配置historyApiFallback.index 值。

// output.publicPath: '/assets/'
historyApiFallback: {
 index: '/assets/'
}

Proxy

發(fā)現(xiàn)使用以上方式,并不能完全解決我的問題,總會有路由請求響應異常,于是博主繼續(xù)查找更好的解決方案:

點此查看文檔

The proxy can be optionally bypassed based on the return from a function. The function can inspect the HTTP request, response, and any given proxy options. It must return either false or a URL path that will be served instead of continuing to proxy the request.

代理提供通過函數(shù)返回值響應請求方式,針對不同請求進行不同處理,函數(shù)參數(shù)接收HTTP請求和響應體,以及代理配置對象,這個函數(shù)必須返回false或URL路徑,以表明如何繼續(xù)處理請求,返回URL時,源請求將被代理到該URL路徑請求。

proxy: {
 '/': {
  target: 'https://api.example.com',
  secure: false,
  bypass: function(req, res, proxyOptions) {
   if (req.headers.accept.indexOf('html') !== -1) {
    console.log('Skipping proxy for browser request.');
    return '/index.html';
   }
  }
 }
}

如上配置,可以監(jiān)聽https://api.example.com域下的/開頭的請求(等效于所有請求),然后判斷請求頭中accept字段是否包含html,若包含,則代理請求至/index.html,隨后將返回index.html文檔至瀏覽器。

解決問題

綜合以上方案,因為在webpack配置中修改了output.publicPath為/assets/,所以博主采用webpack-dev-server Proxy代理方式解決了問題:

const PUBLICPATH = '/assets/'
...
proxy: {
 '/': {
  bypass: function (req, res, proxyOptions) {
   console.log('Skipping proxy for browser request.')
   return `${PUBLICPATH}/index.html`
  }
 }
}

監(jiān)聽所有前端路由,然后直接返回${PUBLICPATH}/index.html,PUBLICPATH就是設置的output.publicPath值。

另外,博主總是習慣性的聲明,雖然不設置該屬性也能滿足預期訪問效果:

historyApiFallback: true

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 淺析React中的受控組件和非受控組件

    淺析React中的受控組件和非受控組件

    具體來說這是一種react非受控組件,其狀態(tài)是在input的react內部控制,不受調用者控制。可以使用受控組件來實現(xiàn)。下面就說說這個React中的受控組件與非受控組件的相關知識,感興趣的朋友一起看看吧
    2021-05-05
  • react  Suspense工作原理解析

    react  Suspense工作原理解析

    這篇文章主要為大家介紹了react  Suspense工作原理解析以及基本應用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • react國際化化插件react-i18n-auto使用詳解

    react國際化化插件react-i18n-auto使用詳解

    這篇文章主要介紹了react國際化化插件react-i18n-auto使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • React學習之受控組件與數(shù)據(jù)共享實例分析

    React學習之受控組件與數(shù)據(jù)共享實例分析

    這篇文章主要介紹了React學習之受控組件與數(shù)據(jù)共享,結合實例形式分析了React受控組件與組件間數(shù)據(jù)共享相關原理與使用技巧,需要的朋友可以參考下
    2020-01-01
  • React中的Component組件詳解

    React中的Component組件詳解

    本章節(jié),我們將一起探討 React 中類組件和函數(shù)組件的定義,不同組件的通信方式,以及常規(guī)組件的強化方式,幫助你全方位認識 React 組件,從而對 React 的底層邏輯有進一步的理解,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • Express+React+Antd實現(xiàn)上傳功能(前端和后端)

    Express+React+Antd實現(xiàn)上傳功能(前端和后端)

    這篇文章主要介紹了Express+React+Antd實現(xiàn)上傳功能(前端和后端),本文通過示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2024-04-04
  • React實現(xiàn)核心Diff算法的示例代碼

    React實現(xiàn)核心Diff算法的示例代碼

    這篇文章主要為大家詳細介紹了React如何實現(xiàn)Diff算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-04-04
  • React useState超詳細講解用法

    React useState超詳細講解用法

    我正在處理的組件是表單的時間輸入。表單相對復雜,并且是動態(tài)生成的,根據(jù)嵌套在其他數(shù)據(jù)中的數(shù)據(jù)顯示不同的字段。我正在用useReducer管理表單的狀態(tài),到目前為止效果很好
    2022-11-11
  • react-native 實現(xiàn)購物車滑動刪除效果的示例代碼

    react-native 實現(xiàn)購物車滑動刪除效果的示例代碼

    這篇文章主要介紹了react-native 實現(xiàn)購物車滑動刪除效果的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • React實現(xiàn)翻頁時鐘的代碼示例

    React實現(xiàn)翻頁時鐘的代碼示例

    本文給大家介紹了React實現(xiàn)翻頁時鐘的代碼示例,翻頁時鐘把數(shù)字分為上下兩部分,翻頁效果的實現(xiàn)需要通過設置 position 把所有的數(shù)組放在同一個位置疊加起來,文中有詳細的代碼講解,需要的朋友可以參考下
    2023-08-08

最新評論

安国市| 库尔勒市| 繁昌县| 房产| 当涂县| 泉州市| 花垣县| 吐鲁番市| 海安县| 青阳县| 绥芬河市| 巢湖市| 九台市| 湾仔区| 丹棱县| 青冈县| 岫岩| 甘谷县| 若尔盖县| 胶南市| 达日县| 瓦房店市| 桃园县| 忻城县| 肃宁县| 昌都县| 永仁县| 临朐县| 高要市| 通辽市| 香港 | 鹿邑县| 武夷山市| 宝坻区| 青神县| 调兵山市| 丁青县| 安新县| 汉川市| 内江市| 勐海县|