Router-路由

191 阅读3分钟

“route”是指根据url,为其分配到对应的处理程序。更通俗一点讲,route就是URL到函数的映射。

访问的URL会映射到相应的函数里(这个函数是广义的,可以是前端的函数也可以是后端的函数),然后由相应的函数来决定返回给这个URL什么东西。路由就是在做一个匹配的工作。

需要明确的是,只要在浏览器地址栏输入URL再回车,是一定会去后端服务器请求一次的。而如果是在页面里通过点击按钮等操作,利用router库的api来进行的URL更新是不会去后端服务器请求的。

后端路由与服务端渲染

以前,网页通常是通过后端匹配路由后,将页面直出给客户端浏览器的。也就是网页的html一般是在后端服务器里通过模板引擎渲染好再交给前端的。

服务端渲染的好处: 比如对于SEO友好,一些对安全性要求高的页面采用服务端渲染是更保险的。

缺点:耦合性强;前后端没有分离。

前端路由

前端路由定义: URL匹配规则由前端来控制。

而前端路由主要是有两种常见方式:

  • 带有hash的前端路由,优点是兼容性高。缺点是URL带有#号不好看。
  • 不带hash的前端路由,优点是URL不带#号,好看。缺点是既需要浏览器支持也需要后端服务器支持。

react-router与react-router-dom关系

  • react-router是一个monorepo仓库;多个项目放在react-router的packages目录下,分别为react-router、react-router-dom、react-router-config、react-router-native;

  • react-router是核心方法及组件库被react-router-dom及react-router-native依赖,如提供router、route、redirect、prompt、switch、withRouter、matchPath组件or方法

  • react-router-dom 浏览器端路由库,提供了BrowserRouter、HashRouter、Link、NavLink组件,供我们直接使用

  • react-router-native native端路由库

route组件及switch如何渲染

核心是matched方法。

matched是通过当前Route传入的path参数,然后利用path及其它几个相关参数,生成一个路径正则,然后利用这个路径正则去匹配window.location对象内的pathname属性,如果返回有匹配项,说明当前Route是与当前url pathname相匹配的路由组件,然后进行展示;如果没有返回匹配项,则直接返回null,表示当前Route组件没有被匹配到;

<Switch>
      <Route exact path={`${appCode}`} component={Home} />
      <Route exact path={`${appCode}Home`} component={Home} />
</Switch>

没有switch组件的时候,只要与当前location.pathname匹配的Route组件都会被渲染出来;

而有switch组件的时候,则会在switch组件内先遍历一次switch组件的一级子元素(注意这里的一级子元素是Route组件),从上到下然后找出第一个匹配项 (只渲染一个),然后传入computedMatch属性;

redirect组件 ?

github.com/willson-wan…