web 浏览器内核 || 服务端渲染

312 阅读5分钟
整理一篇浏览器内核的零碎概念知识,记录下大概原理相关的点。


浏览器内核

浏览器内核webkit

webkit是 水果 发起的开源浏览器引擎,有众多的实现:Qt,chromium,android,safari。


主要包括:

  • WebCore
  • JavascriptCore(默认js引擎)

       排版渲染引擎,根据javascript提供的桥接接口,提供给Javascript访问DOM的能力。结合浏览器加载url流程理解,html描述--->css--->js访问Dom结构。


javascript引擎

google出名的V8引擎, 性能更优,替换掉了JavascriptCore。

  1. 已经用在了android(4.4开始),chromium等。   
  2. nodejs也用的v8引擎。


tip

  1. chromium---开源  浏览器
  2. chrome ---非开源  浏览器
  3. chromium类似是chrome的试验版浏览器。出新功能先尝试,后移植到chrome上。
  4. android开源,里面浏览器用的是chromium。



渲染 术语

  • SSR: 服务端渲染 serve-side Rendering ,就是在服务器上,将客户端或者通用应用程序渲染成HTML。
  • CSR:Client-side Rendering,也就是在浏览器中渲染App。通常使用DOM。
  • Prerender:预渲染,也就是在构建时,运行客户端应用程序,这样将它的初始状态捕获为静态HTML。
  • Isomorphism:同构。指的是服务端渲染SSR时,或者Native渲染时,复用浏览器端的Javascript组件。
  • TTFB:(time to first byte)首字节时间。也就是从点击链接到接收到第一个字节内容之间的时间。
  • FP: (首次绘制)first paint。第一次有像素对用户可见。
  • FCP:  首次内容绘制  (first contentful paint)。也就是请求内容(文章正文等)变得可见的时间。
  • TTI: Time to interactive。页面变的可交互的时间(事件绑定等)。


SSR 

指在服务器中生成整个页面的HTML,以此相应请求的技术。

避免了在客户端上,进行数据获取的额外往返(round-trips)和模板处理。

  1. 更利于SEO
    1. 爬虫不会执行任何脚本(google据说另外)。 用MVVM这类框架,dom元素都是根据js动态生成的,供爬虫脚本抓取的会比较少。   不利于Seo
    2. 服务端渲染,返回给客户端的已经是执行了javascript脚本的最终HTML。 爬虫可爬。
  2. 更利于首屏渲染
    1. 直接返回的是html字串,返回时间更短。      尤其针对像单页应用,加载东西不会那么多,首页白屏时间短。

缺点:在服务器上生成页面会有一定的耗时,可能会导致较慢的首字节时间TTFB

eg:Netflix服务器渲染,相对于静态的落地页面,同时为交互繁重的页面预拉取JS,为这些重要客户端页面提供更快的加载能力。


大多都是hydration:

  • React 使用renderToString() ,或者Next.js
  • VUE 使用官方渲染指南,或者Nuxt
  • Angular 有Universal


静态渲染

staticRendering,静态渲染在构建时进行,并提供快速的FP FCP 和TTI。

与SSR的区别,它还致力于实现始终如一的快速首字节时间。因为界面的HTML不必动态生成,通常情况下,静态渲染,意味着为每个URL提前生成HTML文件,通过预先 生成HTML响应,可将静态html部署到多个CDN来利用边缘缓存,也就是页面静态化。页面静态化的选择很多,

无需执行太多js,区别 预渲染页面

提前为每个url生成单独的html文件 (也是缺点)

页面静态化的工具:gatsby、Jekyl 和 Metalsmith(静态)


静态渲染 和 预渲染 之间的区别:

静态渲染页面,无需执行太多客户端JS就可以交互,而预渲染也改进了单页面的FP或者FCP,由于是单页面应用,因此,必须等待客户端启动过程,通过这样来使页面真正具有可交互性。


测试方法: 

  1. 禁用javascript并加载创建的网页。
  2. chrome DevTool减慢网络速度,测:在页面变的可交互之前,已经下载了多少javascript。

    预渲染:通常需要更多的javascript来实现交互,并且往往这些javascript,比静态渲染使用的渐进增强方法更加复杂。


    CSR客户端渲染

    The PRPL pattern: (这种模式待定)

    • Push critical resources for the initial URL route.
    • Render initial route.
    • Pre-cache remaining routes.
    • Lazy-load and create remaining routes on demand.
    严控javascript预算,压缩工作,尽可能少的RTT(Round-Trip Time:往返时延)中提供内容,

    使用HTTP/2 ServerPush 或 <link rel=preload> 可以更快的提供关键脚本和数据,助解析器更快的完成工作。

    缺点:

    随着项目变大,javascript库增多,polyfill和第三方代码更多,这些代码会竞争处理能力,并通常必须在渲染页面内容之前完成处理。    需考虑代码分割,并确保延时加载javascript。

    交互性比较少的页面,建议考虑服务端渲染SSR来做。


    通用渲染Rehydration

    将 服务器渲染 和 CSR 结合起来。


    缺点:

    明显,用户体验。    会对可交互时间,产生负面影响。 即使改善了首次绘制。 

    由于js特性,Rehydration问题往往比延迟交互更复杂。  


    当前解决方案:

    为了不让本地js再去请求数据,将ui相应数据序列化,将数据以script标签的形式存放在html文件中,结果是生成的html文档中会有大量重复的片段。


    方案评估:

    mobile-friendly test,可帮助你测测试你选择的方法是否符合预期。帮助展示google爬虫徐然页面的预览,执行javascript的后序列化的html内容,以及渲染过程中,发生的错误。

    静态渲染和服务端渲染:尤其适用于对js交互性较低的场景。


    PWA

    Progressive Web App : 渐进式增强WEB应用


    pwa包含的核心功能和特性如下:

    1. Web App Manifest
    2. Service Worker
    3. Cache API 缓存
    4. Push&Notification 推送与通知
    5. Background Sync 后台同步
    6. 响应式设计


    Umi SSR

    serverless server-side rendering