之前一直都是做vue-spa单页面,不利于SEO。而便于SEO的SSR(服务器端渲染)多页应用,可以使用nuxt.js这个框架来实现

(0)nuxt安装
npx create-nuxt-app <项目名> 以下是按生成的目录文件进行学习了解
(1)资源目录assets 与 static目录 - 资源文件部分
assets:静态资源文件被 Webpack 做构建编译处理
《1》css文件中引入资源
//注意~后无斜杠
background:url("~assets/banner.svg")
《2》vue文件中:
<img src="~/assets/image.png"> static:无需Webpack编译处理
资源相对路径来解决路径问题
《1》vue文件中
<img src="../static/1.png"/> (2)布局目录layouts / 页面pages - 视图部分
《1》默认布局(layouts/default.vue)
<template>
<nuxt/>
</template>
《2》自定义布局
1.创建文件layouts/self.vue
<template>
<div>
<div>自定义布局</div>
<nuxt/>
</div>
</template>
2.页面中使用pages/index
export default {
layout: 'self' //指定自定义模板
} 《3》错误页面
定制化错误页面:.layouts/error.vue <template>
<div class="container">
<h1 v-if="error.statusCode === 404">页面不存在</h1>
<h1 v-else>应用发生错误异常</h1>
<nuxt-link to="/">首 页</nuxt-link>
</div>
</template> <script>
export default {
props: ['error'],
layout: 'self' // 你可以为错误页面指定自定义的布局
}
</script> 《4》pages页面配置项:
asyncData、fetch、head、layout、loading、transition、scrollToTop、validate、middleware 此部分查看Api - 页面部分 (3)插件目录plugins(全局配置)- 插件部分
《1》使用插件
a.plugins/vue-notifications.js
import Vue from 'vue'
import VueNotifications from 'vue-notifications'
Vue.use(VueNotifications) b.nuxt.config.js内配置
module.exports = {
plugins: ['~/plugins/vue-notifications']
} 《2》注入Vue 实例
a.plugins/vue-inject.js:
import Vue from 'vue'
Vue.prototype.$myInjectedFunction = (string) => console.log("This is an example", string) b.nuxt.config.js
export default {
plugins: ['~/plugins/vue-inject.js']
} c.pages页面使用:
this.$myInjectedFunction('test') 《4》注入context
a.plugins/ctx-inject.js:
export default ({ app }, inject) => {
// Set the function directly on the context.app object
app.myInjectedFunction = (string) => console.log('Okay, another function', string)
} b.nuxt.config.js:
export default {
plugins: ['~/plugins/ctx-inject.js']
} c.pages页面使用:
export default {
asyncData(context){
context.app.myInjectedFunction('ctx!')
}
} 《5》同时注入 - inject方法
a.plugins/combined-inject.js
export default ({ app }, inject) => {
inject('myInjectedFunction', (string) => console.log('That was easy!', string))
} b.调用以上两种方式都行 《6》只在客户端使用的插件nuxt.config.js
export default {
plugins: [
{ src: '~/plugins/both-sides.js' }, //both client & server
{ src: '~/plugins/client-only.js', mode: 'client' },
{ src: '~/plugins/server-only.js', mode: 'server' }
]
} (4)路由部分:
依据 pages 目录结构自动生成 vue-router 模块的路由配置
(1)动态路由:
pages/
--| _slug/
-----| comments.vue
-----| index.vue
--| users/
-----| _id.vue
--| index.vue 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'
}
]
} 路由参数校验:pages/users/_id.vue
validate ({ params }) {
// 必须是number类型
return /^\d+$/.test(params.id)
} (2)嵌套路由
注意:
1.添加一个 Vue 文件,同时添加一个与【该文件同名的目录】用来存放子视图组件。
2.别忘了在父组件(.vue文件) 内增加 <nuxt-child/> 用于显示子视图内容。
pages/
--| users/
-----| _id.vue
-----| index.vue
--| users.vue 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'
}
]
}
]
} (5).中间件目录middleware
- 用于存放应用的中间件
注意:
1.中间件允许您定义一个自定义函数运行在一个页面或一组页面渲染之前(类似vue-router导航守卫)
2.文件名的名称将成为中间件名称(middleware/auth.js将成为 auth 中间件)
3.一个中间件接收 context 作为第一个参数 (context - 见APi)
export default function (context) {
context.userAgent = process.server ? context.req.headers['user-agent'] : navigator.userAgent
}
4.中间件执行流程顺序:nuxt.config.js -> 匹配布局 -> 匹配页面
5.案例:
1.middleware/stats.js
import axios from 'axios'
export default function ({ route }) {
return axios.post('http://my-stats-api.com', {
url: route.fullPath
})
} 2.在nuxt.config.js 、 layouts 或者 pages 中使用中间件
(1)nuxt.config.js:在每个路由改变时被调用
module.exports = {
router: {
middleware: 'stats'
}
} (2)layouts/default.vue 或者 pages/index.vue
export default {
middleware: 'stats'
} (6)Store 目录 - Vuex 状态树

    1.store/index.js 跟其他方式没啥差别

    2.模块化使用场景一:
      store/
        --| todos/ (文件夹模块,文件名为对应store属性名)
          -----| state.js
          -----| getters.js
          -----| mutations.js
          -----| actions.js

      页面使用:
        import { mapMutations, mapGetters } from 'vuex'
        ...mapMutations({toggle: '模块名/对应方法名'})

        例子:
          ...mapMutations({toggle: 'todos/test'})
          this.$store.commit('todos/test', { 参数 })

    3.模块化使用场景二:
      store/
        --| articles/ (文件夹模块)
          -----| comments.js
        --| articles.js (根目录文件模块)

      页面使用:
        import { mapGetters } from 'vuex'
        ...mapGetters({
          articles: 'articles/get', //根目录文件模块
          comments: 'articles/comments/get' //文件夹模块
        })

