目標搭建一個Vue Cli 中後臺項目的基礎。一步一步搭建,衆多知識點已經有不少文字,這裏會綜合比較多的鏈接。接觸的點會多,可是篇幅,不但願太大。
學習的時候,但願多翻閱文檔,資料地址也會引入到原文
keep-alive
附錄中的 VUE 9個性能優化祕密?(vue-9-perf-secrets) 其中之一優化辦法就是 keep-alive
開發環境:
+ Win10 x64
+ node v10.15.3
+ npm v6.4.1
+ @vue/cli 3.6.3
複製代碼
vue create project-name
複製代碼
縮減篇幅,省略具體建立過程。html
.
├── build 項目構建配置
├── public 打包所需靜態資源
└── src
├── api AJAX請求
└── assets 項目靜態資源
├── icons SVG 圖標資源
├── fonts 字體圖標資源
└── images 圖片資源
├── components 業務組件
├── config 項目運行配置
├── directive 自定義指令
├── libs 封裝工具函數
├── router 路由配置
├── store Vuex配置
└── views 頁面文件
複製代碼
圖標字體,也能夠用SVG代替,方案能夠作一個SVG組件,經過名字,載入不一樣的 SVG圖標,經過size,控制圖標大小,color,控制顏色便可vue
給axios作個挺靠譜的封裝(報錯,鑑權,跳轉,攔截,提示) iview-admin
axios 用繼承封裝。當中亮點,對請求隊列作了處理,屢次請求同一個地址,會節流。node
// 安裝
npm i axios
複製代碼
Axios.interceptors.request
帶上本身須要的參數,好比CSRF/XSRF,基礎鑑權 token,請求時間戳
對請求數據作處理,轉表單,或轉Json
對錯誤的狀況統一處理webpack
Axios.interceptors.interceptors
對響應結果統一處理,響應結果狀態status 判斷解封裝,錯誤處理等ios
iview-admin
libs/axios.js
git
import axios from 'axios'
import store from '@/store'
// import { Spin } from 'iview'
const addErrorLog = errorInfo => {
const { statusText, status, request: { responseURL } } = errorInfo
let info = {
type: 'ajax',
code: status,
mes: statusText,
url: responseURL
}
if (!responseURL.includes('save_error_logger')) store.dispatch('addErrorLog', info)
}
class HttpRequest {
constructor (baseUrl = baseURL) {
this.baseUrl = baseUrl
this.queue = {}
}
getInsideConfig () {
const config = {
baseURL: this.baseUrl,
headers: {
//
}
}
return config
}
destroy (url) {
delete this.queue[url]
if (!Object.keys(this.queue).length) {
// Spin.hide()
}
}
interceptors (instance, url) {
// 請求攔截
instance.interceptors.request.use(config => {
// 添加全局的loading...
if (!Object.keys(this.queue).length) {
// Spin.show() // 不建議開啓,由於界面不友好
}
this.queue[url] = true
return config
}, error => {
return Promise.reject(error)
})
// 響應攔截
instance.interceptors.response.use(res => {
this.destroy(url)
const { data, status } = res
return { data, status }
}, error => {
this.destroy(url)
let errorInfo = error.response
if (!errorInfo) {
const { request: { statusText, status }, config } = JSON.parse(JSON.stringify(error))
errorInfo = {
statusText,
status,
request: { responseURL: config.url }
}
}
addErrorLog(errorInfo)
return Promise.reject(error)
})
}
request (options) {
const instance = axios.create()
options = Object.assign(this.getInsideConfig(), options)
this.interceptors(instance, options.url)
return instance(options)
}
}
export default HttpRequest
複製代碼
面試一般都會被問到,數據通訊的問題,跨組件之間如何實現數據管理。github
固然方法不止 vuex
,web
import Vue from 'vue'
import Vuex from 'vuex'
// 按模塊拆分
import app from './module/app'
// 打開 vuex logs
import createLogger from 'vuex/dist/logger'
Vue.use(Vuex)
const debug = process.env.NODE_ENV !== 'production'
export default new Vuex.Store({
state: {
},
mutations: {
},
actions: {
},
// 按模塊引入
modules: {
app
},
strict: debug,
plugins: debug ? [createLogger()] : []
})
複製代碼
children
能夠更好的組織頁面meta
字段,個性化定製一些功能const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
// todo 在路由守衛中,能夠判斷用戶登陸狀況,鑑權,
})
複製代碼
iview-admin
中側邊菜單欄權限,是在 router meta增長一個字段,ajax
調整 webpack 配置最簡單的方式就是在 vue.config.js 中的 configureWebpack 選項提供一個對象:
// vue.config.js
module.exports = {
configureWebpack: {
plugins: [
new MyAwesomeWebpackPlugin()
]
}
}
複製代碼
該對象將會被 webpack-merge 合併入最終的 webpack 配置。
文檔中,說起鏈式操做 (高級)、修改 Loader 選項、替換Loader、新建Loader、修改插件,等等。
NODE_ENV
若是在環境中有默認的 NODE_ENV,你應該移除它或在運行 vue-cli-service 命令的時候明確地設置 NODE_ENV。
模式是 Vue CLI 項目中一個重要的概念。默認狀況下,一個 Vue CLI 項目有三個模式:
development
模式用於 vue-cli-service serve
production
模式用於 vue-cli-service build
和 vue-cli-service test:e2e
test
模式用於 vue-cli-service test:unit
注意模式不一樣於 NODE_ENV
,一個模式能夠包含多個環境變量。也就是說,每一個模式都會將 NODE_ENV
的值設置爲模式的名稱——好比在 development 模式下 NODE_ENV
的值會被設置爲 "development"
。
你能夠經過爲 .env
文件增長後綴來設置某個模式下特有的環境變量。好比,若是你在項目根目錄建立一個名爲 .env.development
的文件,那麼在這個文件裏聲明過的變量就只會在 development
模式下被載入。
你能夠經過傳遞 --mode
選項參數爲命令行覆寫默認的模式。例如,若是你想要在構建命令中使用開發環境變量,請在你的 package.json
腳本中加入:
"dev-build": "vue-cli-service build --mode development",
複製代碼
只有以 VUE_APP_
開頭的變量會被 webpack.DefinePlugin
靜態嵌入到客戶端側的包中。你能夠在應用的代碼中這樣訪問它們:
console.log(process.env.VUE_APP_SECRET)
複製代碼
NODE_ENV
能夠對不一樣環境作出不一樣的配置resolve.alias
devServer
,解決跨域開發問題const path = require('path')
// Webpack包文件分析器
// const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
function resolve (dir) {
return path.join(__dirname, './', dir)
}
// 項目部署基礎 (webpack 的 devServer 地址)
// process.env.NODE_ENV
// 正式環境 production
// 開發環境 development
// 默認狀況下,咱們假設你的應用將被部署在域的根目錄下,
// 例如:https://www.my-app.com/
// 默認:'/'
// 若是您的應用程序部署在子路徑中,則須要在這指定子路徑
// 例如:https://www.foobar.com/my-app/
// 須要將它改成'/my-app/'
const BASE_URL = process.env.NODE_ENV === 'production'
? '/my-app/'
: '/'
module.exports = {
// 這裏是對環境的配置,不一樣環境對應不一樣的BASE_API,以便 axios 的請求地址不一樣 baseUrl 從 Vue CLI 3.3 起已棄用,請使用publicPath
publicPath: BASE_URL,
// tweak internal webpack configuration.
// see https://github.com/vuejs/vue-cli/blob/dev/docs/webpack.md
// 若是你不須要使用eslint,把lintOnSave設爲false便可
lintOnSave: false,
/**
* 對內部的 webpack 配置進行更細粒度的修改
* https://github.com/neutrinojs/webpack-chain see
* https://github.com/vuejs/vue-cli/blob/dev/docs/webpack.md
* @param config
*/
chainWebpack: (config) => {
// key,value自行定義,好比.set('@@', resolve('src/components'))
config.resolve.alias
.set('@', resolve('src'))
.set('api', resolve('src/api'))
.set('common', resolve('src/common'))
.set('components', resolve('src/components'))
},
/**
* 調整 webpack 配置
* https://cli.vuejs.org/zh/guide/webpack.html#%E7%AE%80%E5%8D%95%E7%9A%84%E9%85%8D%E7%BD%AE%E6%96%B9%E5%BC%8F
* @param config
*/
configureWebpack: config => {
// 生產and測試環境
let pluginsPro = [
// Webpack包文件分析器(https://github.com/webpack-contrib/webpack-bundle-analyzer)
// new BundleAnalyzerPlugin()
]
// 開發環境
let pluginsDev = []
if (process.env.NODE_ENV === 'production') {
// 爲生產環境修改配置... process.env.NODE_ENV !== 'development'
config.plugins = [...config.plugins, ...pluginsPro]
} else {
// 爲開發環境修改配置...
config.plugins = [...config.plugins, ...pluginsDev]
}
},
// 打包時不生成.map文件
productionSourceMap: false,
// webpack-dev-server 相關配置 https://webpack.js.org/configuration/dev-server/
// 這裏寫你調用接口的基礎路徑,來解決跨域,若是設置了代理,那你本地開發環境的axios的baseUrl要寫爲 '' ,即空字符串
// devServer: {
// proxy: 'localhost:3000'
// }
devServer: {
// host: 'localhost',
host: '0.0.0.0',
port: 8000, // 端口號
https: false, // https:{type:Boolean}
open: true, // 配置自動啓動瀏覽器
hotOnly: true, // 熱更新
// 配置跨域處理,只有一個代理
proxy: {
'/my-app/*': {
target: 'http://xxx.xxx.xxx.xxx:xxxx/',
changeOrigin: true,
pathRewrite: {
'^/my-app': ''
}
},
'/SocketWeb/*': {
target: 'http://xxx.xxx.xxx.xxx:xxxx',
changeOrigin: true,
// websocket支持
ws: true,
secure: false
}
}
}
}
複製代碼
開發基礎環境能夠了,開發中遇到的文件夾別名,請求跨域的問題解決了,自定義配置,也能夠更具本身公司的狀況配置。還有比較自定義的部分能夠參照文檔配置。
安裝
$ npm intall webpack-bundle-analyzer --save-dev
複製代碼
webpack-bundle-analyzer
的部分。// 在運行 build 時,後臺面添加 --report
npm run build --report
// 或者在script中添加新命令
"analyze": "npm_config_report=true npm run build"
複製代碼