详解基于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面向对象之体会[总结]
Nov 13 Javascript
jQuery中的常用事件总结
Dec 27 Javascript
JS 类型转换常见方法小结
May 31 Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
Dec 20 Javascript
jQuery中用dom操作替代正则表达式
Dec 29 Javascript
Jquery中$.post和$.ajax的用法小结
Apr 28 Javascript
详解JavaScript中的blink()方法的使用
Jun 08 Javascript
Webpack 实现 Node.js 代码热替换
Oct 22 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
May 07 Javascript
vue结合element-ui使用示例
Jan 24 Javascript
Vue使用axios引起的后台session不同操作
Aug 14 Javascript
JavaScript枚举选择jquery插件代码实例
Nov 17 jQuery
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 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
2010/10/22 PHP
PHP实现GIF图片验证码
2015/11/04 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
2015/12/23 PHP
WordPress中用于创建以及获取侧边栏的PHP函数讲解
2015/12/29 PHP
PHP微信支付实例解析
2016/07/22 PHP
jquery ajax提交表单数据的两种实现方法
2010/04/29 Javascript
jquery利用拖拽方式在图片上添加热链接
2015/11/24 Javascript
利用AngularJs实现京东首页轮播图效果
2016/09/08 Javascript
jQuery EasyUI 获取tabs的实例解析
2016/12/06 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
JS实现的点击表头排序功能示例
2017/03/27 Javascript
使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件(推荐)
2018/05/01 Javascript
微信小程序实现图片上传功能
2018/05/28 Javascript
Vue与Node.js通过socket.io通信的示例代码
2018/07/25 Javascript
微信小程序实现列表页的点赞和取消点赞功能
2018/11/02 Javascript
Vue代码整洁之去重方法整理
2019/08/06 Javascript
[01:51]历届DOTA2国际邀请赛举办地回顾 TI9落地上海
2018/08/26 DOTA
python sqlobject(mysql)中文乱码解决方法
2008/11/14 Python
python实现比较两段文本不同之处的方法
2015/05/30 Python
深入解析Python中的list列表及其切片和迭代操作
2016/03/13 Python
Python PyQt4实现QQ抽屉效果
2018/04/20 Python
windows下添加Python环境变量的方法汇总
2018/05/14 Python
Python数据分析matplotlib设置多个子图的间距方法
2018/08/03 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
2019/10/01 Python
python写一个随机点名软件的实例
2019/11/28 Python
python 如何设置守护进程
2020/10/29 Python
python安装sklearn模块的方法详解
2020/11/28 Python
丝芙兰波兰:Sephora.pl
2018/03/25 全球购物
餐饮业会计岗位职责
2013/12/19 职场文书
生产总经理岗位职责
2013/12/19 职场文书
万年牢教学反思
2014/02/15 职场文书
团日活动总结
2014/04/28 职场文书
班主任个人工作反思
2014/04/28 职场文书
2015年外贸业务员工作总结范文
2015/05/23 职场文书
详解如何使用Node.js实现热重载页面
2021/05/06 Javascript
ICOM R71E和R72E图文对比解说
2022/04/07 无线电