(7)异步数据(asyncData)
1.限于页面组件 - 每次加载之前被调用(beforeCreate之前执行)
2.由于asyncData方法是在组件 初始化 前被调用的,所以在方法内是没有办法通过 this 来引用组件的实例对象。
2.第一个参数被设定为当前页面的上下文对象:即参数为对象context,对象属性:
https://zh.nuxtjs.org/api/context context:{
app: Vue 根实例 //context.app.$axios,
params:route.params 的别名,
query:route.query 的别名,
error:展示错误页,
redirect:重定向用户请求到另一个路由,redirect([status,] path [, query])
env:nuxt.config.js 中配置的环境变量,见 环境变量 api(嵌套路由例子-见demo)
store:Vuex 数据,
route:Vue Router 路由实例, isDev:开发 dev 模式,
isHMR:模块热替换,
req:
res:
nuxtState:
beforeNuxtRender(fn):
} 使用回调/动态路由参数/错误处理:
使用配置它的文件或文件夹的名称访问动态路径参数:_id.vue
export default {
asyncData ({ params }, callback) {
axios.get(`https://my-api/posts/${params.id}`)
.then((res) => {
callback(null, { title: res.data.title })
}).catch((e) => {
//statusCode: 指定服务端返回的请求状态码
error({ statusCode: 404, message: 'Post not found' })
})
}
} 获取query参数
https://zh.nuxtjs.org/api/pages-watchquery
watchQuery: ['page'] 如果定义的字符串发生变化,将调用所有组件方法(asyncData, fetch, validate, layout, ...) 《8》过渡动效
1.全局过渡动效设置
Nuxt.js 默认使用的过渡效果名称为 page
例子:
//assets/main.css
.page-enter-active, .page-leave-active { transition: opacity .5s; }
.page-enter, .page-leave-active {
opacity: 0;
}
//nuxt.config.js
module.exports = {
css: [
'assets/main.css'
]
}
//使用
自动全局使用 2.页面过渡动效设置
页面样式:
.bounce-enter-active { animation: bounce-in .8s; }
.bounce-leave-active { animation: bounce-out .5s; } @keyframes bounce-in {
0% {transform: scale(0)}
50% { transform: scale(1.5) }
100% { transform: scale(1) }
} @keyframes bounce-out {
0% { transform: scale(1) }
50% { transform: scale(1.5) }
100% { transform: scale(0) }
} 页面运用:
export default {
transition: 'bounce', //动画
}
或者:
export default {
transition: {
name: 'test',
mode: 'out-in'
}
} 3.transition为函数类型时运用
见demo案例
<template>
<div class="container">
<NuxtLink v-if="page > 1" :to="'?page=' + (page - 1)">< Prev</NuxtLink>
<a v-else class="disabled">< Prev</a>
<span>{{ page }}/{{ totalPages }}</span>
<NuxtLink v-if="page < totalPages" :to="'?page=' + (page + 1)">Next ></NuxtLink>
<a v-else class="disabled">Next ></a>
<ul>
<li v-for="user in users" :key="user.id">
<img :src="user.avatar" class="avatar" />
<span>{{ user.first_name }} {{ user.last_name }}</span>
</li>
</ul>
</div>
</template> <script>
export default {
// Watch for $route.query.page to call Component methods (asyncData, fetch, validate, layout, etc.)
watchQuery: ['page'],
// Key for <NuxtChild> (transitions)
key: to => to.fullPath,
// Called to know which transition to apply
transition (to, from) {
if (!from) { return 'slide-left' }
return +to.query.page < +from.query.page ? 'slide-right' : 'slide-left'
},
async asyncData ({ query }) {
const page = +query.page || 1
const data = await fetch(`https://reqres.in/api/users?page=${page}`).then(res => res.json()) return {
page: +data.page,
totalPages: data.total_pages,
users: data.data
}
}
}
</script> (9)自定义加载
第一种:自定义加载组件
1.components/loading
loading.vue 2.nuxt.config.js
loading: '~/components/loading.vue' 第二种:加载进度条
1.nuxt.config.js
loading: { color: 'red' } //修改进度条样式 2.pages/index 页面中
this.$nuxt.$loading.start() //启动加载条
this.$nuxt.$loading.finish() //介乎加载条 (10)其他:
process.static:是否为true来判断应用是否通过nuxt generator生成
process.server:当值为 true 表示是当前执行环境为服务器中
控制插件中的某些脚本库只在服务端使用
案例:process.static ? 'static' : (process.server ? 'server' : 'client')

  

