服务端渲染(SSR)

客户端渲染和传统服务端渲染的问题

  • SPA应用有两个非常明显的问题:

    • 首屏渲染慢
    • 不利于 SEO
  • 传统的服务端渲染又存在:

    • 应用的前后端部分完全耦合在一起,在前后端协同开发方面会有非常大的阻力;
    • 前端没有足够的发挥空间,无法充分利用现在前端生态下的一些更优秀的方案;
    • 由于内容都是在服务端动态生成的,所以服务端的压力较大;
    • 相比目前流行的 SPA 应用来说,用户体验一般;

现代化的服务端渲染(同构)

  1. 客户端发起请求
  2. 服务端渲染首屏内容 + 生成客户端 SPA 相关资源
  3. 服务端将生成的首屏资源发送给客户端
  4. 客户端直接展示服务端渲染好的首屏内容
  5. 首屏中的 SPA 相关资源执行之后会激活客户端 Vue
  6. 之后客户端所有的交互都由客户端 SPA 处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ipXMBwvW-1599615479735)(image/…/…/image/同构渲染.png)]

  • 这种方式简而言之就是:

    • 通过服务端渲染首屏直出,解决首屏渲染慢以及不利于 SEO 问题
    • 通过客户端渲染接管页面内容交互得到更好的用户体验
  • 但是凡事都不会事完美的,如果要使用服务端渲染,就一定会存在相对的问题

    • 开发条件所限。浏览器特定的代码,只能在某些生命周期钩子函数 (lifecycle hook) 中使用;一些
      外部扩展库 (external library) 可能需要特殊处理,才能在服务器渲染应用程序中运行。
    • 涉及构建设置和部署的更多要求。与可以部署在任何静态文件服务器上的完全静态单页面应用程序
      (SPA) 不同,服务器渲染应用程序,需要处于 Node.js server 运行环境。
    • 更多的服务器端负载。在 Node.js 中渲染完整的应用程序,显然会比仅仅提供静态文件的 server
      更加大量占用 CPU 资源 (CPU-intensive - CPU 密集),因此如果你预料在高流量环境 (high traffic)
      下使用,请准备相应的服务器负载,并明智地采用缓存策略。

什么情况下使用SSR?

其实根据上面的介绍,我们可以总结出两点

  1. 首屏渲染速度是否真的重要?
  2. 是否真的需要SEO?

第二点也是最直接判断是否需要使用SSR的条件了,如果你的项目一定需要SEO,那么你也不用纠结,那一定是需要SSR的,反之你才可以酌情考虑

Nuxt.js的基础介绍及用法

什么是Nuxt.js

  • 一个基于Vue.js生态的第三方开源服务端渲染应用框架
  • 它可以帮我们轻松的使用Vue.js技术栈构建同构应用
  • Nuxt.js

使用Nuxt.js的情况

  • 初始项目
  • 已有的Node.js服务端项目
    • 直接把Nuxt当作一个中间件集成到Node Web Server中
  • 现有的Vue.js项目
    • 非常熟悉Nuxt.js
    • 至少百分之10的代码改动

初始化Nuxt.js应用的方式

  1. 手动创建
  2. 使用create-nuxt-app

下面介绍以下手动创建的方式

  1. 省略创建文件夹初始化过程…
  2. 新建 package.json 文件来设定如何运行 nuxt
{"name": "my-app","scripts": {"dev": "nuxt"}
}
  1. 安装nuxt
$ npm i nuxt -D
  1. 创建pages目录

    • *Nuxt.js 会依据 pages 目录中的所有 .vue 文件生成应用的路由配置。
$ mkdir pages
  1. 创建pages/index.vue页面
<template><div><h1>Hello Nuxt.js</h1></div>
</template><script>
export default {name: 'HomePage'
}
</script><style></style>
  1. 最后启动项目
$ npm run dev
  • Nuxt.js 会监听 pages 目录中的文件更改,因此在添加新页面时无需重新启动应用程序。

Nuxt.js路由

  • Nuxt.js依据pages目录解构自动生成vue-router模块的路由配置

路由导航

三种方式介绍

  • a标签

    • 会刷新整个页面,不要使用
  • nuxt-link组件

    • 和router-link是一样的用法
  • 编程式导航

    • 和Vue中的编程式导航用法是一样的

那么我们主要来复习一下router-link和编程式导航的用法

<template><div><h1>About page</h1><!-- router-link 导航链接组件 --><h2>导航链接组件</h2><router-link to="/">首页</router-link><!-- 编程式导航 --><h2>编程式导航</h2><button @click="onClick">首页</button></div>
</template><script>
export default {name: 'About',methods: {onClick() {this.$router.push('/')}}
}
</script>

动态路由

  • 在Nuxt.js里面定义带参数的动态路由,需要创建对应的以下划线作为前缀的Vue文件或目录

以下目录结构:

pages/
--| _slug/
-----| comments.vue
-----| index.vue
--| users/
-----| _id.vue
--| index.vue

Nuxt.js自动生成对应的路由配置表:

