Nuxt框架实践

nuxt

前言

今天抽空过了遍nuxt文档,写了个实践demo,关于nuxt我已经断断续续看了好几遍了,自我感觉也算是入门了吧,从开发到上线心里都有底。后期打算在项目用起来的是nuxt框架,一些函数工具库,比如ramda,lodash等等,后台服务估计会使用### fastify 这个库,目测非常方便,尝试尝试。

基础只是还是以官方文档为主,尝试过程中如果有什么问题可以留言,看到会回复,文章如有错误,欢迎指正。

预处理器的使用

安装需要的loader后指定lang就可以直接使用。

npm i less less-loader --save--dev

//全局css
  css: [
    {
      src: 'static/less/base.sass',
      lang: 'less'
    }
  ],
  //页面中使用

    <style lang="less" scoped></style>

页面loading

//禁用
module.exports = {
  loading: false
}

//颜色条
module.exports = {
loading: { color: '#3B8070' }
}

//使用组件
添加一个loading组件 (官方示例如下,详情可看官方文档)
引用该组件
module.exports = {
  loading: '~components/loading.vue'
}


///  components/loading.vue

 <template lang="html">
  <div class="loading-page" v-if="loading">
    <p>Loading...</p>
  </div>
</template>

<script>
export default {
  data: () => ({
    loading: false
  }),
  methods: {
    start () {
      this.loading = true
    },
    finish () {
      this.loading = false
    }
  }
}
</script>

<style scoped>
.loading-page {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(255, 255, 255, 0.8);
  text-align: center;
  padding-top: 200px;
  font-size: 30px;
  font-family: sans-serif;
}
</style>
 

按照官方引用组件的方法,我测试报了个错,把~/ 改成 ./ 解决。估计是nuxt解析vue文件的问题。

使用插件、第三方模块

//通过script标签

 head: {  
     script: [
      { src: 'https://res.wx.qq.com/open/js/jweixin-1.2.0.js' }
    ]
  },
  
  //plugins配置 , ssr:false 设置只在客户端使用
  
   plugins: [
    { src: '~plugins/flexible.js', ssr: false }
  ],

//在页面中使用axios,配置vendor使其只打包一次

//页面
<template>
  <h1>{{ title }}</h1>
</template>

<script>
import axios from 'axios'

export default {
  async asyncData ({ params }) {
    let { data } = await axios.get(`https://my-api/posts/${params.id}`)
    return { title: data.title }
  }
}
</script>

//配置文件

module.exports = {
  build: {
    vendor: ['axios']
  }
}

使用第三方组件库

在nuxt里使用第三方UI组件库也非常简单。以iview为例(我个人非常中意的组件库)

///在plugins下新建 iview.js

import Vue from 'vue'
import iView from 'iview';

Vue.use(iView);

////配置文件引入css和plugin

module.exports = {
  css: [
    { src: 'iview/dist/styles/iview.css'}
  ],
  plugins: [
    { src: '~plugins/iview.js', ssr: false }
  ],
 
}

路由


//基础路由示例, 详情请看官方文档

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


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'
    }
  ]
}


nuxt为我们省去了定义路由的过程,页面结构自动生成路由,不得不说,这对开发效率是有比较大的提升。官方还提供了路由切换动画,中间件等配置,我们可以在切换路由时良好的控制页面。

中间件

开发后台管理页面的时候,我们经常有autu认证需求,如果没有登录,或者权限问题,都有一个脚本去控制跳转,中间件就派上用场了。


  //  middleware/auth.js
  
export default function ({ store, redirect }) {
  if (!store.state.user) {
    return redirect('/login')
  }
}

//页面单独使用

export default {
  middleware: 'auth'
  }

///全局使用

module.exports = {
  router: {
    middleware: 'auth'
  }  
}


上面我们定义了一个auth中间件,如果用户未登录,则跳转登录页。

视图和错误页

一般开发SPA页面,我们一般是组件+页面混合开发,,nuxt则是固定布局layouts,路由必须采用一个layouts,默认default,页面内部我们可以像个vue开发那样引入多个components。

nuxt可以定义个错误页,在layouts下定义个error.vue文件。具体代码可以看官方文档

asyncData

nuxt扩展的异步数据方法,对于页面数据,我们一般有页面data定义的形式和vuex统一管理的形式,可以根据自己的需求选择。

data定义这里就不赘述了,这里说一下vuex统一管理数据的做法。


///page页面
<template>
  <div class="container">
    <p class="title">数据展示!</p>
    <Table :columns="columns1" :data="data1"></Table>
  </div>
</template>

<script>
  import { mapState } from 'vuex'
  import axios from 'axios'
  
  export default {
    middleware: 'auth',  //定义页面中间件
    head () {
      return {
        title: '其他页面'
      }
    },
    data () {
      return {}
    },
    async fetch ({ store, params }) {
      let { data } = await axios.get('http://106.14.205.222/article/list?page=1&limit=10&isActive=1')
      console.log( data )
      store.commit('SET_LIST', data.list)
    },
    computed: {
      ...mapState([
        // 映射 this.xxx 为 store.state.xxx
        'columns1',
        'data1'
      ])
    },
  }
