准备工作

需求由来: 当项目越来越大的时候提高项目运行编译速度、压缩代码体积、项目维护、bug修复......等等成为不得不考虑而且不得不做的问题。

      又或者后面其他同事接手你的模块,或者改你的bug时避免人家看的眼痛以及心里千百句mamaipi...问候。

      并且一个好的开发思路也能大大提高开发效率,以及检验自己。

进入正题:

在本地用 vue-cli 新建一个项目,这个步骤vue的官网上有,我就不再说了。

这里展示一下我的项目架构目录  这次主要讲红字具体实现部分

      ├── build                       // 项目build脚本
├── config // 项目配置目录
├── dist // 项目输出部署目录,执行 npm run build后生成
├── src // 生产目录
│   ├── assets // 静态资源,包含图片等
│   ├── components // 项目公用组件,例如Header、Footer组件等
│   ├── mock // 接口mock文件目录
│   └── index.js // mock接口集合文件
│   ├── pages // 页面目录
│   │ ├── Demo // Demo模块,必须用大写开头
│   │ │ ├── components // Demo模块专用组件 组件建议全部首字母大写
│   │ │ ├── style // Demo模块专用css
│   │ │ ├── services // Demo模块服务,可以包含相应方法类
│   │ │ ├── interface.js // Demo模块接口结合文件
│   │ │ └── index.vue // Demo模块页面入口
│   │ └── Other // 其他页面目录
│   ├── router // 路由配置文件,如果路由太多了,可以拆分
│   ├── services // 项目公用配置服务
│   │ │ ├── ajax.js // 所有接口请求公共配置 可以和 request.js 合并一起 不嫌代码太长的话
│   │ │ ├── request.js // (需求有则添加) 为所有接口设置公共请求头
│   │ │ ├── prompt.js // 全局的提示 例如:接口错误提示、保存成功提示、操作错误提示等等...
│   │ │ ├── validate.js // 全局表单校验具体封装可参照element-ui form表单模块
│   ├── App.vue // 组件入口
│   ├── config.js // 项目配置文件 例如:权限校验,cookie设置、access_token获取等等...
│   ├── interface.js // 项目公共接口文件
│   └── main.js // Webpack 预编译主入口
├── style // 项目公用style
├── static // 静态文件目录,保留
│ └── i18n // 国际化目录,每一个目录为一种语言
│ ├── zh // 中文目录
│ │ └── index.json // 配置文件
│ └── en // 英文目录
├── index.html // 项目入口文件,一般不用改动
├── package.json // 项目配置
├── README.md // 项目说明
├── CHANGE_LOG.md // 项目更新历史文档
└── test // 测试目录

services/aiax.js文件

/**
* ajax 模块,可以将 axios 替换成 $.ajax 等
*/
import axios from 'axios';
import globalConfig from '../config'
import { Notification } from 'element-ui' // 注: 具体设置具体判断 根据公司项目需求 以及 接口需求 现在以我公司为例 const init = function () {
// 添加 axios 请求拦截器为所有请求加上前缀 、 access_token (我公司所有接口都比要有 access_token才能访问)
// 有对 axios 不是很了解的 可以看看 axios 官方文档 https://www.kancloud.cn/yunye/axios/234845
axios.interceptors.request.use(function (config) {
// 为所有接口加上前缀 例 https://www.kancloud.cn/yunye/axios/234845 前缀为 https://www.kancloud.cn
// 因为相同环境下的所有接口前缀肯定是一样的 window.localStorage.gatewayDomain 为前缀域名 倘若后面更改域名之类的 只需改一个地方就行了 就不用说每个调接口的地方都去改 维护便捷
// 若想了解分环境打包以及分环境设置 公共域名、前缀等 请看以往博文 https://www.cnblogs.com/ljx20180807/p/9456489.html
config.url = window.localStorage.gatewayDomain + config.url // 登录时设置 cookies
var cookies = globalConfig.getCookies()
if (config.url.indexOf('?') < 0) {
config.url += '?'
}
// 为所有接口加上 access_token
config.url += ('access_token=' + cookies['access_token'])
if (!config.data) config.data = {}
return config;
}, function (err) {
// 错误处理
return Promise.reject(err)
}) // 添加 axios 响应拦截器
axios.interceptors.response.use(function (response) { // 这里是当接口请求服务器成功响应的情况 解构赋值出需要的数据
const {status, data} = response; if (status === 200) {
// 如果不出现错误,直接向回调函数内输出 data 状态200
if (data.error === 'SUCCESS') {
// 成功不用提示
return data
} else {
// 若出现错误则弹窗错误提示
if (data.message) {
Notification({
title: '错误',
message: data.message,
type: 'error',
customClass: 'el-error-msg',
duration: 2000
})
}
return data
}
} else {
return response;
}
}, function (error) {
// 这里是当接口请求失败的情况 (例如服务器没响应、后台代码问题之类的) (具体的响应判断根据你后台返回状态码结构)
const {response} = error; // 这里处理错误的 http code
if (!response || response.status === 404) {
if (!response) { // access_token 失效的情况 弹窗提示
Notification({
title: '错误',
message: 'access_token已失效请重新登录',
type: 'error',
customClass: 'el-error-msg',
duration: 1500,
onClose() {
window.location.href = window.localStorage.loginUrl // 自动跳转返回登录页重新获取access_token
}
})
} else {
// 这是请求url不对的情况
console.log('404 error %o' + error);
}
}
// Do something with response error 对响应错误做点什么
return Promise.reject(error.message);
});
}; export default {
init
}