router: {routes: [{name: 'index',path: '/',component: 'pages/index.vue'},{name: 'users-id',path: '/users/:id?',component: 'pages/users/_id.vue'},{name: 'slug',path: '/:slug',component: 'pages/_slug/index.vue'},{name: 'slug-comments',path: '/:slug/comments',component: 'pages/_slug/comments.vue'}]
}
  • 其中users-id 的路由路径带有 :id? 参数,表示该路由是可选的。如果你想将它设置为必选的路由,需要在 users/_id 目录内创建一个 index.vue 文件。

嵌套路由

  • 创建内嵌子路由,你需要添加一个 Vue 文件,同时添加一个与该文件同名的目录用来存放子视图组件。
  • 父组件(.vue文件) 内需要增加 <nuxt-child/> 用于显示子视图内容。

文件结构:

pages/
--| users/
-----| _id.vue
-----| index.vue
--| users.vue

Nuxt.js 自动生成的路由配置如下:

router: {routes: [{path: '/users',component: 'pages/users.vue',children: [{path: '',component: 'pages/users/index.vue',name: 'users'},{path: ':id',component: 'pages/users/_id.vue',name: 'users-id'}]}]
}

自定义路由配置

需要在nuxt.config.js文件中进行配置

module.exports = {router: {// 默认值是 /, 如果修改了base的值则默认会以修改的值开头,注意结尾处必须跟/base: '/abc/',  // http://localhost:3000/abc/ // 自定义路由表// routes: 数组,路由配置表// resolve: 解析路由组件路径extendRoutes(routes, resolve) {routes.push({name: 'Hello',path: '/hello',component: resolve(__dirname, 'pages/about.vue')})}}
}

更多路由配置

视图

  • 包括应用模板、页面、布局和 HTML 头部等内容。

模板

  • 只需要在 src 文件夹下(默认是应用根目录)创建一个 app.html 的文件。

默认模板是:

<!DOCTYPE html>
<html {{ HTML_ATTRS }}><head {{ HEAD_ATTRS }}>{{ HEAD }}</head><body {{ BODY_ATTRS }}>{{ APP }}</body>
</html>
  • 渲染的内容会注入到{{ APP }}中

添加自定义内容:

<!DOCTYPE html>
<html {{ HTML_ATTRS }}><head {{ HEAD_ATTRS }}>{{ HEAD }}</head><body {{ BODY_ATTRS }}><h1>app.html</h1>{{ APP }}</body>
</html>

布局

Nuxt.js 允许你扩展默认的布局,或在 layout 目录下创建自定义的布局。
相当于一个简便的嵌套路由

  • 默认布局

    • 可通过添加 layouts/default.vue 文件来扩展应用的默认布局。
    • 只要有default.vue这个文件就会默认成为所有组件的布局组件,通过自定义布局来改变样式
    • 如果只有个别文件需要布局,则创建指定布局文件即可,不要创建default.vue文件

默认布局: 组件用于显示页面的主体内容。

<template><nuxt />
</template>

修改后的默认布局为:

<template><div><h1>layouts/default.vue 组件</h1><!-- 页面出口,类似于子路由出口 --><nuxt/></div>
</template><script>
export default {name: 'LayoutDefault'
}
</script><style></style>
  • 自定义布局

以下为layouts/foo.vue文件的内容(写法和默认的一样)

<template><div><h1> layouts/foo.vue 组件</h1><nuxt/></div>
</template><script>
export default {name: 'LayoutFoo'
}
</script><style></style>

在需要改变默认布局的组件中引入,通过layout参数改变布局组件

<template><div><h1>About page</h1></div>
</template><script>
export default {name: 'AboutPage',// 通过layout参数改变布局组件, 该参数默认值为defaultlayout: 'foo'
}
</script>

asyncData 异步数据

  • 基本用法

    • 它会将asyncData 返回的数据融合组件data方法返回数据一并给组件
    • 调用时机: 服务端渲染期间和客户端路由更新之前
  • 注意事项
    • 只能在页面组件中使用(子组件中无法使用)
    • 没有this, 因为asyncData是在组件初始化之前被调用的

上代码

<template><div><h1>Hello Nuxt.js</h1><h2>{{ title }}</h2><h2>{{ foo }}</h2><ul><li v-for="item in posts" :key="item.ide">{{item.title}}</li></ul></div>
</template><script>
import axios from "axios";
export default {name: "HomePage",// 动态页面内容有利于SEO或者是提升首屏渲染速度时候,就在asyncData中发请求拿数据async asyncData() {const { data } = await axios.get("http://localhost:3000/data.json");return { posts: data.posts, title: data.title };},data() {return {foo: 'Foo'}}
};
</script><style>
</style>

上下文对象

context对象内的变量

<script>
export default {// 上下文对象是asyncData的参数async asyncData(context) {}
}
</script>

简单使用上下文的一段代码,通过动态路由传参渲染对应的值

<template><div><h1>article page</h1><h2>{{ article.title }}</h2><p>{{ article.body }}</p></div>
</template><script>
import axios from "axios";
export default {name: "ArticlePage",async asyncData(context) {// 解构出data中的title和posts属性const { data: { title, posts } } = await axios.get("http://localhost:3000/data.json");const id = parseInt(context.params.id)// 找到posts中id和动态路由中传递的id相同的article对象const article = posts.find(item => {return item.id === id})// 最后必须返回一个,对象内是要渲染的属性return {article}},
};
</script>

服务端渲染(SSR)和Nuxt.js相关推荐

  1. 服务端渲染(SSR) 通用技术解决方案

    项目背景 服务端渲染(SSR) 通用技术解决方案的诞生来源于对 360搜索百科移动端项目的一次重构实践.而当时决定重构该项目的主要原因有以下几点: 1.  技术栈陈旧,熟悉.开发以及维护成本都较高 项 ...

  2. 服务端渲染ssr(server side render)

    目录 1 - 什么是服务器端渲染? 1.1 新建server文件夹 1.2 生成一个node项目 1.3 安装express 1.4 服务端渲染小案例 1.5 运行查看效果 1.6 打开浏览器 1.7 ...

  3. React + Koa 实现服务端渲染(SSR)

    ⚛️React是目前前端社区最流行的UI库之一,它的基于组件化的开发方式极大地提升了前端开发体验,React通过拆分一个大的应用至一个个小的组件,来使得我们的代码更加的可被重用,以及获得更好的可维护性 ...

  4. 服务端渲染SSR的理解

    服务端渲染SSR的理解 SSR服务端渲染Server Side Render就是当进行请求时,页面上的内容是通过服务端渲染生成的,浏览器直接显示服务端返回的HTML即可. 客户端渲染CSR 通常在构建 ...

  5. 服务端渲染SSR与客户端渲染

    文章目录 一.服务端渲染和客户端渲染的区别 服务端渲染(SSR -- server side render) 客户端渲染 二.使用服务端渲染(SSR)的利弊 优势 局限 三.实际应用 应用原则 举例 ...

  6. vue服务端渲染ssr

    vue服务端渲染ssr 一.SSR概念 传统web渲染技术 SPA SSR 二.webpack+vue2的实现方式 1.创建工程 2.安装依赖 3.编写一个简单的SSR 4.完整的ssr 5.代码链接 ...

  7. node+ejs实现服务端渲染SSR

    一.服务端渲染SSR 1.什么是客户端渲染和服务端渲染? 客户端渲染:客户端向服务端请求HTML页面,后端不返回完整的 HTML页面,浏览器解析HTML页面过程中如果遇到ajax数据请求,会向服务端请 ...

  8. vue服务端渲染(ssr)与普通vue的区别,ssr的基本使用

    ssr是vue的服务端渲染技术,nuxt是一个可以用来做ssr服务端渲染开发的框架. ssr是技术基础,nuxt是封装 一.什么是SSR? Vue.js 是构建客户端应用程序的框架.默认情况下,可以在 ...

  9. 搭建自己的 服务端渲染 SSR

    一.VUE SSR是什么 官方文档:https://ssr.vuejs.org/ Vue SSR(Vue.js Server-Side Rendering) 是 Vue.js 官方提供的一个服务端渲染 ...

最新文章

  1. 云端智能芯片GPGPU与编译器
  2. 解决Windows与虚拟机ubuntu之间相互直接拖动文件
  3. 2020数字中国创新大赛—算法赛开源方案复盘笔记
  4. 【蓝桥杯Java_C组·从零开始卷】第八节、集合——list详解
  5. linux mysql 停止,linux 里 重启 和停止 mysql的原理
  6. 用二分法求方程的近似解的方法
  7. 【转载】进程与线程的区别
  8. 05 基本数据类型+五大数据类型
  9. 哈理工OJ-2277-喝喝
  10. 工作说明书SOW(Statement Of Work)
  11. 代码练习——数组_实战
  12. 解决markdown-it-prism未能正确加载Languages的BUG
  13. shell调度kylin的cube构建任务
  14. 中职计算机教育 论文题目,中职学校计算机教育论文
  15. 如何搭建一个属于自己的直播平台?
  16. NOI 1789:算24
  17. ftp文件上传和下载
  18. ZZULIOJ1086: ASCII码排序(多实例测试)
  19. 电路(二)电阻电路的等效分析(附二元泰勒公式)
  20. Android5.0以上去除状态栏半透明遮罩

热门文章

  1. 旅游卡小程序分销系统开发
  2. 北大青鸟 oracle,北大青鸟oracle学习笔记31
  3. 【附源码】计算机毕业设计SSM面向智慧课堂的教学过程管理系统
  4. 抖音三联屏如何制作?影视剪辑如何制作三联屏
  5. 电脑平时好好的,今天连上了wifi,浏览器却加载不出网页,解决措施。
  6. DeepMind的新强化学习系统,是迈向通用人工智能的一步吗?
  7. Silverlight+WCF 新手实例 象棋 棋子移动-规则[将、马、士、相、炮](八)
  8. 艾美捷11-脱氢血栓烷B2研究资料
  9. 2021下半年Shake Shack将进驻杭州
  10. 面试题:阿里 天猫积分换魔盒