了解 Vue SSR 这一篇足以

简介: 了解 Vue SSR 这一篇足以

文章目录


1 - 什么是服务器端渲染?

server side render 前端页面的产生是由服务器端生成的,我们就称之为服务端渲染

1.1 新建server文件夹

server

1.2 生成一个node项目

npm init -y

1.3 安装express

express 官方文档

npm install express --save

1.4 服务端渲染小案例

app.js

const express = require('express')
const app = express()
const port = 3000
// 当路径为跟路径,返回完整的html片段
app.get('/', (req, res) => res.send(`
    <html>
      <body>
        <h1>hi,hello</h1>
      </body>
    </html>
`))
app.listen(port, () => console.log(`Example app listening on port ${port}!`))

1.5 运行查看效果

node app.js

1.6 打开浏览器

http://localhost:3000

1.7 右键查看源代码

总结:所谓的服务端渲染值得是页面的内容完全是由服务端侧决定到底要展示出什么内容

2 - 什么是客户端渲染?

client side render 服务端只提供json格式的数据,渲染成什么样子由客户端通过js控制

通过vite快速创建一个基于vue框架的客户端渲染样例

2.1 新建client文件夹

client

2.2 生成一个vue项目

我们使用vite工具快速生成一个vue项目,https://vitejs.dev/

npm init @vitejs/app client-vue-app --template vue

2.3 安装依赖并启动

cd vue-app
npm install (or `yarn`)
npm run dev (or `yarn dev`)

2.4 浏览器查看效果

http://localhost:8080

2.5 查看源代码

结论:通过查看源代码我们发现,源代码并没有显示我们页面中实际渲染的内容,我们只看到一个main.js文件,和一个id为app的根元素,所以我们知道网页内容是通过js来动态的进行渲染的,js运行在浏览器,浏览器也就是客户端,这种由浏览器端的js做主导渲染网页内容的方式,我们就称之为客户端渲染

思考题:如何得知一个网站是哪种方式的渲染?

3 - 客户端渲染vs服务端渲染

客户端渲染我们叫做CSR渲染方式,服务端渲染我们叫做SSR渲染

3.1 运行架构对比

说明

CSR执行流程:浏览器加载html文件 -> 浏览器下载js文件 -> 浏览器运行vue代码 -> 渲染页面

SSR执行流程:浏览器加载html文件 -> 服务端装填好内容 -> 返回浏览器渲染

3.2 开发模式对比

CSR:前后端通过接口JSON数据进行通信,各自开发互不影响

SSR:前后端分工搭配复杂,前端需要写好html模板交给后端,后端装填模板内容返给浏览器

3.3 特点优势总结

客户端渲染(CSR) 服务端渲染(SSR)
首次渲染时间 很短
seo支持 良好
前后端分工开发效率

思考:如果我们的项目既想要使用vue高效率的开发项目,同时还想要首屏渲染时间很短,那该怎么办?

4 - vue框架中的服务端渲染

为了解决第3章节提出的问题,目前我们的vue组件都是在浏览器侧通过js渲染出来的,所以首次加载时间很慢,那么我们把vue组件交给服务端负责渲染,渲染为完整内容之后直接返给客户端,是不是就可以可以解决既想渲染快,还想继续使用vue进行开发的问题了?

vue ssr基础使用

4.1 新建vue-ssr文件夹

vue-ssr

4.2 把server文件夹中的文件拷贝进来

4.3 安装必要依赖

npm install vue vue-server-renderer --save

4.4 vue服务端渲染最小demo

app.js

const Vue = require('vue')
const server = require('express')()
const renderer = require('vue-server-renderer').createRenderer()
server.get('*', (req, res) => {
  const app = new Vue({
    data: {
      url: req.url
    },
    template: `<div>访问的 URL 是:{{ url }}</div>`,
  })
  renderer.renderToString(app, (err, html) => {
    if (err) throw err
    res.send(html)
  })
})
server.listen(8888,() => console.log(`Example app listening on port 8888!`))

4.5 浏览器访问

http://localhost:8888

4.6 查看源代码

结论:我们通过在服务器端渲染vue组件的方式,让网页中又有了完整的内容,这样我们就可以既使用了vue开发又节省了首次渲染时间

4.7 遗留问题

修改app.js,添加一个button元素并使用vue的方式绑定click事件