nuxt入门的更多相关文章

  1. vuessr nuxt入门指南

    nuxt.js 官网地址:https://zh.nuxtjs.org/guide/installation 1.安装 vue init nuxt-community/starter-template ...

  2. ApacheCN Vue 译文集 20211115 更新

    使用 GraphQL 构建 VueJS 应用 零.前言 一.数据绑定.事件和计算属性 二.组件.混合器和功能组件 三.设置我们的聊天应用--AWS Amplify 环境和 GraphQL 四.创建自定 ...

  3. Nuxt.js 从入门到放弃

    Nuxt 是 Vue 上的 SSR,也就是服务端渲染应用框架,可在很大程度上解决当前 SPA 和 CSR 的首页加载慢,不利于 SEO 的问题.本场 Chat 就将详细介绍 Nuxt 的使用以及相关概 ...

  4. Nuxt.js + koa2 入门

    1. nuxt项目初始化 下面是使用 koa 模板方法初始化一个项目,使用该方法需要将 nuxt 的版本降至1.4.2: 官方 https://zh.nuxtjs.org/guide/installa ...

  5. Nuxt.js开启SSR渲染快速入门

    第一节:nuxt.js相关概述 nuxt.js简单的说是Vue.js的通用框架,最常用的就是用来作SSR(服务器端渲染).Vue.js是开发SPA(单页应用)的,Nuxt.js这个框架,用Vue开发多 ...

  6. Nuxt.js 基础入门教程

    原文链接 Vue 开发一个单页面应用,相信很多前端工程师都已经学会了,但是单页面应用有一个致命的缺点,就是 SEO 极不友好.除非,vue 能在服务端渲染(ssr)并直接返回已经渲染好的页面,而并非只 ...

  7. Nuxt.js入门学习

    Nuxt.js简单的说是Vue.js的通用框架,最常用的就是用来作SSR(服务器端渲染).再直白点说,就是Vue.js原来是开发SPA(单页应用)的,但是随着技术的普及,很多人想用Vue开发多页应用, ...

  8. Nuxt的动态路由及路由校验入门

    其实动态路由就是带参数的路由.比如我们现在新闻模块下面有很多新闻详情页,这时候就需要动态路由的帮助了. 新闻详细页面我们在news文件夹下面新建了_id.vue的文件,以下划线为前缀的Vue文件就是动 ...

  9. Nuxt框架实践

    前言 今天抽空过了遍nuxt文档,写了个实践demo,关于nuxt我已经断断续续看了好几遍了,自我感觉也算是入门了吧,从开发到上线心里都有底.后期打算在项目用起来的是nuxt框架,一些函数工具库,比如 ...