services/prompt.js文件

const init = function () {
const _this = this;
// 建议为了方便使用,这里可以包装window.Alert 具体怎么使用往下看
window.Alert = function (msg, duration = 3000) {
// 错误提示
_this.$notify({
title: '错误',
message: msg,
type: 'error',
customClass: 'el-error-msg',
duration
});
}
 // 成功提示
window.Tips = function (msg, duration = 3000) {
_this.$notify({
title: '成功',
message: msg,
type: 'success',
duration
});
}
 // 警告提示
window.Warning = function (msg, duration = 3000) {
_this.$notify({
title: '警告',
message: msg,
type: 'warning',
duration
});
} // 全局延时器
window.SetTimeout = function (path, queryObject) {
setTimeout(_ => {
_this.$router.push({
path: path,
query: queryObject
});
}, 500)
}
}; export default {
init
}

page/Demo/interface.js文件  (pc端不建议用vuex  具体看需求吧   vuex管理版本 往下看)

import axios from 'axios';

const ajax = {
// 获取影像件上传列表
GET_IMAGE_LIST: 'images?'
};
// 提取公共部分
const API_PATH_PRE_FIX = 'apply/v1/'; // 增加接口模块前缀
let INTERFACE = {};
for (let key in ajax) {
INTERFACE[key] = API_PATH_PRE_FIX + ajax[key];
} /**
* 方式1: 多参数情况 获取列表
* @param data 参数
* @returns {*}
*/
function getImageList(data) {
return axios.get(INTERFACE.GET_IMAGE_LIST, {
params: data
}).catch(function (error) {
window.Alert(error);
});
} /**
* 方式2: es6模板语法 获取基本信息
* @param data 参数
* @returns {*}
*/
function getContrantInfo(API_PATH_PRE_FIX, agreementId) {
return axios.get(`${API_PATH_PRE_FIX}/middle/agreement/basic?agreementId=${agreementId}&`).catch(function (error) {
window.Alert(error);
});
}
export default {
getImageList,
getContrantInfo,
};

page/Demo/index.vue文件

<script>
// 引入上面的接口文件
import INTERFACE from './interface'
export default {
data() {
return {
imageList: [],
deleteList: []
}
},
created() {
// 获取列表 (调用封装好的请求)
INTERFACE.getImageList().then(data => {
if (data && data.data) this.imageList = data.data
})
},
methods: {
// 确认删除
handleDelete() {
INTERFACE.deleteAgreement(this.deleteList).then(data => {
// 操作成功提示 (上面定义好的全局提示)
window.Tips('删除成功!')
})
}
}
}
</script>

src/main.js文件

import Vue from 'vue'
import ElementUI from 'element-ui'
import App from './App'
import ajax from '@/services/ajax' // axios 统一配置
ajax.init() // 全局变量
indow.localStorage.gatewayDomain = 'https://dev-api.cn/'
window.localStorage.defaultLanguage = 'ZH_CN'

src/App.vue文件

<script>
import prompt from '@/services/prompt'
export default {
name: 'app',
mounted() {
// 全局错误初始化
prompt.init.call(this)
}
}
</script>

以上就是pc端的项目配置化、请求统一管理内容了。有疑问的地方留言看到后会第一时间回复,或可改进的地方欢迎指导, 下面介绍vuex管理版本。

移动端结合Vuex 统一管理请求 stroe/actions.js文件

import Vue from 'vue'

// 全局域名
const apiUrlBase = window.apiUrlBase const API_URL = {
GET_APPLICENT: `${apiUrlBase}/app/v1/apply/dictionaries`
} const actions = {
/**
* 获取投保人数据字典
*/
actions.getApplicent = ({ state }) => {
return new Promise((resolve, reject) => {
Vue.http.get(`${API_URL.GET_APPLICENT}?access_token=${state.accessToken}`).then((ret) => {
resolve(ret.body)
}).catch((err) => {
reject(err)
})
})
}
} export default actions