const Vue = require('vue')
const server = require('express')()
const renderer = require('vue-server-renderer').createRenderer()
server.get('*', (req, res) => {
  const app = new Vue({
    data: {
      url: req.url
    },
    template: 
    `<div>
      访问的 URL 是:{{ url }}
      <button @click="alert('123')">click me!</button>
    </div>`,
  })
  renderer.renderToString(app, (err, html) => {
    if (err) throw err
    res.send(html)
  })
})
server.listen(8888,() => console.log(`Example app listening on port 8888!`))

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

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

5 - 理解同构理念

一套vue(react)代码,在服务端执行一次,在客户端再执行一次,就做同构

const app = new Vue({
    data: {
      url: req.url
    },
    template: 
    `<div>
      访问的 URL 是:{{ url }}
      <button @click="alert('123')">click me!</button>
    </div>`
})

上面所示的vue代码,我们在服务端的执行保持不变,只要我们把这段代码在客户端再重新执行一遍,不就可以拥有原本vue应用的所有特性了么,确实如此,不过这个过程的难度太大,我们现在只需要理解,所谓的同构是指:同一套vue代码在服务端执行一次在客户端再执行一次

  1. 服务端执行完成渲染解决了首次加载速度慢的问题
  2. 浏览器执行解决了绑定事件及恢复vue本身特性的问题

6 - Nuxt.js框架使用

nuxt.js是一套使用vue框架开发应用的服务端渲染框架,提供了开箱即用的功能

1. 使用nuxt.js创建一个ssr项目

npm create nuxt-app <项目名>

按照提示选择项目之后完成创建,需要注意,这一步要选择ssr

2. 启动项目

cd vue-ssr-app
npm run dev

http://localhost:3000

3. 查看源代码

显然,我们看到了网页上有实际渲染的内容,这是服务端负责的渲染

4. 搭建首页

pages/index.vue

在nuxt.js生成的项目中我们依旧像之前一样写单文件组件.vue代码,ElementUI组件也可以正常使用

<template>
  <div class="container">
    <Logo />
    <div class="articleList">
      <el-collapse>
        <el-collapse-item title="一致性 Consistency" name="1">
          <div>与现实生活一致:与现实生活的流程、逻辑保持一致,遵循用户习惯的语言和概念;</div>
        </el-collapse-item>
      </el-collapse>
    </div>
  </div>
</template>
<script>
export default {}
</script>
<style>
.container{
  padding:0 200px;
}
.articleList{
  margin-top:30px;
}
</style>

5. 异步数据获取

https://axios.nuxtjs.org/

1. 认识asyncData方法

asyncData方法会在组件(限于页面组件)每次加载之前被调用。它可以在服务端或路由更新之前被调用,你可以利用 asyncData方法来获取数据,Nuxt.js 会将 asyncData 返回的数据融合组件 data 方法返回的数据一并返回给当前组件

官网推荐使用的请求方式 https://axios.nuxtjs.org/

async asyncData({ $axios }) {
  const ip = await $axios.$get('http://icanhazip.com')
  return { ip }
},
data(){
  return {
     name:'cp'
  }
}
----合并完之后的data数据----
{
   name:'cp',
   ip
}

2. 获取文章列表(移动端项目)

async asyncData ({ $axios }) {
    const url = 'http://ttapi.research.itcast.cn/app/v1_1/articles?channel_id=0&timestamp=1606309443970&with_top=1'
    const res = await $axios.$get(url)
    // eslint-disable-next-line no-console
    console.log('文章数据列表:', res)
    return {
      list: res.data.results
    }
 }

3. 渲染接口数据

<el-collapse>
    <el-collapse-item v-for="item in list" :key="item.id" :title="item.title.slice(0,40)">
      <div>评论数:{{ item.comm_count }}  点赞数:{{ item.like_count }}</div>
    </el-collapse-item>
</el-collapse>

4. 预览效果并查看源代码

结论:我们完成了既使用vue开发模式,又实现了服务端渲染模式,nice~

7- 总结

7.1 服务端渲染和客户端渲染各自指什么?有什么特点?

SSR 服务端渲染  网页内容由服务端生成   首屏时间短  有利于seo
CSR 客户端渲染  vue、react框架渲染方式  spa都是客户端渲染   首屏渲染时间长不利于seo

7.2 同构的本质是什么?

