前端路由可以和后端路由一起组合使用吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
James369
V2EX    程序员

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

  •  
      James369 2021-07-27 08:45:04 +08:00 4234 次点击
    这是一个创建于 1606 天前的主题,其中的信息可能已经有所发展或是发生改变。
    前端路由挺有意思的一个东西,url 的路由直接在浏览器完成拦截跳转,都绕过后端服务器了。

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

    那后端比如 nginx 设置的路由规则还有效吗?
    第 1 条附言    2021-07-27 09:26:53 +08:00
    实际项目中一般是怎么用的?
    17 条回复    2021-07-27 19:01:59 +08:00
    loadinger
        1
    loadinger  
       2021-07-27 08:57:17 +08:00
    一般要么用前端的要么用后端的吧...
    dmjob2015222
        2
    dmjob2015222  
       2021-07-27 08:58:06 +08:00
    你说的是单页面应用吧,第一次必须走服务器,后续的就不用了,浏览器就可以控制了
    cw2k13as
        3
    cw2k13as  
       2021-07-27 08:58:28 +08:00
    没有绕过后端服务器,有效,后端路由优先前端路由,后端要配置重定向到 index 前端路由才生效,这是 history 模式。hash 模式也是一样就是
    lybcyd
        4
    lybcyd  
       2021-07-27 09:08:18 +08:00
    这个要看你的部署机制。如果是分开部署,想让前端路由生效,nginx 本来就要进行设置,肯定不会走后端。如果是先后端解析再把页面当作模板返回,那就是后端路由为主了,这种情况下需要后端的 controller 设置一下通配符,把未定义路由统一交给前端解析。
    James369
        5
    James369  
    OP
       2021-07-27 09:17:46 +08:00
    @cw2k13as 后端配置重定向到 index 之后的话,前端还能收到原始的 url 路径吗? 感觉有点懵
    cczeng
        6
    cczeng  
       2021-07-27 09:42:02 +08:00   1
    @James369 默认就是请求后端路由,然后后端没有路由会导致 404,用 nginx 把 404 的直接重定向到 index,前端就能收到路由事件变更,这是单页应用程序的规则。另一种就是 hash 模式,hash 模式直接被浏览器当做一个标记跳转不会触发资源请求,所以服务器也收不到任何事件。
    darknoll
        7
    darknoll  
       2021-07-27 09:43:27 +08:00
    前端路由不刷新网页
    cw2k13as
        8
    cw2k13as  
       2021-07-27 09:57:13 +08:00
    @James369 只是重定向了,路径没变,index 可以解析到
    LiubaiQ
        9
    LiubaiQ  
       2021-07-27 10:24:24 +08:00   4
    最近刚好在看前端路由库源码( 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
        10
    otakustay  
       2021-07-27 10:31:28 +08:00
    在浏览器里输入地址再回车,一定是先到后端路由再回前端,前端代码初始化后才能拦截路由的
    lanlanye
        11
    lanlanye  
       2021-07-27 11:26:50 +08:00
    一般用了前端路由就不会在 nginx 上设置路由了吧……
    通过前后分离的方式,前端路由控制切换切面,然后根据需要展示的内容向后端发起请求,除了初次加载以外,前后端的传输内容只有具体数据。
    codehz
        12
    codehz  
       2021-07-27 12:03:19 +08:00 via Android
    前端可以拦截直接输入 url 的情况( service worker
    但是第一次访问肯定不行,所以如果是基于路径的话还是得后端配合)
    netwjx
        13
    netwjx  
       2021-07-27 12:32:20 +08:00
    前后端两个路由全部都生效

    所以需要都进行设置

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

    混合使用理论上也可以实现,但是得看具体什么需求,多数情况下为了方便管理和维护,还是建议使用一套方案。
    molvqingtai
        16
    molvqingtai  
       2021-07-27 14:10:14 +08:00   1
    前端路由有两种模式,一种 hash 和 history
    hash 改变请求不会发到后端
    history 就是正常请求,所以需要 nginx 重定向到 index.html
    darknoll
        17
    darknoll  
       2021-07-27 19:01:59 +08:00   1
    @molvqingtai 什么叫 history 是正常请求,正因为 history 的 pushState 不会刷新页面的同时修改 url,所以才能用来做前端路由。在此模式下,刷新网页必须要后端支持返回 index.html
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4627 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 01:09 PVG 09:09 LAX 17:09 JFK 20:09
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86