vue-cli3 建立的項目,vscode 做爲代碼編寫工具 vscode插件推薦:vscode 插件配置css
- 項目目錄結構介紹
- UI 框架選擇
- main,js 處理
- axios 請求二次封裝
├── public // index.html
├── src // 業務相關
│ ├── assets // 靜態文件(css, images)
│ ├── components // 全局組件
│ ├── layouts // 基礎樣式佈局
│ ├── plugin // 樣式及工具引入
│ ├── request // 請求配置
│ ├── router // 路由
│ ├── store // 全局狀態管理
│ ├── utils // 工具文件
│ ├── app.vue // 入口文件
│ ├── main.js // 主要配置文件
│ └── views // 頁面
├── .eslintrc.js // eslint 檢查配置
├── .env.release // 測試環境變量
├── .env.pre-build // 預發環境變量
└── vue.config.js // webpack 打包配置
複製代碼
經框架選擇驗證對比 element,iview,ant-design-vue 最終選擇 ant-design-vue,傳送門 vue.ant.design/docs/vue/in…html
- 好看
- 文檔清晰
- 使用方便,示例清晰
- bug少,組件使用順滑
- 性能較好,有單例測試
main.js
做爲操做入口,不少東西須要引入,代碼體積過大,須要進行優化,邏輯清晰,方便文虎前端
新建一個文件夾 plugin,存放全部須要引入的 main.js
掛載的組件、方法、第三方庫 vue
ant-design.js
按照官方推薦,按需引入 優勢: 咱們開發項目不必定能使用到全部的組件,這樣引入減少項目體積webpack
import Vue from 'vue'
import {
ConfigProvider,
Pagination,
Steps,
Cascader,
Row,
Col,
Table
} from 'ant-design-vue'
import 'ant-design-vue/dist/antd.less'
Vue.use(ConfigProvider)
Vue.use(Steps)
Vue.use(Cascader)
Vue.use(Row)
Vue.use(Col)
Vue.use(Table)
複製代碼
func.js
自定義的一些方法,掛到 vue 原型上ios
import Vue from 'vue'
import api from '@/request/api'
import { isInvalid, isValid } from '@/utils/verify'
// 請求接口
Vue.prototype.$api = api
// 驗證工具
Vue.prototype.$isInvalid = isInvalid
Vue.prototype.$isValid = isValid
複製代碼
這樣,分散幾個文件,而後將他們統一引入到 index.js
中web
import './ant-design.js'
import './func.js'
import './moment'
複製代碼
最後放入 main.js,整個世界都清晰簡單了 import './plugin'
正則表達式
收到評論區大神提醒,研究了一下 webpack
中的 require.context
vue-cli
require.context
是webpack
中,用來建立本身的(模塊)上下文json
webpack
會在構建的時候解析代碼中的 require.context()
require.context(directory, useSubdirectories = false, regExp = /^/)
函數接收三個參數:
要搜索的文件夾目錄 是否還應該搜索它的子目錄 以及一個匹配文件的正則表達式
// 語法
require.context(directory, useSubdirectories = false, regExp = /^\.\//);
// 示例
require.context('./test', false, /\.test\.js$/);
複製代碼
因此,在 main.js
中,直接能夠註冊我全部的自定義組件,很是簡單
// 自定義組件
const requireComponents = require.context('@v/components', true, /\.vue$/)
// 打印結果
// 遍歷出每一個組件的路徑
requireComponents.keys().map(fileName => {
// 獲取組件配置
const componentConfig = requireComponents(fileName)
// 剝去文件名開頭的 `./` 和`.vue`結尾的擴展名
const componentName = fileName.replace(/^\.\//, '').replace(/\.vue$/, '')
// 全局註冊組件
Vue.component(
componentName.replace(/\//, '-'),
// 若是這個組件選項是經過 `export default` 導出的,那麼就會優先使用 `.default`,不然回退到使用模塊的根。
componentConfig.default || componentConfig
)
})
複製代碼
axios 不過多介紹,上乾貨
新建文件 axios
請求攔截器 根據本身業務需求,修改請求頭以及超時時間等
import axios from 'axios'
axios.interceptors.request.use(
config => {
// 判斷是不是提交文件,仍是常規請求
if (config.data instanceof FormData) {
config.headers = {
'Content-Type': 'multipart/form-data' // 此處格式自定義
}
} else {
config.data = JSON.stringify(config.data)
config.headers = {
'Content-Type': 'application/json', // 此處格式自定義
token: getLocalStorage('token')
}
}
config.withCredentials = true
config.timeout = 5000 // 超時時間
return config
},
error => {
return Promise.reject(error)
}
)
複製代碼
響應攔截器 根據後臺返回數據,作些統一處理
// 添加響應攔截器
axios.interceptors.response.use(
res => {
let data = res.data
if (res.statusCode !== 200) {
if (data.failureReason === 4011 || data.failureReason === 4012) {
console.log('須要從新登陸')
}
} else {
if (data.resultStates === 0) {
return data
} else {
return Promise.reject(data)
}
}
},
error => {
notification['error']({
message: '提示',
duration: 2,
description: '後臺報錯'
})
// 對響應錯誤作點什麼
return Promise.reject(error)
}
)
複製代碼
封裝get,post,並導出
export function get (url, params = {}) {
return new Promise((resolve, reject) => {
axios
.get(url, {
params: params
})
.then(response => {
if (response.success) {
resolve(response.data)
}
})
.catch(err => {
reject(err)
})
})
}
/** * 封裝post請求 * @param url * @param data * @returns {Promise} */
export function post (url, data = {}) {
return new Promise((resolve, reject) => {
axios.post(url, data).then(
response => {
if (response.success) {
resolve(response.data)
}
},
err => {
reject(err)
}
)
})
}
複製代碼
重點:新建 api.js 文件 將後臺請求接口所有寫在此處,統一管理
import { get, post } from './axios'
const api = {
reqLogin: p => post('api/user/addFormId', p),
reqGetInfo: p => post('api/user/addFormId', p)
}
export default api
// 將 api 引入到 main.js 中
Vue.prototype.$api = api
// 這樣頁面中使用
this.$api.reqLogin().then(res => {
console.log(res)
})
複製代碼
是否是很是方便?鼓掌 啪啪啪啪......
web 前端羣招人,有夢想的一羣小青年 www.jianshu.com/p/33eee1c26…