一份vue代码在服务端渲染一遍  然后在客户端再渲染一遍
服务端渲染解决了首屏显示快  客户端渲染是需要把事件、响应式特性等vue经典的特性都绑回去
我们既可以使用vue的开发模式 又可以享受俩种渲染方式的优势

7.3 Nuxt.js中如何实现异步数据获取(asyncData方法)?

asyncData函数时Nuxtjs框架内置的一个函数  
执行结果和和data进行融合  一起返给当前组件 



相关文章
|
3天前
|
JavaScript
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
这篇文章介绍了在Vue项目中如何实现执行删除等危险操作时的二次确认机制,使用Element UI的`el-popconfirm`组件来弹出确认框,确保用户在二次确认后才会执行删除操作。
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
|
3天前
|
JavaScript
如何创建一个Vue项目(手把手教你)
这篇文章是一篇手把手教读者如何创建Vue项目的教程,包括使用管理员身份打开命令行窗口、找到存放项目的位置、通过vue-cli初始化项目、填写项目信息、进入项目目录、启动项目等步骤,并提供了一些常见第三方库的引入方法。
如何创建一个Vue项目(手把手教你)
|
3天前
|
前端开发
StringBoot+Vue实现游客或用户未登录系统前、可以浏览商品等信息、但是不能购买商品或者加入购物车等操作。登录系统显示用户的登录名(源码+讲解)
这篇文章介绍了使用StringBoot+Vue实现用户登录状态判断的方法,包括前端加载用户信息和后端设置session的源码示例。
|
3天前
|
JavaScript
在Vue中使用Avue、配置过程以及实际应用
这篇文章介绍了作者在Vue项目中集成Avue组件库的完整过程,包括安装、配置和实际应用,展示了如何利用Avue实现动态表单和数据展示的功能。
在Vue中使用Avue、配置过程以及实际应用
|
3天前
|
JavaScript
如何在Vue页面中引入img下的图片作为背景图。../的使用
这篇文章介绍了在Vue页面中如何引入`img`目录下的图片作为背景图,提供了两种使用相对路径的方法。第一种是使用`../assets/img/`作为路径引入图片,第二种是使用`../../assets/img/`作为路径。文章还展示了使用这些方法的代码实现和效果展示,并鼓励读者学无止境。
如何在Vue页面中引入img下的图片作为背景图。../的使用
|
3天前
|
JavaScript
如何通过点击商品的信息(图片或者文字)跳转到更加详细的商品信息介绍(前后端分离之Vue实现)
该博客文章介绍了如何在Vue 2框架下实现前后端分离的商品信息展示和详情页跳转,包括排序筛选、详情展示、加入购物车和分享功能。
如何通过点击商品的信息(图片或者文字)跳转到更加详细的商品信息介绍(前后端分离之Vue实现)
|
3天前
|
JavaScript
在Vue中使用Swiper轮播图、同时解决点击轮播图左右切换按钮不生效的问题、同时将轮播图抽离出为一个公共组件
这篇文章介绍了在Vue中如何使用Swiper插件创建轮播图,解决Swiper左右切换按钮不生效的问题,并展示了如何将Swiper轮播图抽离成一个可复用的公共组件,同时提供了详细的安装、配置和优化建议。
在Vue中使用Swiper轮播图、同时解决点击轮播图左右切换按钮不生效的问题、同时将轮播图抽离出为一个公共组件
|
3天前
|
JavaScript
如何查看Vue使用的版本
这篇文章介绍了如何在项目中查看Vue及其相关库的版本信息,比如element-ui和element-china-area-data。要查看Vue的版本,需要查看项目中的`package.json`文件,在`dependencies`部分可以找到Vue的版本号。如果需要查询不同版本的兼容性,可以访问相应的官方文档或资源网站。
|
3天前
|
存储 JavaScript 前端开发
Vue中如何通过三元运算符来展示不同的操作
这篇文章讲述了在Vue中如何使用三元运算符结合v-if指令来根据订单的不同状态展示不同的操作按钮,例如在待发货状态显示退款按钮,在待付款或完成状态显示删除按钮。
|
3天前
|
JavaScript 开发者
在Vue中引入Message,弹窗提示错误信息
这篇文章讲述了在Vue CLI项目中如何处理异常,通过引入Message组件实现弹窗提示错误信息,帮助开发者排查和解决webpack等问题。