123、Vue Cli3 项目配置

<meta charset="utf-8">

一、新建项目

使用 vue-cli3 构建一个初始的Vue项目:Cli3 官方文档

以下配置是我在项目中常用的,大家可自己斟酌是否需要使用!

1、环境变量

主要用于区分 开发、测试、正式环境的
(1) 在根目录新建三个文件:.env.dev .env.test .env.prod
(2) .env.dev写入

NODE_ENV = 'development'
VUE_APP_CURRENTMODE = 'test'

(3) .env.test写入

NODE_ENV = 'production'
VUE_APP_CURRENTMODE = 'test'

(4) .env.prod写入

NODE_ENV = 'production'
VUE_APP_CURRENTMODE = 'prod'

(5) 修改package.jsonscript

"scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
}

修改为

"scripts": {
    "serve": "vue-cli-service serve --mode dev", // 本地运行
    "btest": "vue-cli-service build --mode test", // 测试环境打包
    "build": "vue-cli-service build --mode prod", // 正式环境打包
    "lint": "vue-cli-service lint"
}

(5) 在main.js写入

// 是否为测试环境
Vue.prototype.$istest = process.env.VUE_APP_CURRENTMODE === 'test'

console.log('当前NODE_ENV:' + process.env.NODE_ENV)
console.log('当前VUE_APP_CURRENTMODE:' + process.env.VUE_APP_CURRENTMODE)
console.log('是否为测试环境:' + Vue.prototype.$istest)

(6) 重启npm run serve,这里就不要使用vue ui启动项目了,反正我通过它启动后,无法获取process.env.VUE_APP_CURRENTMODE的值,只能通过命令行运行npm run serve启动
控制台打印结果:

image

2、别名设置

(1) 在vue.config.js 顶部新增

// path依赖
const path = require('path')

// 查找文件方法
const resolve = dir => {
    return path.join(__dirname, dir)
}

(2) 在vue.config.js module.exports chainWebpack新增

// 别名配置
config.resolve.alias
    .set('assets', resolve('src/assets'))
    .set('components', resolve('src/components'))

(3) 重启npm run serve生效

若你使用的别名是图片路径的话
1、普通引入图片:需要这样使用<img src="~assets/img1.jpg" />,不能省略~
2、动态引入图片:需要这样使用<img :src="require('assets/img2.jpg')" />,不能加上~
3、css背景图:background-image: url('~assets/img1.jpg'),不能省略~

3、全局Sass配置

在使用sass时,难免会书写一些常用的变量、函数、混合等,除了变量可以继承外,其他的只能在当前文件生效,那岂不是我需要在每一个.vue里面的<style lang="scss">手动引入@import '~@/style/mixin.scss';。答案肯定是不用啦,完全可以配置成全局的

(1) 在vue.config.js module.exports 新增

// SASS配置
css: {
    loaderOptions: {
        sass: {
            data: '@import "@/style/app.scss";'
        }
    }
}

(2) 在src新建style文件夹,然后在style新建app.scss

// 一些变量
$primary: #3398ff;
$success: #29cc7a;
$danger: #ee6869;

// 一些混合
@mixin primary {
    color: $primary;
}
@mixin success {
    color: $success;
}
@mixin danger {
    color: $danger;
}

// 一些循环
@for $i from 12 through 30 {
    .f#{$i} {
        font-size: 1px * $i !important;
    }
}

(3) 重启npm run serve,然后在.vue使用
<style lang="scss">中使用

.div1 {
    color: $primary; // 使用scss变量
}
.div2 {
    @include success; // 使用scss混合
}

template中使用

<div class="f24">使用scss循环生成的类名(.f12 ~ .f30)f代表:font-size</div>

4、全局默认Css配置

public/index.html里面的<head>新增<style>即可

<style>
* {
    margin: 0;
    padding: 0;
    font-family: 'Microsoft YaHei', '微软雅黑', 'PingFang SC', Arial;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}
</style>

5、基础组件的自动化全局注册

(1) 在src/components新建global.js

import Vue from 'vue'

// 找到components文件夹下以.vue命名的文件
const RC = require.context('.', true, /\.vue$/)

RC.keys().forEach(fileName => {
    const componentConfig = RC(fileName)

    // 因为得到的filename格式是: './baseButton.vue', 所以这里我们去掉头和尾,只保留真正的文件名
    let componentName = fileName.replace(/^\.\//, '').replace(/\.\w+$/, '')
    let index = componentName.indexOf('/')
    if (index !== -1) componentName = componentName.substr(index + 1)

    Vue.component(componentName, componentConfig.default || componentConfig)
})

(2) 在main.js里面引入

import './components/global'

(3) 不用重启,直接在.vue里面template写组件即可

<hello-world/>

6、Vuex配置

(1) 安装依赖:cnpm i -S vuex-persistedstate

vuex在刷新后会重新更新状态,但是有时候我们并不希望如此。例如全局相关的,如登录状态、token、以及一些不常更新的状态等,我们更希望能够固化到本地,减少无用的接口访问,以及更佳的用户体验。
vuex-persistedstate:即可解决,可将值放到 sessionStoragelocalStorage

(2) 在src/store.js 修改

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
    state: {},
    mutations: {},
    actions: {}
})

