单页应用的问题:前端
一、首屏渲染等待时间长:必须得等js加载完毕,而且执行完毕,才能渲染出首屏vue
二、seo不友好:爬虫只能拿到一个div,认为页面是空的,不利于seo(公司的宣传页会比较在意seo)npm
SSR后端
为了解决这两个问题,出现了SSR解决方案,后端渲染出完整的首屏dom结构返回,前端拿到的内容带上首屏,后续的页面操做,再用单页的路由跳转和渲染,称之为服务端渲染(server side render)服务器
弊端:架构
一、学习难度较高app
二、第三方库有时候会有问题框架
三、增长服务器压力dom
nuxt.js异步
Nuxt.js 是一个基于 Vue.js 的通用应用框架
经过对客户端/服务器基础架构的抽象组织,Nuxt.js 主要关注的是应用的 UI渲染
结论:
nuxt渲染流程:
nuxt安装
npx create-nuxt-app <项目名>
选择服务器:Koa
运行项目:npm run dev
路由
pages目录中全部 *.vue 文件自动生成应用的路由配置,新建:
pages/admin.vue 商品管理页
pages/login.vue 登陆页
若是想查看路由内容,能够去: .nuxt/router.js 文件中查看
导航
添加路由导航:layouts/default.vue
<div> <nav> <!-- 别名:n-link,NLink,NuxtLink --> <nuxt-link to="/">首页</nuxt-link> <nuxt-link to="/admin" no-prefetch>管理</nuxt-link> <nuxt-link to="/cart">购物车</nuxt-link> </nav> <!-- 页面内容占位符 --> <nuxt /> </div>
路由默认采用预加载页面的方式,若是想使用懒加载的话,能够加上 no-prefetch
动态路由
如下划线做为前缀的 .vue 文件或目录,会被定义为动态路由
// index.vue <template> <div> <h2>商品列表</h2> <ul> <li v-for="good in goods" :key="good.id"> <nuxt-link :to="`/detail/${good.id}`">{{ good.text }}</nuxt-link> </li> </ul> </div> </template> <script> export default { data() { return { goods:[ { id: 1, text: 'Web全栈架构师', price: 8999 }, { id: 2, text: '架构师', price: 19999 } ] } } } </script>
// _id.vue <template> <div> <h2>商品详情</h2> <p>{{$route.params.id}}</p> </div> </template>
嵌套路由
建立内嵌子路由,你须要添加一个.vue文件,同时添加一个与该文件同名的目录来存放子视图组件
文件结构以下
detail/_id.vue 文件
<div> <p>{{$route.params.id}}</p> </div>
detail.vue文件
<div> <h2>商品详情</h2> <!-- 路由出口 --> <nuxt-child /> </div>
nuxt-child 等效于 router-view
自定义布局
建立空白布局页面 layouts/blank.vue,用于login.vue
blank.vue 文件
<template> <div> <nuxt/> </div> </template>
页面 pages/login.vue 使用自定义布局
export default { layout: 'blank' }
自定义错误页面
建立 layouts/error.vue
<template> <div> <h1 v-if="error.statusCode === 404">页面不存在</h1> <h1 v-else>应用发生异常</h1> <p>{{error}}</p> <nuxt-link to="/">首页</nuxt-link> </div> </template> <script> export default { props: ['error'], layout: 'blank' } </script>
页面
页面组件就是Vue组件,只不过 Nuxt.js 为这些组件添加了一些特殊的配置项
给首页添加标题和meta,index.vue
export default { head(){ return{ title: '课程列表', meta: [{name: 'description', hid: 'description', content: 'page meta'}], link: [{rel: 'favicon', href: 'favicon.icon'}] } } }