1. 程式人生 > >【手把手】帶你擼一個基於vueCli 3.0的前端框架

【手把手】帶你擼一個基於vueCli 3.0的前端框架

vuecli 是 vue 的一套工具,便於我們快速開發,其使用方法也是千奇百怪,各種奇技淫巧層出不窮,網上大多教程也只是教你怎麼去安裝,並沒有說要怎麼去用,今天來和大家探討一下該怎麼合理的使用。

1、建立專案

假設你已經安裝過node了,執行下面命令安裝vuecli3.0,如果你之前安裝過vuecli2.0,只需按照提示把2.0解除安裝,再安裝3.0

$ npm install -g @vue/cli

然後建立一個專案, vuecli3就是專案名稱

$ vue create vuecli3

其中有三個選項,第一個是我之前儲存的模板,第二個是預設,第三個是自定義,我們選擇最後一個(上下鍵選擇,回車確認)

選擇你要新增的哪些模組,可以參考我上面的選擇(空格選中)

路由 使用歷史模式。不加#號的那種

css編譯器我選擇stylus

Eslint選擇標準配置

選擇eslint的檢查方式,第一個是儲存就檢查,第二個是提交再檢查

選擇配置檔案,回車最後一步選擇是否儲存為模板

這樣一個專案就建立完成了

2、IDE的相關配置

我使用的是webstorm,簡單描述一下配置IDE怎麼方便我們開發

快速啟動專案,把vuecli的一些常用命令配進編輯器,不用每次都手輸命令

點選 + 選擇 npm

 

新增 npm run serve

新增 npm run build

儲存之後,點選綠色的三角,可以快速的使用命令了

接下來,配置一下eslint,選擇 file -> settings

選擇 eslint,並開啟

3、新增使用者驗權

一般來說,當用戶登入之後,會在本地記住登入狀態,存入一個token,之後的每次請求都會攜帶token,前端也可以根據這個token來判斷使用者是否登入,

安裝 js-cookie

$ npm install js-cookie -S

在src下新建資料夾 utils 並在 utils 下新建檔案 auth.js 寫入

import Cookies from 'js-cookie'

const TokenKey = 'Admin-Token'

export function getToken () {
  return Cookies.get(TokenKey)
}

export function setToken (token) {
  return Cookies.set(TokenKey, token)
}

export function removeToken () {
  return Cookies.remove(TokenKey)
}

4、新增路由守護

路由守護基本上是所有專案都用得到的,特別是對於那些部分需要的登入的,在utils下新建routering.js寫入

import router from '../router'
import { getToken } from '@/utils/auth' // 驗權

const whiteList = ['/login']  // 白名單
router.beforeEach((to, from, next) => {
  if (getToken()) {
    if (to.path === '/login') {
      next({ path: '/home' })
    } else {
      next()
    }
  } else {
    if (whiteList.indexOf(to.path) !== -1) {
      next()
    } else {
      next('/login')
    }
  }
})

router.afterEach(() => {

})

在 main.js 中引入

import '@/utils/routering'

6、選擇 ui 庫

為了提高開發效率,一般都會選擇一個UI框架,各種ui框架令人眼花繚亂,層出不窮,已mint-ui為例 官網

$ npm install mint-ui -S

在main.js中寫入

import MintUI from 'mint-ui'
import 'mint-ui/lib/style.css'

Vue.use(MintUI)

7、新增axios攔截

安裝 axios

$ npm install axios -S

在 utils 下新建檔案request.js寫入

import axios from 'axios'
import { Toast } from 'mint-ui'
import { getToken } from '@/utils/auth'

// 建立axios例項
const service = axios.create({
  baseURL: 'http://localhost:8080/xrb/',
  timeout: 5000
})

// request攔截器
service.interceptors.request.use(
  config => {
    if (getToken()) {
      config.data.session = getToken()
    }
    // 去掉字串型別引數前後的空格
    for (var i in config.data) {
      if (Object.prototype.toString.call(config.data[i]) === '[object String]') {
        config.data[i] = config.data[i].trim()
      }
    }
    return config
  },
  error => {
    Toast({ message: '網路連線錯誤,請稍後再試!' })
    Promise.reject(error)
  }
)

// response 攔截器
service.interceptors.response.use(
  response => {
    const res = response.data
    if (!res.success) {
      Toast({ message: res.msg })
      return Promise.reject('error')
    } else {
      return response.data
    }
  },
  error => {
    Toast({ message: '伺服器連線錯誤,請稍後再試!' })
    return Promise.reject(error)
  }
)

