HashRouter与BrowserRouter


109

我是编程的新手,如果我阅读了官方文档,这会使我很难理解。

从这里阅读有关React Router 4的信息

在本文中,作者正在谈论<HashRouter><BrowserRouter>

这就是他提到的

HashRouter基本上使用URL中的哈希来呈现组件。由于我正在构建一个静态的单页网站,因此需要使用它。

BrowserRouter,它使用HTML5历史记录API呈现组件。可以通过pushState和replaceState修改历史记录。更多信息可以在这里找到

现在,我都没有这两者的意义和用例,就像他说可以通过pushState和replaceState修改历史记录使用URL中的哈希值来呈现组件的历史记录时的意思一样。

虽然对BrowserRouter的第一种解释对我来说完全是模糊的,但对HashRouter的第二种解释也没有意义,例如为什么有人在URL中使用Hash(#)来呈现组件?



您没有提供现有答案的反馈。由于他们已经直接回答了这个问题,因此有必要澄清该问题需要什么样的关注。
Estus Flask,

Answers:


125

BrowserRouter

它使用历史记录API,即它不适用于旧版浏览器(IE 9及更低版本和同期版本)。客户端React应用程序能够维护干净的路由,例如example.com/react/route,但需要Web服务器的支持。通常,这意味着应该为单页应用程序配置Web服务器,即,index.html/ react / route路径或服务器端的任何其他路由提供相同的服务。在客户端,window.location.pathname由React路由器解析。React router渲染一个已配置为/ react / route渲染的组件。

此外,设置可能涉及服务器端渲染,index.html可能包含当前路线特有的渲染组件或数据。

HashRouter

它使用URL哈希,它对受支持的浏览器或Web服务器没有任何限制。服务器端路由独立于客户端路由。

向后兼容的单页应用程序可以将其用作example.com/#/react/route。该设置无法通过服务器端呈现进行备份,因为它是服务器端提供的/路径,因此无法从服务器端读取#/ react / route URL哈希。在客户端,window.location.hash由React路由器解析。与相似,React router会渲染一个已配置为/ react / route渲染的组件BrowserRouter

最重要的是,HashRouter用例不仅限于SPA。网站可能具有传统或搜索引擎友好的服务器端路由,而React应用程序可能是在URL中维护其状态的小部件,例如example.com/server/side/route#/react/route。与/ server / side / route一起在服务器端提供一些包含React应用程序的页面,然后在客户端,React路由器会渲染一个已配置为/ react / route渲染的组件,这与之前的场景类似。


2
另一点-如果您需要在页面上进行锚定导航(location.hash通常是专为即开即用而设计的),则实现起来会有些困难。
骑士

1
@iRohitBhatia BrowserHistory还可以让您执行服务器端渲染,因为服务器可以访问完整的URL。服务器无权访问后面的路径#
塞巴斯蒂安Loix,坐落

28

服务器端: HashRouter在URL中使用哈希符号,这会导致服务器请求中忽略所有后续URL路径内容(即,您将服务器获取“ www.mywebsite.com/#/person/john” .mywebsite.com”。结果,服务器将返回pre#URL响应,然后post#路径将由您的客户端react应用解析。

客户端: BrowserRouter不会将#符号附加到您的URL,但是当您尝试链接到页面或重新加载页面时会产生问题。如果客户端响应应用程序中存在显式路由,但服务器上不存在显式路由,则重新加载和链接(直接击中服务器的任何内容)将返回404 not found错误。


5

无论BrowserRouterHashRouter组件是在阵营第4代路由器作为子类介绍Router类。只需BrowserRouter将UI与浏览器中的当前URL同步,即可通过HTML-5 History API来完成。另一方面,HashRouter使用URL的哈希部分进行同步。


5

“用例”

HashRouter:当我们有不需要后端的小型客户端应用程序时,我们可以使用,HashRouter因为当我们在URL /位置栏中使用哈希时,浏览器不会发出服务器请求。

BrowserRouter:当我们有支持后端的大型生产就绪应用程序时,建议使用<BrowserRouter>

本书参考:学习React:React和Redux的功能Web开发作者:Alex Banks,Eve Porcello


18
Imho“ HashRouter”与“ BrowserRouter”与“小型”与“大型生产就绪”应用程序无关。在大型生产就绪应用程序中使用HashRouter既没有限制,也没有性能问题。这一切都与特定的用例,需求和最终的架构有关。无服务器生产应用程序是真实的。
Pawel Sas

4

刷新页面会使浏览器使用当前路由向服务器发送GET请求。使用#号阻止我们发送该GET请求。之所以使用BrowserRouter,是因为我们希望将GET请求发送到服务器。为了在服务器上渲染路由器,我们需要一个位置-我们需要路由。该路由将在服务器上用于告知路由器要渲染的内容。当您要同构呈现路由时,可以使用BrowserRouter。


1

我想添加一个用例。使用BrowserRouter或Router时,它将在我们的节点服务器上正常工作。因为它了解客户端路由(预配置)。

但是,当我们在Apache服务器上(例如PHP,在GoDaddy上)部署构建React应用程序时,路由将无法按预期工作。它将进入404,为此我们需要配置.htaccess文件。之后,对于我来说,每个点击/ URL,也都向服务器发送请求。

在这种情况下,最好使用HASH路由(#)。#我们在html页面上使用它来遍历HTML内容,它不会导致服务器请求。

在上述情况下,我们可以使用HashRouting,即#之后的所有url,我们可以将路由规则用作SPA。


0

基本上,如果一个人使用BrowserRouter,那么一个人可以使用“ soAndSoReactPage /:id”之类的网址

例如:

with a Route <Route path="soAndSoReactPage/:id"><soAndSoReactComponent/></Route>

现在,在react组件“ soAndSoReactComponent”中,可以使用useParams提取“ id”,因此您可以根据id显示页面“ soAndSoReactComponent”

HashedRouter不能完成这样的事情,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.