前言
眾所周知,react一般會藉助react-router來開發單頁應用(spa),這樣瀏覽器就不會完全重新整理,對使用者視覺體驗上非常好,這也就是現代web開發的常態,開發一個應用(application),而不是僅僅是頁面(page,古老的web頁面)。
react-router4
2018年,react-router最新的大版本是4,不同於前面的3,2,1,完全基於元件化思想,網上眾說紛紜,褒貶不一,這裡不表。
不變的還是路由的兩種模式: hashRouter 和 browserRouter。
hashRouter會在路由跳轉的url後面加上#/a/b,因為hash值發生變化,瀏覽器並不會向服務端發起請求。
browserRouter則藉助html5裡面history的新的api,可以使用js改變url的值,而不會向服務端發請求。
那我們該選擇哪種模式,網上有的說選browser,有的選hash,這裡暫且不表。我在專案中選擇的browser,不要問我為什麼。
import { BrowserRouter as Router, Switch} from "react-router-dom";
class App extends Component {
render() {
return (
<Provider store={store}>
<Router>
<div className="App">
<Switch>
// 會做一下登入鑑權判斷
{ RenderRoutes({routes:mainConfig}) }
</Switch>
</div>
</Router>
</Provider>
);
}
}
複製程式碼
問題
開發完成後,npm run build打包生成靜態資源(html、css、js等),放到伺服器給客戶用(因為是前後端分離的專案,前端專案只要放在使用者能訪問到的地方,比如cdn、oss、伺服器都行)。伺服器通常需要啟用web服務,比如nginx、apache,亦或node啟動一個服務,指定靜態資原始檔地址。本次選用ngnx,配置好以後,只要把打包好的靜態資源上傳到伺服器中ningx預設指定靜態資原始檔,就可以訪問了。
但是當我們進去其他路由,如果重新整理瀏覽器,就會報404錯誤,要想重新進入,必須返回路由預設首頁。
解決
上面的問題其實是因為,重新整理瀏覽器,相當於瀏覽器向服務端請求/manage/admin/list,但是服務端(或者nginx)並沒有配置這樣一個路由,找不到當然返回404。
那是不是就需要我們配置這樣一個路由,當然不是,因為還有許多其他路由,這樣配置當然不可能;其次,spa應用路由是在前端由react-router配置控制的。
解決辦法就是,把找不到的路由,都返回index.html,這樣重新整理後,利用瀏覽器快取,js會根據路由,控制應該那個頁面顯示。重新整理前後還是同一個頁面。真正的配置,只需要在nginx的配置,比如我使用的預設配置(/etc/nginx/conf.d/default.conf),加上如下
location / {
try_files $uri /index.html;
複製程式碼