随机推荐

  1. OpenGL学习笔记 之三 (简单示例 太阳月亮地球)

    #include<glut.h> // 太阳.地球和月亮 // 假设每个月都是30天 // 一年12个月,共是360天 ;//day的变化:从0到359 void myDisplay(vo ...

  2. 最新 二六三网络通信java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿. 二六三网络通信等10家互联网公司的校招Offer,因为某些自身原因最终选择了 二六三网络通信.6.7月主要是做系统复习.项 ...

  3. redis相关操作命令

    一.相关命令列表: 命令原型 时间复杂度 命令描述 返回值 KEYS pattern O(N) 时间复杂度中的N表示数据库中Key的数量.获取所有匹配pattern参数的Keys.需要说明的是,在我们 ...

  4. Python小技巧:使用一行命令把你的电脑变成服务器

    不知道你有没有遇到这么一种情况,就是你有时候想要把电脑上的一些东西传输到你的手机或者 Pad ,你要么需要使用数据线连接到电脑,有时候还要装各种驱动才可以进行数据传输,要么需要借助第三方的工具,在局域 ...

  5. kolla安装Queens版本OpenStack(ceph后端)

    OpenStack all-in-one部署: 本次部署为OpenStack Queens版本部署,使用All-in-one,单节点部署. 物理资源:8核,32GB,硬盘400GB(3个盘),2网卡. ...

  6. (4.36)sql server中的waitfor

    关键词:waitfor SQL有定时执行的语句 WaitFor,可以写到一个存储过程中再执行一次 语法:WaitFor{Delay 'time'|Time 'time} Delay后面的时间为延迟多少 ...

  7. [转帖]PostgreSQL 昨天,今天和明天

    PostgreSQL 昨天,今天和明天 http://www.postgres.cn/v2/news/viewone/1/52 原作者:何伟平(laser) 创作时间:2005-01-15 11:44 ...

  8. Python【Network/XHR/json】

    ##################################################################### 制定一个目标(爬取周杰伦的歌曲清单): 根据目标,确认一个方 ...

  9. 1.ASP.NET Core Docker学习-Docker介绍与目录

    Docker的优点: 1节约时间,快速部署和启动 2节约成本 3标准化应用发布 4方便做持续集成 5可以用Docker做为集群中的轻量主机或节点 6方便构建基于SOA或者微服务架构 的系统 学习目录: ...

  10. Apache2.4+Tomcat7.0整合配置详解

    一.简单介绍 Apache.Tomcat Apache HTTP Server(简称 Apache),是 Apache 软件基金协会的一个开放源码的网页服务器,可以在 Windows.Unix.Lin ...