</script>


  
  
//store  index.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const store = () => new Vuex.Store({
  
  state: {
    columns1: [
      {
        title: '标题',
        key: 'title'
      },
      {
        title: '介绍',
        key: 'intro'
      },
      {
        title: '日期',
        key: 'time'
      }
    ],
    data1: [],
    user: 'xu' //如果为空,则会中间件控制跳转404
  },
  mutations: {
    SET_LIST: (state, data) => {
      state.data1 = data
    },
  }
})

export default store



这里通过fetch刷新了vuex的数据,页面映射了store的数据,这种写法我们可以通过this.xxx 处理vuex的数据。demo为了快捷只用了index演示,常规项目我们应该采用模块写法。

权限配置(高级-路由鉴权)

还是关于session 和 登录相关的一些权限问题,官方高级文档有非常详细的例子。这里就不在demo里再现了。路由鉴权

对vuex管理数据有兴趣的同学, 可以多看看vuex状态树 和权限相关的文章或者应用,当然官方文档是要烂熟于心的。

后台开发以及项目部署

后台开发一般就是在项目下在建立一个server文件夹,做到同时输出API和页面,我们可以选择自己喜欢的服务框架 ,比如express活着koa,将nuxt 介入到服务框架来,就可以完成所谓的同构开发。可以看看一个koa例子:

import Koa from 'koa'
import Nuxt from 'nuxt'
import nuxtConf from '../nuxt.config'


const app = new Koa()

const start = async () => {
  let config = require('../nuxt.config.js')
  config.dev = !(app.env === 'production')
  const nuxt = await new Nuxt(config)

  if (conf.env !== 'production') {
    try {
      await nuxt.build()
    } catch (e) {
      console.error(e)
      process.exit(1)
    }
  }

  app.use(async (ctx, next) => {
    ctx.status = 200
    await nuxt.render(ctx.req, ctx.res)
  })

  app.listen(conf.port, conf.host)
  console.log('Server listening on ' + conf.host + ':' + conf.port) // eslint-disable-line no-console
}

start()

nuxt自身提供了一个部署命令,可以通过 npm run start 来运行,nuxt还能生成静态页,你可以在在别的地方托管你的网站,比如Githubpage和cdn。喜欢同一管理上线的项目的同学,推荐用pm2 来进行部署。

一台机器,好几个项目,就可以用nginx来进行反向代理端口。nginx也算是上线必不可少的一步,有空我也会写一篇实践文章。

官方也有提供服务框架版本,比如express https://github.com/nuxt-community/express-template ,还有其他的可以自行Github🔍

后记

nuxt的学习曲线非常小,就像vue框架一样,已经是一个开箱即用的状态,我们可以直接跨过配置直接开发。对配置有兴趣的可以在vue官方文档找到ssr渲染文档。

本来是想写nuxt + koa + mongodb 的全栈式应用文章的,但是最近比较忙,这个计划只能搁置了。有些方法和好用的东西我我也是最近才学习,觉得不错在文章里做一个分享和记录。来源的话是慕课网Scott老师的《开发微信全家桶项目 Vue/Node/MongoDB高级技术栈全覆盖》视频教程,课程级别为高级,有些地方我自己也是云里雾里,比如API分层,控制器。。不过最让人头疼的还是微信那一堆认证。。。。

整个nuxt的简单demo我都放在了Github ,对上面的scott老师的视频教程有兴趣的同学,也可以在Github找到源码。demo多实践,工作少踩坑,小公司现在最让我开心的估计是自主开发了,公司项目我可以自己选择使用什么技术。想怎么写怎么写,可以申请整个开发项目,自己开发页面,服务器,数据库,心大的可以用rn开发app。。。相应的这锅也要背好,有压力有动力嘛,写代码这么愉快的事对吧~

传送门: Nuxt示例代码

如果觉得本文对你有所帮助,就star一下吧~大传送之术! 我的博客Github

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • 高考过去一段时间了,现在身边一本的同学们已经知道学校。我还在等结果。报志愿那几天,真的,苦思冥想,自己翻来覆去,...
    就肆我妮阅读 212评论 0 0
  • 本文以邹憬、王盛元《论语通解》为通解,综合参考杨伯峻《论语译注》,新编诸子集成之《论语集释》,南怀瑾《论语别裁》,...
    逆旅怪客大力哥阅读 501评论 1 4
  • 2017.11.12 星期日 珠海小雨 前两天是大哥生日,因为工作原因,我们家的几个小家伙没有聚到...
    wu溧蕙阅读 298评论 0 2
  • 昨天荔枝微课有一条收益提示。我点开了看看,还纳闷。标题是谁讲的课呢?收益到底是谁的呢?点开课程后,原来是...
    梦之海L阅读 235评论 0 0