服务端渲染(ssr)

1.概述

1.什么是 SSR?

Vue.js 是一个用于构建客户端应用的框架。默认情况下,Vue 组件的职责是在浏览器中生成和操作 DOM。然而,Vue 也支持将组件在服务端直接渲染成 HTML 字符串,作为服务端响应返回给浏览器,最后在浏览器端将静态的 HTML“激活”(hydrate) 为能够交互的客户端应用。

一个由服务端渲染的 Vue.js 应用也可以被认为是“同构的”(Isomorphic) 或“通用的”(Universal),因为应用的大部分代码同时运行在服务端和客户端。

2.为什么要用 SSR?

与客户端的单页应用 (SPA) 相比,SSR 的优势主要在于:

更快的首屏加载:这一点在慢网速或者运行缓慢的设备上尤为重要。服务端渲染的 HTML 无需等到所有的 JavaScript 都下载并执行完成之后才显示,所以你的用户将会更快地看到完整渲染的页面。除此之外,数据获取过程在首次访问时在服务端完成,相比于从客户端获取,可能有更快的数据库连接。这通常可以带来更高的核心 Web 指标评分、更好的用户体验,而对于那些“首屏加载速度与转化率直接相关”的应用来说,这点可能至关重要。

统一的心智模型:你可以使用相同的语言以及相同的声明式、面向组件的心智模型来开发整个应用,而不需要在后端模板系统和前端框架之间来回切换。

更好的 SEO:搜索引擎爬虫可以直接看到完全渲染的页面。

使用 SSR 时还有一些权衡之处需要考量:

开发中的限制。浏览器端特定的代码只能在某些生命周期钩子中使用;一些外部库可能需要特殊处理才能在服务端渲染的应用中运行。

更多的与构建配置和部署相关的要求。服务端渲染的应用需要一个能让 Node.js 服务器运行的环境,不像完全静态的 SPA 那样可以部署在任意的静态文件服务器上。

更高的服务端负载。在 Node.js 中渲染一个完整的应用要比仅仅托管静态文件更加占用 CPU 资源,因此如果你预期有高流量,请为相应的服务器负载做好准备,并采用合理的缓存策略。

在为你的应用使用 SSR 之前,你首先应该问自己是否真的需要它。这主要取决于首屏加载速度对应用的重要程度。例如,如果你正在开发一个内部的管理面板,初始加载时的那额外几百毫秒对你来说并不重要,这种情况下使用 SSR 就没有太多必要了。然而,在内容展示速度极其重要的场景下,SSR 可以尽可能地帮你实现最优的初始加载性能。

2.SSR vs. SSG

静态站点生成 (Static-Site Generation,缩写为 SSG),也被称为预渲染,是另一种流行的构建快速网站的技术。如果用服务端渲染一个页面所需的数据对每个用户来说都是相同的,那么我们可以只渲染一次,提前在构建过程中完成,而不是每次请求进来都重新渲染页面。预渲染的页面生成后作为静态 HTML 文件被服务器托管。

SSG 保留了和 SSR 应用相同的性能表现:它带来了优秀的首屏加载性能。同时,它比 SSR 应用的花销更小,也更容易部署,因为它输出的是静态 HTML 和资源文件。这里的关键词是静态:SSG 仅可以用于消费静态数据的页面,即数据在构建期间就是已知的,并且在多次部署期间不会改变。每当数据变化时,都需要重新部署。

如果你调研 SSR 只是为了优化为数不多的营销页面的 SEO (例如 /、/about 和 /contact 等),那么你可能需要 SSG 而不是 SSR。SSG 也非常适合构建基于内容的网站,比如文档站点或者博客。事实上,你现在正在阅读的这个网站就是使用 VitePress 静态生成的,它是一个由 Vue 驱动的静态站点生成器。

3.渲染一个应用

让我们来看一个 Vue SSR 最基础的实战示例。

创建一个新的文件夹,cd 进入
执行

npm init -y

在 package.json 中添加 “type”: “module” 使 Node.js 以 ES modules mode 运行
执行
npm install vue
创建一个 example.js 文件:

// 此文件运行在 Node.js 服务器上
import { createSSRApp } from 'vue'
// Vue 的服务端渲染 API 位于 `vue/server-renderer` 路径下
import { renderToString } from 'vue/server-renderer'

const app = createSSRApp({
  data: () => ({ count: 1 }),
  template: `<button @click="count++">{{ count }}</button>`
})

renderToString(app).then((html) => {
  console.log(html)
})

接着运行:
node example.js

它应该会在命令行中打印出如下内容:

<button>1</button>
renderToString() 接收一个 Vue 应用实例作为参数,返回一个 Promise,当 Promise resolve 时得到应用渲染的 HTML。当然你也可以使用 Node.js Stream API 或者 Web Streams API 来执行流式渲染。

然后我们可以把 Vue SSR 的代码移动到一个服务器请求处理函数里,它将应用的 HTML 片段包装为完整的页面 HTML。接下来的几步我们将会使用 express:

执行npm install express
创建下面的 server.js 文件:
js

const express = require('express');
const { createSSRApp } = require('vue');
const { renderToString } = require('vue/server-renderer'); 

const server = express()

server.get('/', (req, res) => {
  const app = createSSRApp({
    data: () => ({ count: 1 }),
    template: `<button @click="count++">ssr测试按钮:{{ count }}</button>`
  })

  renderToString(app).then((html) => {
    res.send(`
    <!DOCTYPE html>
    <html>
      <head>
        <title>Vue SSR Example</title>
      </head>
      <body>
        <div id="app">${html}</div>
      </body>
    </html>
    `)
  })
})

