V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Ritr
V2EX  ›  前端开发

最近真的在学技术了不骗你

  •  
  •   Ritr · 285 天前 · 1532 次点击
    这是一个创建于 285 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近我在做一个海外电商网站的二次开发工作,它的前端基于 React 技术栈,后端是基于 PHP 技术栈。这个网站主要是面对 C 端用户的,但是它的技术选型好像并不适合。下面我以产品列表页面来举例说明一下 当用户点击进入产品列表页面时,整体流程如下

    1. 浏览器通过前端路由导航到产品页面
    2. 等待 DOM 树渲染完毕后,发出 XHR 请求获取产品列表
    3. 使用 js 将产品列表渲染到 DOM 上
    

    看起来好像没什么问题,但实际体验却有点糟糕

    首先进入页面时,由于没有数据,因此页面是一片空白,但是还是会渲染 DOM ,只是给人的感觉是空白的而已,不管你的 diff 算法再快,也得花时间吧。

    其次 XHR 请求花费了一定的时间。

    最后将数据再次渲染到 DOM 的过程也花费了一定的时间。

    我们总结一下,一共渲染了两次,发送请求一次,并且这个过程无法并行,毕竟 JS 是单线程,别看它异步,再异步它也不好使。

    那么如果说用户点击这个页面的时候,服务器直接返回已经渲染好数据的页面,浏览器只做一次渲染那体验会好很多。如果服务端是 JSP 这种技术,还得生成一遍 HTML 页面,也会花费一点时间。

    那么根据实际业务来看,由于产品并不是经常更新(几天或者几周才可以更新一个产品),所以最好的方案就是将这个页面静态化,然后设置下这个页面的有效期,过期则重新生成。这样不仅节省了服务器生成 HTML 的时间,还可以充分利用 CDN 来缓存页面。

    5 条回复
    wonderfulcxm
        1
    wonderfulcxm  
       285 天前 via iPhone
    那用 next.js ssg
    flmn
        2
    flmn  
       285 天前
    Next.js 就是来解决你的问题的
    fd9xr
        3
    fd9xr  
       285 天前 via iPhone
    那你就从 PHP 把 init data 传给 React 啊
    chuck1in
        4
    chuck1in  
       285 天前
    这种静态网站好像就是有这种问题。如果用服务端渲染就没这个问题,从服务器拿 html 的时候已经带上了业务数据了。

    说简单一些,其实就是个加载延迟的问题。解决方法其实很简单,你做一个 loading 然后在空白的时候展示这个 loadng 就可以了。
    Ritr
        5
    Ritr  
    OP
       285 天前
    已经在学 nextjs
    @flmn
    @wonderfulcxm
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2487 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 05:18 · PVG 13:18 · LAX 21:18 · JFK 00:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.