BaseHref 以及前端路由的问题
Base Href 是什么?
MDN ,
说的直白一点就是,这个站点里面所有的访问主站的资源文件,都会在路由前面加上这个base href ,包括*js,scss,image,ajax,......**。
如果一个DOM 里面有多个这样的base,只有第一个会起作用。
BaseHref 在Angular 工程的编译中有什么影响?
我们注意到在angular.json中有这个Options.baseHref 配置,在编译命令中也有ng build --base-href 的参数。这个参数记得一定要以/开头,也以/结尾。这个参数其实就是往编译好的index.html中插入base 节点。
除此外,也会影响前端的路由。如何影响呢,我们举例子来说明。
例子如下
假设我们的主站是http://site.com
我们的baseHref 设的是/myapp/,
Angular 中拥有两种路由策略一个是PathLocationStragety ,另一个是HashLocationStragety ,这两个的区别是,后者是通过# 来区分前端路由跟后端路由。而前者则没有这个区分。默认是前者。
更具体的说就是如果是PathLoationStragety ,路由则是 http://site.com/myapp/route1 , 而后者则是http://site.com/myapp/#route1.
除此之外,还要一个APP_BASE_HREF ,这个又是什么,直接举例子,如果它设置为prefix,则路由会是,http://site.com/myapp/prefix/route1 vs http://site.com/myapp/#/prefix/route1 . 而且这个prefix 的添加是angular 负责的。对我们的js 代码是无感的。
很多时候,我们不喜欢/myapp/,我们更希望路由是 http://site/route1 , 那么该怎么做呢。
我们得配合后端的MVC 来实现。首先我们的baseHref 还是/myapp/, 我们先设置App_BASE_HREF 为/, 然后在我们后端的MVC页面中,我们要为我们的所有前端路由配置一个路由,使得它命中到我们一个固定的View,在这个View里面我们可以使用 View("~/myapp/index.cshtml")
,这个index.cshtml其实就是我们前端编译好的index.html重命名而来。当然,我们还得在myapp文件夹下面添加一个web.cofig, 这个是从我们的View文件夹下复制过去。
注意点,通过测试,目前只有PathLocationStragety 可以成功,HashLocationStragety 没有成功,不知道为什么。其次,一定要将前端路由配置到MVC的路由中去,并且必须命中返回index.cshtml的那个View, 否则,当我们在前端某个deep link 下刷新会报404.
posted @
2024-06-20 23:12
kongshu
阅读(
13 )
评论()
编辑
收藏
举报