客户端渲染 服务端渲染及代码实现

1 定义

1.1 客户端渲染

在此之前,页面的渲染流程:

  • 浏览器请求一个HTML文本
  • 渲染进程解析HTML文本 构建DOM树
  • 解析HTML的同时,如果遇到内联样式或者样式脚本,则下载构建样式规则,若遇到JavaScript脚本,则会下载并执行
  • 渲染进程将DOM树和样式规则两者合并渲染成渲染树
  • 渲染进程生成布局树
  • 对布局树进行分层,栅格化每一层,得到合成帧
  • 将合成帧信息发送到GPU进程显示到界面中

此时在执行JS脚本的时候,HTML页面已经开始解析和构建DOM树,JS脚本知识动态改变DOM树结构,这个就是动态渲染,也就是客户端渲染,其特点就是由浏览器构建DOM树,并不断请求后台数据文件(如JS),再修改DOM树

优点:

  • 前后分离,开发效率高
  • 用户体验好,当网页或者部分内容做成SPA单页面应用时,用户点击不会出现频繁的跳转

缺点:

  • 由于需要在浏览器进行拼接,前端的响应会比较慢,特别是首屏响应
  • 不利于搜索引擎优化

1.2 服务端渲染

在浏览器请求url的时候,服务端将需要的HTML文本组装好,并返回给浏览器,这个HTML文本被浏览器解析之后,不需要经过JS脚本的执行,直接可以构建出希望的DOM树并展示到页面是,这个服务器组装HTML页面生成DOM树的过程,叫做服务端渲染

优点:

  • 不占用前端资源,前端耗时少,响应快
  • 有利于SEO优化,后端有完整的HTML页面,爬虫更容易爬取信息

缺点:

  • 不利于前后端分离,开发效率降低
  • 对于HTML解析,前端速度加快,但同时加大服务器压力

在这里插入图片描述

一般会使用服务端渲染和客户端渲染结合的方式:首屏使用服务端渲染,其他页面使用客户端渲染。这样可以保证首屏的加载速度,也完成了前后端分离

Vue 服务端渲染

初始简易版:

const Vue = require('vue');
const server = require('express')();
const renderer = require('vue-server-renderer').createRenderer();

server.get('*', (rep, res) => {
   

    //创建Vue实例
    const app = new Vue({
   
        data: {
   
            url: rep.url
        },
        template: '<div>当前访问的url是:{
   {url}}</div>'
    })

    //创建一个渲染器
    renderer.renderToString(app, (err, html) => {
   
        if (err) {
   
            res.status(500).end('Internal Server Error');
            return;
        }
        //返回HTML,并插入Vue实例中的HTML片段
        res.end(
            `<!DOCTYPE html>
            <html lang="en">
            <head>
                <meta charset="UTF-8">
                <meta http-equiv="X-UA-Compatible" content="IE=edge">
                <meta name="viewport" content="width=device-width, initial-scale=1.0">
                <title>Hello SSR</title>
            </head>
            <body>
                ${
     html}
            </body>
            </html>`
        )
    })
})

server.listen(8080,()=>{
   
    console.log("服务器运行在8080端口");
})

在浏览器中:
在这里插入图片描述
浏览器所请求到的源码:
在这里插入图片描述

使用模板的方式

模板方式的使用:
server.js

const fs = require('fs');

const Vue = require('vue');
const server = require('express')();
const VueServerRenderer = require('vue-server-renderer');

server.get('*', (rep, res) => {
   

    //创建Vue实例
    const app = new Vue({
   
        data: {
   
            url: rep.url
        },
        template: '<div>The url currently accessed is:{
   {url}}</div>'
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值