Vue + webpack 項目配置化、接口請求統一管理

準備工作

需求由來: 當項目越來越大的時候提高項目運行編譯速度、壓縮代碼體積、項目維護、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/234845axios.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.htmlconfig.url = window.localStorage.gatewayDomain + config.url// 登錄時設置 cookiesvar cookies = globalConfig.getCookies()if (config.url.indexOf('?') < 0) {config.url += '?'}// 為所有接口加上 access_tokenconfig.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  狀態200if (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 codeif (!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.apiUrlBaseconst 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)})

這就可以啦。

本文為原創 轉載請注明出處 。

?

轉載于:https://www.cnblogs.com/ljx20180807/p/9799545.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450442.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450442.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450442.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python實現Adaboost

1.Adaboost概念 提升方法的思路是綜合多個分類器&#xff0c;得到更準確的分類結果。 即“三個臭皮匠頂個諸葛亮”。《統計學習方法》稱AdaBoost是提升算法的代表&#xff0c;所謂提升算法&#xff0c;指的是一種常用的統計學習方法&#xff0c;應用廣泛且有效。在分類問題中&a…

Java List<T>去重方法,引用類型集合去重

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、實體類中要重寫比較方法equals&#xff0c;最好也重寫hashcode方法 public class WorkWeightDto implements Serializable {privat…

MyBatis知識點

一、MyBatis簡介 1.1 框架概念 框架&#xff0c;就是軟件的半成品&#xff0c;完成了軟件開發過程中的通用操作&#xff0c;程序員只需很少或者不用進行加工就能夠實現特定的功能&#xff0c;從而簡化開發人員在軟件開發中的步驟&#xff0c;提高開發效率。 1.2 常用框架 MVC…

android studio : clang++.exe: error: invalid linker name in argument '-fuse-ld=bfd

公司jenkins上的C編譯器最近換成了clang&#xff0c;今天更新了代碼發現本地的C/C代碼用NDK編譯不過了&#xff0c;提示&#xff1a; “clang.exe: error: invalid linker name in argument -fuse-ldbfd” 解決辦法&#xff1a; 將Android.mk文件中的“LOCAL_LDFLAGS -fuse-ld…

Git知識點

一、Git簡介 1.1 項目的版本管理 在項目開發過程中&#xff0c;項目沒開發到一個節點就會對當前項目進行備份&#xff0c;這個備份就是項目的一個版本&#xff1b;當我們繼續開發一個階段后&#xff0c;再次進行備份&#xff0c;就生成新的版本——多個版本的集合就是項目的版…

(1)初始化項目

2019獨角獸企業重金招聘Python工程師標準>>> &#xff08;1&#xff09;初始化項目 1 使用vue-cli初始化項目 vue init webpack my-renren得到以下輸出&#xff1a; ? Project name my-renren ? Project description A Vue.js project ? Author neumeng <4048…

C語言變量

C語言二進制、八進制、十六進制詳解 什么是二制制? 在數學計算中&#xff0c;二進制計數系統的公分母是最小的&#xff0c;它以2為基數。你還記得在小學或中學時所學的不同的計數系統嗎?筆者在上小學時&#xff0c;曾在一堂數學課中學過以6為基數的計數系統&#xff1b;你先…

Spring Data JPA - 參考文檔 地址

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Spring Data JPA - 參考文檔 文檔地址

JS內置方法(Array)

concat() 用于連接兩個或多個數組&#xff0c;該方法不會改變現有的數組&#xff0c;而是返回被連接數組的一個副本。join() 把數組中的所有元素放入一個字符串&#xff0c;元素是通過指定的分隔符進行分隔的。若省略了分隔符參數&#xff0c;則使用逗號作為分隔符。push() 向…

模切ERP和免費OA系統是互相結合提高效率

模切ERP和免費OA系統是互相結合提高效率在模切行業中&#xff0c;模切ERP在管理上的作用占了很大的比重&#xff0c;但是免費OA在管理上的地位都不容忽視的。點晴OA的核心問題是如何提高日常的辦公效率問題。因此點晴OA系統里包含的功能是非常全面&#xff0c;如&#xff1a;辦…

maven知識點

一、Maven簡介 1.1 在項目中如何導入jar包&#xff1f; 下載jar包 &#xff08;mvn&#xff09;將下載的jar包拷貝到項目中&#xff08;WEB-INF/lib&#xff09;選擇jar文件–右鍵–Add as Library 1.2 傳統導入jar包的方式存在什么問題&#xff1f; 步驟多&#xff08;相對…

使用SpringBoot yml配置文件

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.上一次我們已經使用SpringBoot實現了一個簡單的HelloWord程序&#xff0c;辣么接下來我們簡單的使用一下他的yml格式的配置文件。 2.在…

軟件行業資訊

為什么只有設計師才能發明流行的新語言 先回顧一下知名編程語言的作者和創造時間&#xff1a;Fortran 語言&#xff0c;50年代&#xff0c;IBM 研究員&#xff1b;Lisp 語言&#xff0c;50年代&#xff0c;MIT 的教授和學生&#xff1b;C語言&#xff0c;70年代&#xff0c;貝爾…

spring知識點

一、Spring概述 1.1 web項目開發中的耦合度問題 在Servlet中需要調用service中的方法&#xff0c;則需要在Servlet類中通過new關鍵字創建Service的實例 public interface ProductService{public List<Product> listProducts(); }public class ProductServiceImpl1 imple…

Linux系統下的權限試題測試

不會做的留言&#xff0c;到時在發布答案&#xff01;一、 有兩個參賽團隊team1、team2&#xff0c;兩個團隊各3人, 這兩個團隊互相競爭&#xff0c;各需提交一份報告&#xff0c;每組成員可以修改自己團隊內的所有文件&#xff0c;且不能讓其他團隊的人修改自己的文件內容&…

電子科大軟件系統架構設計——軟件建模詳細設計

文章目錄 軟件建模詳細設計概述軟件建模詳細設計目標軟件建模詳細設計原則開閉原則里氏 (Liskov) 替換原則依賴倒置原則接口分離原則單一職責原則最少知識原則&#xff08;迪米特法則&#xff09;高內聚原則松耦合原則可重用原則 軟件建模詳細設計內容 UML 軟件靜態結構視圖建模…

YAML文件解析

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 YAML是“另一種標記語言”的外語縮寫,YAML 是一種比JSON&#xff08;json多層次{ 與 [ 會被搞暈的&#xff09;更直觀的表現形式&#xf…

120分鐘React快速掃盲教程

在教程開端先說些題外話&#xff0c;我喜歡在學習一門新技術或讀過一本書后&#xff0c;寫一篇教程或總結&#xff0c;既能幫助消化&#xff0c;也能加深印象和發現自己未注意的細節&#xff0c;寫的過程其實仍然是一個學習的過程。有個記錄的話&#xff0c;在未來需要用到相關…

springmvc知識點

一、SpringMVC概述 Spring MVC 是由Spring官方提供的基于MVC設計理念的web框架。 SpringMVC是基于Servlet封裝的用于實現MVC控制的框架&#xff0c;實現前端和服務端的交互。 1.1 SpringMVC優勢 嚴格遵守了MVC分層思想 采用了松耦合、插件式結構&#xff1b;相比較于我們封裝的…

spring @component的作用

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1、controller 控制器&#xff08;注入服務&#xff09; 2、service 服務&#xff08;注入dao&#xff09; 3、repository dao&#xff…