前言
今天抽空過了遍nuxt文檔,寫了個實踐demo,關於nuxt我已經斷斷續續看了好幾遍了,自我感覺也算是入門了吧,從開發到上線心里都有底。后期打算在項目用起來的是nuxt框架,一些函數工具庫,比如ramda,lodash等等,后台服務估計會使用### fastify 這個庫,目測非常方便,嘗試嘗試。
基礎只是還是以官方文檔為主,嘗試過程中如果有什么問題可以留言,看到會回復,文章如有錯誤,歡迎指正。
預處理器的使用
安裝需要的loader后指定lang就可以直接使用。
npm i less less-loader --save--dev
//全局css
css: [
{ src: '~assets/css/main.less', lang: 'less' },
{ src: 'iview/dist/styles/iview.css'}
],
//頁面中使用
<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