export default service

8、建立公共方法

有時需要一些公共的方法,比如格式化時間等,為此我們單獨建立一個檔案,在需要的時候直接引入就好了
在utils下新建檔案index.js寫入

// 判斷是否是整數
export function isInteger (str) {
  return /^[0-9]{1,}$/.test(str)
}

9、api檔案

所有的api介面建議統一寫在一個檔案中方便維護,在src資料夾下新建資料夾api,在api下建立檔案api.js寫入

import request from '@/utils/request'

// 登入
export function login (params) {
  return request({
    url: 'login',
    method: 'post',
    data: params
  })
}

// 獲取使用者資訊
export function userInfo (params) {
  return request({
    url: 'userInfo',
    method: 'post',
    data: params
  })
}

10、使用全域性css

全域性css用來放置公共樣式,在src資料夾下新建styles資料夾,在styles下新建 index.styl、mintui.styl,index.styl 裡面寫自定義的樣式,mintUI預設提供的樣式可能並不適合自己的專案,可以在mintui.styl裡面寫我們要覆蓋掉預設的樣式

index.styl中寫入

html,body
  margin 0
  padding 0
*
  box-sizing border-box
  font-family -apple-system, BlinkMacSystemFont, "PingFang SC","Helvetica Neue",STHeiti,"Microsoft Yahei",Tahoma,Simsun,sans-serif

mintui.styl中寫入,為了測試我把mintui的toast的字型顏色改為了粉色

.mint-toast
  color pink

然後在main.js中引入

import '@/styles/index.styl'
import '@/styles/mintui.styl'

11、在vuex中使用api

修改src下的store.js

import Vue from 'vue'
import Vuex from 'vuex'
import { login } from '@/api/api'
import { setToken } from '@/utils/auth'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    userInfo: ''
  },
  mutations: {
    SET_USER: (state, data) => {
      state.userInfo = data
    }
  },
  actions: {
    login ({ commit }, userInfo) {
      return new Promise((resolve, reject) => {
        login(userInfo).then(response => {
          const data = response.data
          setToken(data.session)
          commit('SET_USER', data)
          resolve()
        }).catch(error => {
          reject(error)
        })
      })
    }
  }
})

12、在組建中使用

接下來說一下,在元件中如何使用上面的東西

修改app.vue如下

<template>
  <div id="app">
    <router-view/>
  </div>
</template>
<style lang="stylus">

</style>

在views下新建 login.vue、home.vue,內容如下

login.vue,實現了,呼叫全域性方法isInteger、呼叫axios裡的api方法

<template>
  <div class="login">
    <input type="text" v-model="user">
    <input type="password" v-model="pwd">
    <button @click="submit">登入</button>
  </div>
</template>

<script>
import { isInteger } from '@/utils/index'
import { Toast, Indicator } from 'mint-ui'
export default {
  name: 'login',
  data () {
    return {
      user: '',
      pwd: ''
    }
  },
  methods: {
    submit () {
      if (!isInteger(this.user) || !isInteger(this.pwd)) {
        Toast('請輸入整數')
      } else {
        Indicator.open('請稍後...')
        this.$store.dispatch('login', {
          user: this.user,
          pwd: this.pwd
        }).then((res) => {
          Indicator.close()
          this.$router.replace('/home')
        }).catch(() => {
          Indicator.close()
        })
      }
    }
  }
}
</script>

home.vue,呼叫api方法

<template>
  <div class="home">
    <h1>首頁</h1>
  </div>
</template>

<script>
import { Indicator } from 'mint-ui'
import { userInfo } from '@/api/api'
export default {
  name: 'home',
  data () {
    return {
      userInfo: ''
    }
  },
  created () {
    Indicator.open('請稍後...')
    userInfo({}).then(response => {
      this.userInfo = response.data
      Indicator.close()
    }).catch(errs => {
      Indicator.close()
    })
  }
}
</script>

最後修改src下的router.js

import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

export default new Router({
  mode: 'history',
  base: process.env.BASE_URL,
  routes: [
    {
      path: '/home',
      name: 'home',
      component: () => import('./views/home.vue')
    },
    {
      path: '/login',
      name: 'login',
      component: () => import('./views/login.vue')
    },
    {
      path: '*',
      component: () => import('./views/login.vue')
    }
  ]
})

 

另外還有 svg圖片的處理和vuex的持久化儲存,我就不多做說明,有需要的可以點這裡下載原始碼