建立一個VUE專案,正式開發之前要做的配置~
阿新 • • 發佈:2021-07-02
一、使用vue-cli腳手架建立一個專案,根據我們開發所需生成固定的檔案目錄(可配置)。
二、建立好專案之後,還並不能開始真正的開發,我們需要做一些開發前的準備,比如請求的axios封裝,多環境的地址配置,解決本能地開發跨域等等,做好準備,在後續開發中會有一勞永逸的感覺哦~。
1、多環境的地址配置
- 根據啟動命令Vue會自動載入對應的環境,同時其會讀取相對應的環境配置檔案。
- 在package.json檔案中配置好不同環境的打包執行命令
"scripts": {
"dev": "npm run serve", // 本地執行,環境為development
"serve": "vue-cli-service serve",
"build": "vue-cli-service build", // 打生產包 會去讀取 .env.product的配置
"build:test": "vue-cli-service build --mode test", // 打測試包 會去讀取 .env.test的配置
"lint": "vue-cli-service lint"
},
- 在專案根目錄下以.env開頭建立不同環境下的地址配置檔案,檔案裡可以配置相應的地址。
2、跨域處理和一些基本配置
在專案根目錄建立vue.config.js檔案(腳手架幫我們封裝好了一套webpack配置,我們有需要的話疊加就好了,不用再寫一遍基本配置)
(1)本地開發跨域:通過proxy代理真實請求的地址
(2)配置檔案快捷路徑: 通過alias配置快捷
(3)配置全域性樣式:需要先下載對應的外掛,這裡用了less,需要先下載less, less-loader,style-resources-loader,vue-cli-plugin-style-resources-loader這四個外掛(少下載都會導致樣式無效哦~)
const path = require('path') const devServerConfig = { proxy: { '/my-web': { target: process.env.url, // 需要代理的後端地址 changeOrigin: true, secure: false, }, }, port: 8080, } module.exports = { devServer: devServerConfig, pluginOptions: { 'style-resources-loader': { preProcessor:'less', patterns: [path.resolve(__dirname, './src/assets/styles/base.less')], // 可以設定多個 }, }, // 設定快捷路徑 chainWebpack: config => { config.resolve.alias .set('@api', path.resolve(__dirname, './src/api')) .set('@assets', path.resolve(__dirname, './src/assets')) .set('@components', path.resolve(__dirname, './src/components')) .set('@views', path.resolve(__dirname, './src/views')) } }
3、axios的封裝
在src目錄下建立一個api資料夾(名字可以自定義)
// httpError.js 公共錯誤提示的js const ErrorMap = new Map([ [400, '請求錯誤'], [401, '未授權,請重新登入'], [403, '拒絕訪問'], [404, '請求錯誤,未找到該資源'], [405, '請求方法未允許'], [408, '請求超時'], [500, '伺服器端出錯'], [501, '網路未實現'], [502, '網路錯誤'], [503, '服務不可用'], [504, '網路超時'], [505, 'http版本不支援該請求'], ]) export const getErrorMessage = (status) => { if (ErrorMap.has(status)) { return ErrorMap.get(status) } else { return '連線錯誤,請聯絡管理員' } }
(1)使用一:將每個請求都寫成獨立的請求函式,元件中引用呼叫。
優點:多個地方呼叫,如果介面有變動,直接改這個函式即可(比如請求方法、介面路徑等發聲改變)
// http.js import axios from 'axios' import Vue from 'vue' import router from '@/router' import { getErrorMessage } from '@assets/js/httpError' const Axios = axios.create({ baseURL: '/my-web', timeout: 5000, }) // 新增請求攔截器 Axios.interceptors.request.use(req => { let token = localStorage.getItem('_a') token && (req.headers.Authorization = token) return req }, err => { return Promise.reject(err) }) // 響應攔截器 Axios.interceptors.response.use(res => { if (res.data.code === '0') { return { data: res.data.data, response: res, } } else { return Vue.prototype.$message.error(res.data.message) } }, err => { let status if (err && err.response) { status = err.response.status err.message = getErrorMessage(status) Vue.prototype.$message.error(err.message) } if (status === 401) { router.replace({ path: '/login', query: { redirect: router.currentRoute.fullPath } }) } return Promise.reject(err) }) export default Axios
// home.js import http from './http' // 獲取主頁資訊 export const getHomeInfo = () => http({ url: '/home/info', method: 'get', }) // xxx功能介面 export const xxxx = () => http({ url: '/home/xxx', method: 'get', })
...
// vue檔案中呼叫請求函式 <script> import { getHomeInfo } from '@api/home' export default { mounted() { this.getData() }, methods: {
async getData () { let { data } = await getHomeInfo() } }, }
</script>
(2)使用方法二:在第一種axios封裝的基礎上,再針對不同型別請求封裝,api檔案只維護請求介面的url
優點:需要改變請求路徑時,只需改動url的配置檔案
// http.js import axios from 'axios' import Vue from 'vue' import router from '@/router' import { getErrorMessage } from '@assets/js/httpError' const Axios = axios.create({ baseURL: '/my-web', timeout: 5000, }) // 新增請求攔截器 Axios.interceptors.request.use(req => { let token = localStorage.getItem('_a') token && (req.headers.Authorization = token) return req }, err => { return Promise.reject(err) }) // 響應攔截器 Axios.interceptors.response.use(res => { if (res.data.code === '0') { return { data: res.data.data, response: res, } } else { return Vue.prototype.$message.error(res.data.message) } }, err => { let status if (err && err.response) { status = err.response.status err.message = getErrorMessage(status) Vue.prototype.$message.error(err.message) } if (status === 401) { router.replace({ path: '/login', query: { redirect: router.currentRoute.fullPath } }) } return Promise.reject(err) }) // 封裝的請求函式 function request(url, methods, params, option = {}) { let headers if (option.headers) headers = option.headers return Axios({ url, methods, headers, data: ['POST', 'PUT'].includes(methods) ? params : null, params: ['GET', 'DELETE'].includes(methods) ? params : null, }) } // 暴露給vue檔案使用的請求方法 export const getData = (url, params, option) => { return request(url, 'GET', params, option) } export const postData = (url, params, option) => { return request(url, 'POST', params, option) } export const putData = (url, params, option) => { return request(url, 'PUT', params, option) } export const deleteData = (url, params, option) => { return request(url, 'DELETE', params, option) }
// url.js export default { login: '/login', homeInfo: '/home/info', ... }
有兩張方式去呼叫請求:
- 在vue檔案中直接引入url
<script> import url from '@api/url' import { getData } from '@api/http' export default { mounted() { this.getHomeInfo() }, methods: { async getHomeInfo () { // url.homeInfo:介面地址 let { data } = await getData(url.homeInfo) console.log(24, data) } }, } </script>
- 在Vue原型上掛在url,vue檔案中直接獲取到this.$url.xxx介面
// main.js檔案中加入以下程式碼,將url掛在到vue例項上 import url from './api/url' Vue.prototype.$url = url // vue 檔案中 <script> import { getData } from '@api/http' export default { mounted() { this.getHomeInfo() }, methods: { async getHomeInfo () { // 直接通過vue拿到url let { data } = await getData(this.$url.homeInfo) console.log(24, data) } }, } </script>
看個人習慣選擇要那種~
3、路由的處理
- 可以將路由按照頁面結構拆分成多個檔案引入,便於維護(建議)
- 也可以直接在頁面中寫完全部路由
import Vue from 'vue' import VueRouter from 'vue-router' import Home from '../views/Home.vue' Vue.use(VueRouter) // 解決重複點選相同路由控制檯報錯問題 const VueRouterPush =VueRouter.prototype.push VueRouter.prototype.push = function push (to) { return VueRouterPush.call(this, to).catch(err => err) } const routes = [ { path: '/', name: 'Home', component: Home }, ] router.beforeEach((to, from, next) => { // 進入每個路由前會先進這個函式,一般對身份的驗證,路由頁面的驗證可以放在這裡 }) const router = new VueRouter({ mode: 'history', base: process.env.BASE_URL, routes }) export default router
4、配置eslint