详解基于vue的服务端渲染框架NUXT


Posted in Javascript onJune 20, 2018

Nuxt

随着现在vue和react的流行,许多网站都做成了SPA,确实提升了用户体验,但SPA也有两个弱点,就是SEO和首屏渲染速度。为了解决单页应用的痛点,基于vue和react的服务端渲染应运而生。由于公司的框架采用的是vue,所以就简单的研究了一下基于vue的服务端渲染框架——NUXT。在vue的官网有关于服务端渲染的详细介绍,而NUXT集成了利用Vue开发服务端渲染的应用所需要的各种配置,也集成了Vue2、vue-router、vuex、vux-meta(管理页面meta信息的),利用官方的脚手架,基本上是傻瓜式操作,不用写路由配置,不用写webpcak配置就可以跑起来一个基于服务端渲染的SPA。

Nuxt特性

NUXT的特性包括:

  1. 基于 Vue.js
  2. 自动代码分层
  3. 服务端渲染
  4. 强大的路由功能,支持异步数据
  5. 静态文件服务
  6. ES6/ES7 语法支持
  7. 打包和压缩 JS 和 CSS
  8. HTML头部标签管理
  9. 本地开发支持热加载
  10. 集成ESLint
  11. 列表项目
  12. 支持各种样式预处理器: SASS、LESS、 Stylus等等

Nuxt目录结构

通过vue init nuxt-community/starter-template <project-name>生成的文件目录结构如下:

详解基于vue的服务端渲染框架NUXT

其中有一些目录(layouts、pages、static、store、nuxt.config.js、package.json)是Nuxt保留的,不可以更改,需要注意一下。

Nuxt路由

Nuxt中的一大特点就是路由无需手动配置,会根据pages下的文件路径自动生成一套路由。如果路由中需要带参数,只需将pages下的文件已下划线_作为前缀即可。例如pages下的目录结构如下:

pages/
--| user/
-----| index.vue
-----| one.vue
-----| _id.vue
--| index.vue

Nuxt自动生成的路由配置为:

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

而在vue文件中可以针对路由的参数进行校验,例如在pages/users/_id.vue文件中

export default {
 validate ({ params }) {
  // Must be a number
  return /^\d+$/.test(params.id)
 }
}

如果校验方法返回的值不为 trueNuxt 将自动加载显示 404 错误页面。而这个错误页面需要写在指定的位置,也就是layout中error页面。接下来就来介绍有关视图相关的东西。

Nuxt视图

可以在layouts目录下创建自定义的布局,可以通过更改 layouts/default.vue 文件来扩展应用的默认布局。需要在布局文件中添加 <nuxt/> 组件用于显示页面的主体内容,感觉跟vue中的slot方法类似。例如在默认布局中增加header和footer,这样每个页面都会加上header和footer。

<template>
 <div>
  <header>VUE SRR DEMO</header>
  <nuxt/>
  <footer>COPYRIGHT LXY</footer>
 </div>
</template>

而上面说到的error页面,可以通过在layouts下增加error.vue文件来修改默认的错误页面。该页面可以接受一个error参数。

<template>
 <div class="container">
  <h1 v-if="error.statusCode === 404">页面不存在</h1>
  <h1 v-else>应用发生错误异常</h1>
  <p class="goback">
   <nuxt-link to="/">返回首页</nuxt-link>
  </p>
 </div>
</template>

<script>
export default {
 props: ['error'],
 layout: 'self-aside'
}
</script>

也可以给某个页面指定特定的模板,做到个性化布局。例如在上面的error页面中,我指定了一个self-aside的模板

以上所说的都是有关布局和路由相关的东西,而还没有讲到有关服务端渲染的知识,究竟 Nuxt 是如何做到SSR的呢,关键人物要出场了。

Nuxt asyncData 方法

Nuxt 扩展了 Vue.js,增加了一个叫 asyncData 的方法,使得我们可以在设置组件的数据之前能异步获取或处理数据。这个函数可了不得了,有了它,我们可以先从服务员拿到数据,在服务端解析好,拼成HTML字符串,返回给浏览器。

asyncData方法会在组件每次加载之前被调用,它可以在服务端或路由更新之前被调用。 可以利用 asyncData方法来获取数据,Nuxt 会将 asyncData 返回的数据融合组件 data 方法返回的数据一并返回给当前组件。这个方法只能用在页面组件中,在componets下在公共组件是不能调用该方法的,Nuxt 不会扩展增强该目录下 Vue 组件。

因为 asyncData 方法是在组件 初始化 前被调用的,所以在方法内是没有办法通过 this 来引用组件的实例对象。

