前端路由可以和后端路由一起组合使用吗?

2021-07-27 08:45:04 +08:00
 James369
前端路由挺有意思的一个东西,url 的路由直接在浏览器完成拦截跳转,都绕过后端服务器了。

所以对前端路由这个机制还是不大理解,比如在浏览器地址栏直接输入一个 url 地址,也会被前端拦截掉吗?

那后端比如 nginx 设置的路由规则还有效吗?
3439 次点击
所在节点    程序员
17 条回复
loadinger
2021-07-27 08:57:17 +08:00
一般要么用前端的要么用后端的吧...
dmjob2015222
2021-07-27 08:58:06 +08:00
你说的是单页面应用吧,第一次必须走服务器,后续的就不用了,浏览器就可以控制了
cw2k13as
2021-07-27 08:58:28 +08:00
没有绕过后端服务器,有效,后端路由优先前端路由,后端要配置重定向到 index 前端路由才生效,这是 history 模式。hash 模式也是一样就是
lybcyd
2021-07-27 09:08:18 +08:00
这个要看你的部署机制。如果是分开部署,想让前端路由生效,nginx 本来就要进行设置,肯定不会走后端。如果是先后端解析再把页面当作模板返回,那就是后端路由为主了,这种情况下需要后端的 controller 设置一下通配符,把未定义路由统一交给前端解析。
James369
2021-07-27 09:17:46 +08:00
@cw2k13as 后端配置重定向到 index 之后的话,前端还能收到原始的 url 路径吗? 感觉有点懵
cczeng
2021-07-27 09:42:02 +08:00
@James369 默认就是请求后端路由,然后后端没有路由会导致 404,用 nginx 把 404 的直接重定向到 index,前端就能收到路由事件变更,这是单页应用程序的规则。另一种就是 hash 模式,hash 模式直接被浏览器当做一个标记跳转不会触发资源请求,所以服务器也收不到任何事件。
darknoll
2021-07-27 09:43:27 +08:00
前端路由不刷新网页
cw2k13as
2021-07-27 09:57:13 +08:00
@James369 只是重定向了,路径没变,index 可以解析到
LiubaiQ
2021-07-27 10:24:24 +08:00
最近刚好在看前端路由库源码( react-router 依赖的前端路由库 history ),核心原理大致如下:

1.Browser History:调用浏览器内置对象 history 的 pushState/replaceState,可以做到更改 document.URL 而不重载页面(重发请求)的效果,document.URL 就是地址栏中显示的地址,也是发送请求时 referrer 首部的值,通过监听浏览器事件 popState/hashChange 来监听前端路由的变化,路由改变时执行所有通过 listen 注册进来的回调;

2.Hash History : 基本和 1 中一样,只是 1 中是以整个 URL 做路由管理,这里则是以 URL 的以部分(片段标识符,Hash )做路由管理,hash 的改变(直接给 location.hash 赋值)同样不会导致页面重载,监听 hashChange 来执行 listen 注册进来的回调;

前端路由还有重要的一点,就是对不同资源的请求(资源路径不同),必须要返回同一个 HTML 文件,因为 F5,Ctrl+F5,刷新按钮等行为会导致页面重载,重新向地址栏中的 URL 发送请求,如果响应个 404 或者其他页面就有点尴尬了。。。
otakustay
2021-07-27 10:31:28 +08:00
在浏览器里输入地址再回车,一定是先到后端路由再回前端,前端代码初始化后才能拦截路由的
lanlanye
2021-07-27 11:26:50 +08:00
一般用了前端路由就不会在 nginx 上设置路由了吧……
通过前后分离的方式,前端路由控制切换切面,然后根据需要展示的内容向后端发起请求,除了初次加载以外,前后端的传输内容只有具体数据。
codehz
2021-07-27 12:03:19 +08:00
前端可以拦截直接输入 url 的情况( service worker
但是第一次访问肯定不行,所以如果是基于路径的话还是得后端配合)
netwjx
2021-07-27 12:32:20 +08:00
前后端两个路由全部都生效

所以需要都进行设置

确实很麻烦, 所以才需要框架之类工具减少重复
robinlovemaggie
2021-07-27 13:39:54 +08:00
简单的说就是:
前端渲染页面的路由是服务于挂载点 baseUrl 之后静态页面导航,后端路由是负责(含)baseUrl 之前的所有动态路由导航。
libook
2021-07-27 14:05:09 +08:00
如果一个域名就只有一个单页面应用,那么可以用 hash 或者拦截 path 变化来实现路由。如果希望一个域名用不同 path 来 host 多个单页面应用,可以用只用 hash 。

混合使用理论上也可以实现,但是得看具体什么需求,多数情况下为了方便管理和维护,还是建议使用一套方案。
molvqingtai
2021-07-27 14:10:14 +08:00
前端路由有两种模式,一种 hash 和 history
hash 改变请求不会发到后端
history 就是正常请求,所以需要 nginx 重定向到 index.html
darknoll
2021-07-27 19:01:59 +08:00
@molvqingtai 什么叫 history 是正常请求,正因为 history 的 pushState 不会刷新页面的同时修改 url,所以才能用来做前端路由。在此模式下,刷新网页必须要后端支持返回 index.html

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/791960

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX