使用React開發新專案時,遇見了刷新頁面,直接存取二級或三級路由時,存取失敗,出現404或資源載入異常的情況,本篇針對此問題進行分析並總結解決方案。本文主要介紹了react-router browserHistory刷新頁面404問題解決方法,非常具有實用價值,需要的朋友可以參考下,希望能幫助大家。
背景
使用webpack-dev-server做本機開發伺服器時,正常情況只需要簡單使用webpack-dev-server指令啟動即可,但是當專案處於以下兩種情況時,往往需要有嵌套路由和非同步載入路由:
#我們使用react-router這種路由庫建立單一頁面應用路由;
使用html-webpack-plugin外掛程式動態將載入js的<script>標籤注入html文件;</script>
- 頁面載入失敗,回傳Cannot Get(404);
- #服務回應,但沒有傳回webpack處理輸出的html文件,導致無法載入js資源,第二種情況如圖:
分析問題
- react-router路前端由配置;
- #webpack-dev-server服務配置;
#react-router
因為前端路由比較容易確定問題,比較方便分析,而且對於react-router比較熟悉,所以先去查詢react-router路由庫相關配置信息,發現文檔中提到了使用browserHistory時,會創建真實的URL,處理初始/請求沒有問題,但是對於跳轉路由後,刷新頁面或者直接訪問該URL時,會發現無法正確相應,更多資訊檢視參考文檔,文檔中也提供了幾種伺服器配置解決方式:
Node
#
const express = require('express') const path = require('path') const port = process.env.PORT || 8080 const app = express() // 通常用于加载静态资源 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作為服務時,需要使用通配符*監聽所有請求,並返回目標html文件(引用js資源的html)。
Nginx
如果使用的是nginx伺服器,只需使用try_files 指令:
-
server { ... location / { try_files $uri /index.html } }
如果使用Apache伺服器,則需要在專案根目錄建立.htaccess文件,檔案包含如下內容:
#
RewriteBase / RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.html [L]
以下都是針對伺服器的配置,可惜的是我們目前還沒引入相關伺服器,只是使用了webpack-dev-server的內建服務,但我們已經找到問題所在了,就是路由請求無法匹配返回html文檔,所以接下來就該去webpack-dev-server文檔中查找解決方式了。
在這裡不得不吐槽一下webpack-dev-server官方文檔,部落客反覆看了幾遍,才看清楚了問題所在,這裡也分兩種情況:
沒有修改output.publicPath,即webpack設定檔中沒有聲明值,屬於預設情況;
點此檢視文件
##預設情況
預設情況下,沒有修改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########如果你的應用使用使用HT5 toryApiFallback: true#########如果你的應用程式使用HT5 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#############發現使用以上方式,並沒有完全解決我的問題,總會有路由請求回應異常,於是部落客繼續尋找更好的解決方案:#########點此查看文件###
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.
代理提供通过函数返回值响应请求方式,针对不同请求进行不同处理,函数参数接收HTTP请求和响应体,以及代理配置对象,这个函数必须返回false或URL路径,以表明如何继续处理请求,返回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'; } } } }
如上配置,可以监听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` } } }
监听所有前端路由,然后直接返回${PUBLICPATH}/index.html,PUBLICPATH就是设置的output.publicPath值。
另外,博主总是习惯性的声明,虽然不设置该属性也能满足预期访问效果:
historyApiFallback: true
相关推荐:
以上是react-router browserHistory刷新頁面404問題如何解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

記事本++7.3.1
好用且免費的程式碼編輯器

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境