.vue文件里调用

this.$store.dispatch(`${storeName}/getApplicent`)
.then((data) => {
console.log(data)
})

这就可以啦。

本文为原创 转载请注明出处 。

Vue + webpack 项目配置化、接口请求统一管理的更多相关文章

  1. Vue+webpack项目配置便于维护的目录结构

    新建项目的时候创建合理的目录结构便于后期的维护是很重要 环境:vue.webpack 目录结构: 项目子目录结构 子目录结构都差不多,主要目录是在src下面操作 src目录结构 src/common ...

  2. Vue项目中的http请求统一管理

    module.exports = { dev: { // Paths assetsSubDirectory: '/', assetsPublicPath: '/', proxyTable: { /op ...

  3. VUE前端项目配置代理解决跨域问题

    VUE前端项目配置代理解决跨域问题 问题如下,经常在本地调试接口出现这种问题 解决方式1:Chrome 的扩展插件 以前使用Chrome 的扩展插件,但是有时候还是会出现莫名其妙的问题. 需要梯子才行 ...

  4. JavaWeb项目配置化之Properties类的使用

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6397370.html  在项目中的应用见: https://github.com/ygj0930/Couple ...

  5. Vue+webpack项目的多环境打包配置

    背景:由于需要将应用部署到线上开发环境.线上测试环境.线上预发环境.线上生产环境,而每个环境的访问地址是不同的.如果每次更改请求地址未免有些繁琐,就考虑在本地进行一次性配置. 代码管理工具:git 代 ...

  6. 构建:vue项目配置后端接口服务信息

    背景 vue-cli脚手架生成的webpack标准模板项目 HTTP库使用axios 一.开发环境跨域与API接口服务通信 整体思路: 开发环境API接口请求baseURL为本地http://loca ...

  7. Vue + webpack 项目实践

    Vue.js 是一款极简的 mvvm 框架,如果让我用一个词来形容它,就是 “轻·巧” .如果用一句话来描述它,它能够集众多优秀逐流的前端框架之大成,但同时保持简单易用.废话不多说,来看几个例子: & ...

  8. nodejs, vue, webpack 项目实践

    vue 及 webpack,均不需要与nodejs一期使用,他们都可以单独使用到任何语言的框架中. http://jiongks.name/blog/just-vue/ https://cn.vuej ...

  9. 一字一句的搞懂vue-cli之vue webpack template配置

    webpack--神一样的存在.无论写了多少次,再次相见,仍是初见.有的时候开发vue项目,对尤大的vue-cli感激涕零.但是,但是,但是...不是自己的东西,真的很不想折腾.所以,我们就得深入内部 ...

随机推荐

  1. 在 2016 年学 JavaScript 是一种什么样的体验?(React从入门到放弃)

    jquery 年代 vs 前端模块化 http://blog.csdn.net/offbye/article/details/52793921 ++ 嘿,我最近接到一个 Web 项目,不过老实说,我这 ...

  2. 轮播图(jQuery)

    效果图: -----------------------------------------html------------------------------------------------- ...

  3. 蚂蚁金服×西安银行 | 西安银行手机银行App的智能升级之路

    小蚂蚁说: 当前,数字化信号已经逐渐深入到社会的每个角落,影响着用户的心智和行为,来到数字化时代门口的银行,需要注意到数字化信号.西安银行通过引入蚂蚁金服移动开发平台mPaaS,对手机银行进行架构升级 ...

  4. Codeforces Round #219 (Div. 2) D. Counting Rectangles is Fun 四维前缀和

    D. Counting Rectangles is Fun time limit per test 4 seconds memory limit per test 256 megabytes inpu ...

  5. WebSocket 教程

    转载自:http://www.ruanyifeng.com/blog/2017/05/websocket.html WebSocket 是一种网络通信协议,很多高级功能都需要它. 本文介绍 WebSo ...

  6. Cannot set property 'onclick' of null的问题

    转载自: https://my.oschina.net/ximidao/blog/351017 摘要: 测试点击事件的时候浏览器报错,提示Uncaught TypeError: Cannot set ...

  7. Spring中JdbcTemplate使用RowMapper

    package com.cxl.demo.dao; import java.sql.ResultSet; import java.sql.SQLException; import java.util. ...

  8. python 目录切换

    #- * -coding: utf - - * - import os, sys path = "c:\\" # 查看当前工作目录 retval = os.getcwd() pri ...

  9. Java String常用的两个方法

  10. EditText取消焦点

    EditText取消焦点: 在父容器添加: android:focusable="true" android:focusableInTouchMode="true&quo ...