async asyncData ({ params, error }) {
  const { data } = await axios.get('https://jsonplaceholder.typicode.com/users')
  return { 
   users: data.slice(0,5)
  }
 },

上面demo中asyncData返回的数据赋值给了users,这样我就可以在页面中像使用data里的数据一样去使用users,例如我在template下循环出users

<ul>
  <li v-for="item in users" :key="item.name">{{item.name}}</li>
 </ul>

我现在去查看源代码,发现页面中li中的数据已经渲染过来了,也就是达到了服务端渲染。

详解基于vue的服务端渲染框架NUXT

附一张Nuxt渲染的流程图:

详解基于vue的服务端渲染框架NUXT

总结

整体感觉Nuxt还是很好上手的,利用脚手架,看看官方文档,写写demo,大致就能了解整个流程。但其中的具体实现细节,还需要去认真看看 https://ssr.vuejs.org/zh/

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 学习技巧
Feb 17 Javascript
对xmlHttp对象的理解
Jan 17 Javascript
聊一聊Vue.js过渡效果
Sep 07 Javascript
javascript基本数据类型及类型检测常用方法小结
Dec 14 Javascript
Bootstrap php制作动态分页标签
Dec 23 Javascript
微信小程序 本地存储及登录页面处理实例详解
Jan 11 Javascript
jQuery ajax实现省市县三级联动
Mar 07 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
Aug 16 Javascript
Canvas放置反弹效果随机图形(实例)
Aug 17 Javascript
Vue开发实现吸顶效果的示例代码
Aug 21 Javascript
jQuery实现的分页插件完整示例
May 26 jQuery
OpenLayers加载缩放控件使用方法详解
Sep 25 Javascript
JS中call和apply函数用法实例分析
Jun 20 #Javascript
微信小程序模拟cookie的实现
Jun 20 #Javascript
JS伪继承prototype实现方法示例
Jun 20 #Javascript
通过jquery.cookie.js实现记住用户名、密码登录功能
Jun 20 #jQuery
Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件
Jun 19 #Javascript
Vue兼容ie9的问题全面解决方案
Jun 19 #Javascript
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
Jun 19 #Javascript
You might like
如何使用php判断所处服务器操作系统的类型
2013/06/20 PHP
PHP取整函数:ceil,floor,round,intval的区别详细解析
2013/08/31 PHP
PHP单例模式详细介绍
2015/07/01 PHP
PHP下载文件的函数实例代码
2016/05/18 PHP
laravel学习教程之关联模型
2016/07/30 PHP
下载站控制介绍字数显示的脚本 显示全部 隐藏介绍等功能
2009/09/19 Javascript
JavaScript 变量基础知识
2009/11/07 Javascript
使用非html5实现js板连连看游戏示例代码
2013/09/22 Javascript
JS 实现列表与多选框选择附预览动画
2014/10/29 Javascript
javascript学习指南之回调问题
2016/04/23 Javascript
使用node.js中的Buffer类处理二进制数据的方法
2016/11/26 Javascript
vue+axios新手实践实现登陆的示例代码
2018/06/06 Javascript
JavaScript实现构造json数组的方法分析
2018/08/17 Javascript
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
2019/01/15 Javascript
微信小程序引入VANT组件的方法步骤
2019/09/19 Javascript
王纯业的Python学习笔记 下载
2007/02/10 Python
Python logging模块用法示例
2018/08/28 Python
对python中词典的values值的修改或新增KEY详解
2019/01/20 Python
详解python 模拟豆瓣登录(豆瓣6.0)
2019/04/18 Python
django-filter和普通查询的例子
2019/08/12 Python
Python获取二维数组的行列数的2种方法
2020/02/11 Python
Python实现猜年龄游戏代码实例
2020/03/25 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
Django项目创建及管理实现流程详解
2020/10/13 Python
详解python polyscope库的安装和例程
2020/11/13 Python
CSS3 函数技巧 用css 实现js实现的事情(clac Counters Tooltip)
2017/08/15 HTML / CSS
html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
2013/01/09 HTML / CSS
家长会学生演讲稿
2014/04/26 职场文书
不尊敬老师检讨书范文
2014/11/19 职场文书
小学班主任经验交流材料
2014/12/16 职场文书
同学聚会通知书
2015/04/20 职场文书
go 实现简易端口扫描的示例
2021/05/22 Golang
在CSS中使用when/else的方法
2022/01/18 HTML / CSS
如何设置多台电脑共享打印机?多台电脑共享打印机的方法
2022/04/08 数码科技
Go结合Gin导出Mysql数据到Excel表格
2022/08/05 Golang
CSS 鼠标选中文字后改变背景色的实现代码
2023/05/21 HTML / CSS