nuxt简介

一种基于vue的应用框架,ssr服务端渲染,在服务端生成html返回给客户端,有利于SEO,首屏加载速度快,自动配置路由

my-nuxt-app

npx create-nuxt-app XXX

Build Setup

# install dependencies
$ npm install
# serve with hot reload at localhost:3000
$ npm run dev
# build for production and launch server
$ npm run build
$ npm run start
# generate static project
$ npm run generate

nuxt.js常见问题

  • created生命周期会执行在客户端或服务端,而服务端是没有window、document这两个全局对象的,所以使用会导致服务报错甚至挂掉。

    • 没报错的原因:是ssr只在第一次刷页面的时候会用到服务端渲染,后续如果没有再次刷新,页面上的跳转都是通过router跳转的,这时就跟普通的vue一样,created只会执行在客户端,就不会报错,一旦刷新页面就会在服务端执行
  • asyncData:运行在组件渲染之前(服务端/路由变更前被调用),所以无法使用this。在服务端异步获取数据并生成页面。直接返回对象,无需在data中重复定义,合并到data中一并返回给当前组件,因此asyncData只能用于页面组件(pages文件夹下),不能用于自定义组件(components)

  • axios中的http请求,既有服务端的也有客户端的,需要对异常情况做处理
// 用户被禁用
if (res.data.code === 403) {
    if (process.server) { // 服务器
    app.res.clearCookie('token')
        app.res.clearCookie(getServerCookie(app.req.host) + 'token')
        app.redirect({
            path: '/disableUser'
        })
    } else { // 客户端
        setTimeout(() => {
            app.$delCookie('token')
            app.app.router.push({ path: '/disableUser' })
        }, 3000)
    }
}

server/ 目录

服务端运行的文件

nuxt.config.js

nuxt.js的配置文件,只在服务端运行

asyncData 的参数(context)有哪些?

app:app 对象

store:存储,可以拿到store里的数据

route:路由,可以拿到参数之类的

params:url 路径参数,主要获取id

query:可以理解为url上问号后面的参数

env:运行环境

isDev:是否是开发环境

isHMR:是否是热更新

redirect:重定向

error:错误

layouts/default.vue:默认布局

layouts文件夹下自定义错误error.vue页面,当404或500的时候跳转

assets文件下创建全局样式文件,在nuxt.config.js中配置全局common.css

全局:路由统一动效(约定好的类名:page-enter-active/page-enter)

单个文件:在全局样式里定义单独的过渡样式,然后在组件内设置类名

export default {

// transition: '动画名'

transition: 'test'

}

生命周期

nuxtserverInit

middleware: 配置(config)--》布局(layout)--》页面(page)

validate: 参数校验,校验失败,则自动跳转到错误页面

路由

约定式:

展示区:<nuxt />

声明式跳转:<nuxt-link :to="{name: `goods-comment-uid`, params: {uid: 1}, query: {a: 1, b: 2}}">评论01</nuxt-link>

name:路由名目录名-其他目录-文件名(不带下划线)

params: key 要对等文件名

子路由:目录代表子路由,子路由内部同级的文件,代表的是同一级路由

展示区层级控制

pages/一级展示/二级展示

/ index.vue 会在一级展示

/ index.vue 空文档代表有默认页,不会寻找其他_详情.vue

配置

路由守卫:

前置:依赖中间件middleware、插件

全局守卫:nuxt.config 指向 middleware(redirect())

layouts 定义中间件

组件独享守卫:

middleware

插件全局前置守卫

后置:

组件内部独享守卫:

使用vue 的 beforeRouteLeave 钩子

插件全局后置守卫

数据交互

安装:

@nuxtjs/axios、@nuxtjs/proxy

nuxt.config配置:

modules: [

'@nuxtjs/axios'

],

跨域配置:

axios: {

proxy: true, // 开启axios跨域

prefix: '/api' // baseUrl

},

proxy: {

'/api': {

traget: 'http://localhost:3001', // 代理转发的地址

changeOrigin: true,

pathRewrite: {

// '^/api': '' // 重替换

}

}

},

results matching ""

    No results matching ""