腾讯这个网页刷新技术怎么实现的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
balabalaguguji
V2EX    程序员

腾讯这个网页刷新技术怎么实现的?

  •  4
     
  •   balabalaguguji 2021-06-02 09:58:37 +08:00 11115 次点击
    这是一个创建于 1593 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请看: https://work.weixin.qq.com/api/doc/90001/90144/92388

    切换文档时顶部和左边的菜单都不会刷新,只有文档内容区域刷新了,表现很像 vue 的单页应用,局部刷新内容。

    但是右键查看网页源码又可以看到所有的内容,这样对搜索引擎就很友好。

    这种可以做到局部刷新,但是又可以查看到源码的是怎么实现的?有人知道吗?

    另外我看他切换文档时接口请求回来的数据有 html 的,有 md 格式的,还有 text 格式的,这是为什么

    第 1 条附言    2021-06-02 11:32:17 +08:00
    懂了,他这个效果跟 pjax 是一样的,第一次请求是完整的服务端渲染,后面点击切换文档是 ajax + pushState,然后修改对应位置的 innerHTML 。

    学到了,这个技术不错,用户体验和搜索引擎都有照顾到
    55 条回复    2021-06-03 17:46:51 +08:00
    IsaacYoung
        1
    IsaacYoung  
       2021-06-02 10:00:30 +08:00
    服务端渲染吧
    ReferenceE
        2
    ReferenceE  
       2021-06-02 10:01:43 +08:00 via Android
    张口就只知道 vue,上古的 frame 技术虽然淘汰了但是设计理念你可以看看
    murmur
        3
    murmur  
       2021-06-02 10:02:18 +08:00
    打断点不就看出来了,改了 innerHtml 的,右键看不到源码,你那是审查元素不是查看源码
    TomatoYuyuko
        4
    TomatoYuyuko  
       2021-06-02 10:04:06 +08:00
    这实现方法很多啊,拿 jquery 都能写一个,你说的 vue 指的是 vue 的动态路由吧。。。
    balabalaguguji
        5
    balabalaguguji  
    OP
       2021-06-02 10:08:14 +08:00
    @ReferenceE 但是没看到有用 frame
    murmur
        6
    murmur  
       2021-06-02 10:08:19 +08:00
    js_doc_apiShow_cnt 对这个元素的子树修改打断点,然后你就非常明显的看到一个 innerHtml 的修改
    balabalaguguji
        7
    balabalaguguji  
    OP
       2021-06-02 10:08:54 +08:00
    @murmur #3 是查看源码,跟审查元素我还是能区分出来的,你可以看下
    balabalaguguji
        8
    balabalaguguji  
    OP
       2021-06-02 10:11:27 +08:00
    @murmur #6 这种方式是可以做到查看源码还能看到内容?这个我不是很清楚
    xiyuesaves
        9
    xiyuesaves  
       2021-06-02 10:11:27 +08:00
    有种技术叫 pjax,和这个的效果挺像的
    lp7631010
        10
    lp7631010  
       2021-06-02 10:12:16 +08:00
    类似于 pjax
    LeeReamond
        11
    LeeReamond  
       2021-06-02 10:14:00 +08:00
    楼上说的不对,有一个嘲讽提到 vue 的意义不明,另一个说审查元素不是源码的也是意义不明。

    它这个应该单纯 LZ 理解错了吧,他的服务器渲染和动态渲染是同步的,第一次访问时候调用服务器渲染结果,之后接管按钮逻辑,很单纯
    ymlluo
        12
    ymlluo  
       2021-06-02 10:14:28 +08:00
    barba.js 类似的效果
    AoEiuV020
        13
    AoEiuV020  
       2021-06-02 10:14:48 +08:00   2
    @balabalaguguji 右键查看源码那也是新的网页请求了,自然是完整的内容,
    这网站看 network 就知道了,点击没有页面跳转,只是调接口获取展示新内容,然后改一下地址栏的地址,
    murmur
        14
    murmur  
       2021-06-02 10:15:18 +08:00
    @LeeReamond IE 的查看元素,是只能看到静态的服务器渲染,chrome 的查看元素,innerHTML 调整直接变了
    eason1874
        15
    eason1874  
       2021-06-02 10:17:40 +08:00
    1 、服务端根据 path 渲染页面并输出完整 HTML,当用户直接请求页面时输出是完整 HTML 。
    2 、提供一个内容 API,监听页面链接点击事件并拦截,然后通过 AJAX 请求接口拿到模块内容并替换,同时通过 History API 修改地址栏的 path 成为正确内容路径。

    当你查看源码时,显示的不是 AJAX 修改的结果,而是浏览器根据当前 path 重新请求一次的结果。

    原理类似 Turbolinks,只不过 Turbolinks 是直接请求原始页面,而这个是专门做了一个 API 去提供页面内容。
    IvanLi127
        16
    IvanLi127  
       2021-06-02 10:19:29 +08:00
    ssr+csr 就是这个效果
    dianso
        17
    dianso  
       2021-06-02 10:20:31 +08:00 via Android
    mdax
    akatquas
        18
    akatquas  
       2021-06-02 10:21:47 +08:00
    简单看了代码之后,发现 会出现一个请求 ,https://work.weixin.qq.com/api/docFetch/fetchCnt?id=<id> 。 说明在客户端的代码更新是通过 vue 来做的,溯源 这个 XHR 的调用栈能发现 beforeRouteUpdate -> routerAdapter,请求返回体里面确实会有相应的 document html tag,可以直接渲染到节点。

    那么首屏的怎么来的? SSR 咯。

    至于请求数据多格,说负面就是冗余浪费带宽,说正面就是为了完备性考虑,不同页面用不同类型的数据。


    @ReferenceE 一楼说的是 “表现形式很像 Vue 的单页应用”, 你的阅读能力有很一些提升空间嗷。
    YidaZh
        19
    YidaZh  
       2021-06-02 10:22:59 +08:00
    典型的单页应用 + 服务端渲染。。。
    balabalaguguji
        20
    balabalaguguji  
    OP
       2021-06-02 10:29:20 +08:00
    @YidaZh #19 说得太泛了,要细节
    mekingname
        21
    mekingname  
       2021-06-02 10:29:32 +08:00   1
    1. 当你直接访问任何一个 URL 的时候,它都会直接给出后端渲染的完整页面
    2. 当你在网页里面点击某个连接的时候,它通过 Ajax 请求增加的 html 代码并替换现有的部分。

    而查看源代码,`view-source:网址`这种形式,本质上还是会发起新的请求,所以这里对应的`网址`会使用后端渲染的页面。于是就会给你造成这种错觉。

    有一种很简单的办法来证明我所说的:你首先访问任何一个页面,例如: https://work.weixin.qq.com/api/doc/90001/90144/92392
    然后,复制里面一段文字。

    然后,你再单独访问另外一个页面,例如: https://work.weixin.qq.com/api/doc/90001/90144/92394 你可以看到,如果你查看这后一个页面的源代码,你是无法找到前一个页面的文字的。这就说明只有你当前直接输入网址访问的这个页面是后端渲染,你通过点击连接打开的其它页面是异步加载。
    balabalaguguji
        22
    balabalaguguji  
    OP
       2021-06-02 10:29:47 +08:00
    @akatquas #18 感谢认真的分析
    xz410236056
        23
    xz410236056  
       2021-06-02 10:38:40 +08:00
    hexo 博客用的 Pjax
    C603H6r18Q1mSP9N
        24
    C603H6r18Q1mSP9N  
       2021-06-02 10:48:53 +08:00
    点击菜单有 ajax 请求啊。。。就是一个简单的 ajax 而已
    myCupOfTea
        25
    myCupOfTea  
       2021-06-02 10:49:09 +08:00
    ssr+csr 都是这个效果
    比如 react 这边的 Nextjs
    我估计 vue 的 Nust.js 应该也差不多
    Kininaru
        26
    Kininaru  
       2021-06-02 10:49:36 +08:00
    服务端渲染。点了另一篇文章,浏览器发了个请求,能看出来服务端把渲染好的内容用 json 返回过来了
    ![请求]( https://my.files.chromium.link/images/%7DRR~U0BY0H(H7@2@JJ4I[LP.png)
    wowbaby
        27
    wowbaby  
       2021-06-02 10:51:28 +08:00
    它这个是 ajax + history.pushState(),而且每个页面应该是生成的静态页面
    yunyuyuan
        28
    yunyuyuan  
       2021-06-02 10:57:47 +08:00
    就是 pjax 的效果。ajax 请求数据或者网页,处理后直接插到 innerHTML,然后 pushState 修改 url,偷换柱。
    balabalaguguji
        29
    balabalaguguji  
    OP
       2021-06-02 10:57:54 +08:00
    @xz410236056 #23 感谢,看了下,确实好像是效果上是这类东西,但是腾讯这个没用到你这个库
    um1ng
        30
    um1ng  
       2021-06-02 11:22:55 +08:00
    Next.js or Nuxt.js
    mscb
        31
    mscb  
       2021-06-02 11:25:27 +08:00 via Android
    带服务端渲染功能的单页面程序
    balabalaguguji
        32
    balabalaguguji  
    OP
       2021-06-02 11:25:46 +08:00
    @mekingname #21 嗯,懂了,感谢
        33
    luqingliang  
       2021-06-02 11:26:39 +08:00
    经典 vue
    balabalaguguji
        34
    balabalaguguji  
    OP
       2021-06-02 11:26:49 +08:00
    @AoEiuV020 #13 感谢,之前还以为查看源码是不会重新请求的,懂了
    cw2k13as
        35
    cw2k13as  
       2021-06-02 11:27:26 +08:00
    看了下这个网站就是拿 vue 写的,如果说搜索引擎可以搜索就是用了 ssr
    balabalaguguji
        36
    balabalaguguji  
    OP
       2021-06-02 11:28:35 +08:00
    @eason1874 #15 是这样!感谢,学习到了。
    balabalaguguji
        37
    balabalaguguji  
    OP
       2021-06-02 11:29:52 +08:00
    @wowbaby #27 嗯,是的
    balabalaguguji
        38
    balabalaguguji  
    OP
       2021-06-02 11:30:15 +08:00
    @yunyuyuan #28 嗯,已经懂了,是这样的
    lscho
        39
    lscho  
       2021-06-02 11:33:52 +08:00
    这随便用哪种技术都可以实现,用 jquery 都可以。

    但看腾讯这个,就是简单的服务端渲染。首次加载的话,整个页面都渲染。用户点击的话,只渲染文档区域,然后修改 url 就行了。
    jkmf
        40
    jkmf  
       2021-06-02 11:38:54 +08:00
    chrome 装个 wappalyzer 插件就可以看到用的什么技术栈了
    thtznet
        41
    thtznet  
       2021-06-02 11:54:45 +08:00
    局部刷新,很多技术都可以实现,连微软的 MVC Razor 都可以
    ifyour
        42
    ifyour  
       2021-06-02 12:44:57 +08:00
    可以服务端渲染( SSR )的单页应用( SPA )
    nanxiaobei
        43
    nanxiaobei  
       2021-06-02 13:11:16 +08:00
    比微信文档的体验要好,微信文档太丑了
    uadw
        44
    uadw  
       2021-06-02 13:24:36 +08:00
    挺好的一个功能
    ragnaroks
        45
    ragnaroks  
       2021-06-02 13:26:30 +08:00
    VUE+SSR,jsdigger 可劫持分析
    newmlp
        46
    newmlp  
       2021-06-02 13:52:49 +08:00
    我还以为啥了不起的技术
    sutra
        47
    sutra  
       2021-06-02 14:07:16 +08:00
    jQuery
    A388
        48
    A388  
       2021-06-02 14:15:26 +08:00
    @ReferenceE 关键是这个页面确实是 vue 写的
    gdrk
        50
    gdrk  
       2021-06-02 15:51:21 +08:00
    服务端首屏渲染,后续 vue 交互
    maplelin
        51
    maplelin  
       2021-06-02 16:01:41 +08:00
    vue+ssr,基本大厂前端标配技能了
    Al0rid4l
        52
    Al0rid4l  
       2021-06-02 21:02:51 +08:00
    ssr 吧, 因为你(Chrome)查看源代码(注意不是审查元素)的时候实际上会对当前 URL 重新发起请求, 所以后端渲染了, 但是你切换侧边栏选项, 其实还是前端渲染
    这两者都可以通过查看网络请求确认
    luckyc
        53
    luckyc  
       2021-06-03 10:24:45 +08:00
    https://work.weixin.qq.com/api/docFetch/fetchCnt?id=24984
    这用 jquery 就是一分钟的事情啊.
    KisekiRemi
        54
    KisekiRemi  
       2021-06-03 16:52:06 +08:00
    你下个 vuetools 去看看,本来就是 vue 做的
    xbchaonba
        55
    xbchaonba  
       2021-06-03 17:46:51 +08:00
    不就是 vue 写的吗
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2546 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 02:00 PVG 10:00 LAX 19:00 JFK 22:00
    Do have faith in what you're doing.
    ubao 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