Vue.js 可以用于构建客户端应用程序,组件的代码在浏览器中运行,并输出 DOM 元素。同时,Vue.js 还可以在 Node.js 环境中运行,它可以将同样的组件渲染为字符串并发送给浏览器。这实际上描述了 Vue.js 的两种渲染方式,即客户端渲染(client-side rendering,CSR),以及服务端渲染(server-side rendering,SSR)。另外,Vue.js 作为现代前端框架,不仅能够独立地进行 CSR 或 SSR,还能够将两者结合,形成所谓的同构渲染(isomorphic rendering)。我们将讨论CSR、SSR 以及同构渲染之间的异同,以及 Vue.js 同构渲染的实现机制。
在设计软件时,我们经常会遇到这样的问题:“是否应该使用服务端渲染?”这个问题没有确切的答案,具体还要看软件的需求以及场景。想要为软件选择合适的架构策略,就需要我们对不同的渲染策略做到了然于胸,知道它们各自的优缺点。服务端渲染并不是一项新技术,也不是一个新概念。在 Web 2.0之前,网站主要负责提供各种各样的内容,通常是一些新闻站点、个人博客、小说站点等。这些站点主要强调内容本身,而不强调与用户之间具有高强度的交互。当时的站点基本采用传统的服务端渲染技术来实现。例如,比较流行的 PHP/JSP 等技术。下图给出了服务端渲染的工作流程图:
(1) 用户通过浏览器请求站点。
(2) 服务器请求 API 获取数据。
(3) 接口返回数据给服务器。
(4) 服务器根据模板和获取的数据拼接出最终的 HTML 字符串。
(5) 服务器将 HTML 字符串发送给浏览器,浏览器解析 HTML 内容并渲染。
当用户再次通过超链接进行页面跳转,会重复上述 5 个步骤。可以看到,传统的服务端渲染的用户体验非常差,任何一个微小的操作都可能导致页面刷新。
后来以 AJAX 为代表,催生了 Web 2.0。在这个阶段,大量的SPA(single-page application)诞生,也就是接下来我们要介绍的 CSR 技术。与 SSR 在服务端完成模板和数据的融合不同,CSR 是在浏览器中完成模板与数据的融合,并渲染出最终的 HTML 页面。下图给出了 CSR 的详细工作流程:
客户端向服务器或 CDN 发送请求,获取静态的 HTML 页面。注意,此时获取的 HTML 页面通常是空页面。在 HTML 页面中,会包含