server.listen(3000, () => {
  console.log('ready')
})

最后,执行 node server.js,访问 http://localhost:3000。你应该可以看到页面中的按钮了。

运行发现,页面成功显示了button按钮,但是可惜的是,没有成功绑定事件,点击无效,事实上除了事件没有绑定之外,服务器端虽然完成了vue的渲染,但是给到客户端的时候已经成了字符串了,一系列我们熟悉的vue应用的特性,我们都无法使用,比如数据响应式更新,那该怎么办呢?

为了解决以上问题,我们需要引入一个新的概念,称作 同构.

 

### 回答1: 服务端渲染(Server Side Rendering,简称 SSR)是一种将应用程序的 HTML 和 CSS 部分渲染到服务器端,再将渲染结果发送给客户端的技术。这样做的目的是为了提高首屏加载速度,并且在某些情况下改善 SEO。 传统的客户端渲染(Client Side Rendering,简称 CSR)技术中,客户端接收到的是一段空白的 HTML 文档,再通过 JavaScript 来动态渲染页面。这种方式对于用户体验来说不够优秀,因为首屏加载需要等待 JavaScript 执行完成。 服务端渲染的技术能够解决这个问题,因为客户端接收到的是一个完整的 HTML 文档,能够立即呈现。用户在操作页面时,再通过 JavaScript 来完成剩余的渲染和交互。 服务端渲染并不适用于所有场景,在选择是否使用 SSR 时需要考虑到应用程序的特定要求和需求。但对于需要提高首屏加载速度和改善 SEO 的应用程序来说,服务端渲染是一个不错的选择。 ### 回答2: 服务端渲染(Server-Side Rendering,简称SSR)是指在服务端动态生成页面内容,然后将渲染好的页面传输给浏览器进行展示的一种网页渲染技术。 传统的客户端渲染,即前端渲染,是指将数据请求发送给服务端,然后由浏览器的JavaScript代码异步获取数据,再将数据和模板进行渲染生成页面。这种渲染方式可以实现灵活的交互效果,但也存在一些问题,如首屏加载较慢、对搜索引擎的SEO不友好等。 而SSR则是在服务端生成完整的HTML页面,然后将渲染好的页面返回给浏览器展示。它的主要优点有: 1. 更快的首屏加载速度:由于服务端渲染页面时已经生成完整的HTML,用户在打开网页时能够立即看到内容,提高了页面的加载速度和用户体验。 2. 更好的SEO:由于搜索引擎爬虫主要是获取HTML内容进行分析,使用SSR能够保证搜索引擎能够正确的读取页面的内容,提高网站的搜索引擎排名。 3. 更好的可访问性:由于服务端渲染生成的页面已经包含了完整的内容和结构,相对于客户端渲染,能够更好地支持辅助功能和设备兼容性。 尽管SSR在首屏加载和SEO方面具有很大的优势,但也存在一些限制和挑战。比如对于复杂的交互和动态内容的处理较为复杂,需要更多的服务器负载和带宽资源。此外,SSR还需要考虑页面的缓存策略和更新机制,以保证渲染的页面始终能够与最新的数据保持同步。 总之,服务端渲染(SSR)是一种能够提高网页加载速度、改善SEO和可访问性的网页渲染技术。尽管它也有一些限制和挑战,但在某些场景下,特别是对于需要快速首屏加载和SEO友好的网站来说,SSR是一种值得采用的渲染方式。 ### 回答3: 服务端渲染(Server-Side Rendering,简称SSR)是指在服务器端进行网页内容的渲染,生成完整的HTML页面后再发送给客户端的一种网页渲染方式。相对于传统的客户端渲染(Client-Side Rendering,简称CSR),SSR具有以下特点: 1. SEO友好:由于搜索引擎爬虫只能解析HTML页面,传统的CSR渲染会导致搜索引擎无法获取到完整的页面内容。而使用SSR时,服务器端渲染出的HTML页面包含了完整的内容,有利于SEO优化和搜索引擎收录。 2. 更快的首次加载速度:在CSR中,页面初始化的过程需要先下载基础的HTML结构和JavaScript代码,然后再通过JavaScript请求并渲染数据,这个过程会产生较长的白屏时间。而SSR在服务器端就生成了完整的HTML页面,用户首次访问时可以直接加载这个HTML,减少首次加载时间。 3. 更好的用户体验:因为SSR在服务器端就渲染了完整的HTML页面,用户可以更快地看到网页的基本内容,提升了用户体验。而在CSR中,由于需要等待JavaScript的下载和执行,用户可能会出现闪动的页面或者突然出现的内容,造成用户体验不佳。 4. 兼容性好:由于SSR在服务器端渲染,不依赖于浏览器的特定功能或版本,对于不支持JavaScript或禁用JavaScript的浏览器仍然可以渲染出完整的页面。 5. 服务器压力较大:相对于CSR,SSR需要在服务器端进行页面渲染,因此对服务器的压力较大,特别是当网站的流量较大时。服务器需要消耗更多的计算资源和内存来渲染页面并返回给客户端。 总结来说,服务端渲染SSR)通过在服务器端生成完整的HTML页面,提供了更好的SEO友好性、首次加载速度和用户体验,但增加了服务器的压力。它适用于对SEO要求较高、首次加载速度重要的网站。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值