修改为

import Vue from 'vue'
import Vuex from 'vuex'
import createPersistedState from 'vuex-persistedstate'

Vue.use(Vuex)

export default new Vuex.Store({
    state: {
        // token信息
        token: ''
    },
    mutations: {
        save(state, [key, data, local = false]) {
            if (!key) throw new Error('mutations save need key!')
            const keyPath = key.split('.')
            const len = keyPath.length
            const lastKey = keyPath.pop()
            let needSave = state
            for (let i = 0; i < len - 1; i++) {
                needSave = needSave[keyPath[i]]
            }
            if (!needSave.hasOwnProperty(lastKey)) {
                throw new Error(`【${key}】 Error Key: ${lastKey}`)
            }
            needSave[lastKey] = data
            if (local) {
                window.sessionStorage.setItem(key, JSON.stringify(data))
            }
        }
    },
    plugins: [createPersistedState({ storage: window.sessionStorage })]
})

(3) 无需重启,直接刷新页面即可成功使用vuex
(4) 在.vue中,执行

this.$store.commit('save', ['token', 'token2'])

即可改变 state.token 的值

7、Vue-Router配置

(1) 安装依赖:cnpm i -S vue-router-auto

vue-router-auto:将项目文件自动转为相应的路由配置

(2) 在src/route.js修改

import Vue from 'vue'
import Router from 'vue-router'
import Home from './views/Home.vue'

Vue.use(Router)

export default new Router({
    mode: 'history',
    base: process.env.BASE_URL,
    routes: [
        {
            path: '/',
            name: 'home',
            component: Home
        },
        {
            path: '/about',
            name: 'about',
            // route level code-splitting
            // this generates a separate chunk (about.[hash].js) for this route
            // which is lazy-loaded when the route is visited.
            component: () =>
                import(/* webpackChunkName: "about" */ './views/About.vue')
        }
    ]
})

修改为

import Vue from 'vue'
import Router from 'vue-router'
import autoRouter from 'vue-router-auto' // 引入依赖

if (!window.VueRouter) Vue.use(Router)

// 自动生成路由数据
const routes = autoRouter({
    redirect: '/home',
    rc: require.context('@/views', true, /\.vue$/)
})

// 将生成的路由数据,挂载到 new Router
export default new Router({
    mode: 'history',
    base: process.env.BASE_URL,
    routes
})

8、api请求配置

(1) 安装依赖:cnpm i -S axios hzq-axios

hzq-axios:对 axios 请求的二次封装,封装成 Vue 插件 this.$api ,并支持Axios请求、响应拦截

(2) 在src下,新建apiurl文件夹,在apiurl文件夹下新建index.js

export default [
    {
        name: 'GetImageCaptcha',
        url: '/Captcha/GetImageCaptcha'
    }
]

(3) 在main.js里引入并使用:

import hzqAxios from 'hzq-axios'

Vue.use(hzqAxios, require.context('@/apiurl', true, /\.js$/), {
    baseURL: '/api',
    // 请求拦截之前
    beforeRequest(config) {
        console.log(config)
        return config
    },
    // 接口响应成功事件
    respSuccess(res) {
        console.log(res)
    },
    // 接口响应失败事件
    respError(e) {
        console.log(e)
    }
})

(4) 在vue.config.js module.exports 新增devServer的设置

devServer: {
    // 代理
    proxy: {
        '/giftapi': {
            target: 'http://***.***.com',
            ws: true,
            changeOrigin: true
        }
    }
}

(5) 重启npm run serve生效
(6) 在.vue中,这样使用

this.$api.GetImageCaptcha().then(res => {
        if (res.code === 1) {
        console.log(res.data)
    }
})

9、Vue全局方法、变量配置

(1) 安装依赖:cnpm i -S hzq-tool

hzq-tool:基于 Vue 对一些常用的工具函数进行封装,通过 this.$tool 调用

(2) 在main.js引入并使用

import hzqTool from 'hzq-tool'

Vue.use(hzqTool)

(3) 无需重启,在.vue里面使用

const b = { name: '12' }
const a = this.$tool.copy(b) // 深拷贝方法
this.$setItem('id', '123456') // 往sessionStorage存入数据
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341

推荐阅读更多精彩内容