当前位置:   article > 正文

vue3.0+vite项目关于域名代理配置以及axios的二次封装_vue3.0配置代理

vue3.0配置代理

1.在项目根目录下添加.env.development 和 .env.production 文件 (根据实际开发需求添加,比如 .env.text等)

(1) .env.development 文件内容

  1. // 开发环境
  2. ENV = 'development'
  3. VITE_BASE_URL='https://xxx'

(2) .env.production 文件内容

  1. // 生产环境
  2. ENV = 'production'
  3. VITE_BASE_URL='https://xxx'

2.找到package.json 文件  添加如下代码

  1. "scripts": {
  2. "dev": "vite",
  3. "build": "vite build",
  4. "preview": "vite preview",
  5. "build:prod": "vite build --mode production",
  6. "build:dev": "vite build --mode development"
  7. },

3. 找到vite.config.js,添加如下代码 完成 代理 配置

  1. import { defineConfig, loadEnv} from 'vite'
  2. import vue from '@vitejs/plugin-vue'
  3. // https://vitejs.dev/config/
  4. export default defineConfig(({ mode }) => {
  5. const config = loadEnv(mode, './')
  6. return {
  7. plugins: [
  8. vue(),
  9. ],
  10. server: {
  11. hmr:true,
  12. proxy: {
  13. '/api': {
  14. target: config.VITE_BASE_URL, //目标url
  15. changeOrigin: true, //支持跨域
  16. rewrite: (path) => path.replace(/^\/api/, ""),
  17. //重写路径,替换/api
  18. }
  19. }
  20. },
  21. }
  22. })

重点来啦!!!!!! 关于axios的二次封装

首先在项目中安装 axios, (基于node环境)

npm install axios

然后进行封装,新建一个js 文件 ($axios.js),代码如下:

  1. import axios from 'axios'
  2. import { ElMessage } from 'element-plus'
  3. import router from '@/router/index'
  4. // 创建axios实例
  5. const baseUrl = '/api/';
  6. const $axios = axios.create({
  7. baseURL: baseUrl,
  8. timeout: 200000 // 请求超时时间
  9. })
  10. let isRefreshing = true;
  11. // request拦截器
  12. $axios.interceptors.request.use(config => {
  13. if (localStorage.getItem("token")) {
  14. config.headers['Authorization'] = localStorage.getItem("token");
  15. } else {
  16. config.headers['Authorization'] = 'Basic cGM6cGM='
  17. }
  18. config.headers['Content-type'] = 'multipart/form-data'
  19. config.headers['clientType'] = 'PC'
  20. return config
  21. }, error => {
  22. Promise.reject(error)
  23. })
  24. // respone拦截器
  25. $axios.interceptors.response.use(
  26. response => {
  27. // const loadingInstance = ElLoading.service()
  28. // 接口请求失败; 与后端约定 10010 代表token失效 需要刷新token
  29. if (response.data.code == 10010) {
  30. if (isRefreshing) {
  31. return refreshToken().then((res) => {
  32. if (res.data.code == 1) {
  33. localStorage.setItem("token", "Bearer " + res.data.access_token);
  34. // 已经刷新了token,将所有队列中的请求进行重试
  35. onAccessTokenFetched();
  36. // 再发请求
  37. return instance(response.config);
  38. } else {
  39. localStorage.removeItem('token')
  40. router.push({ path: '/login' })
  41. return false
  42. }
  43. }).catch(() => {
  44. console.log('请求refreshToken接口异常', error)
  45. localStorage.removeItem('token')
  46. router.push({ path: '/login' })
  47. return false;
  48. }).finally(() => {
  49. isRefreshing = true
  50. })
  51. } else {
  52. // 正在刷新token 将失败401的请求放入队列
  53. const retryOriginalRequest = new Promise((resolve) => {
  54. addSubscriber(() => {
  55. resolve(instance(response.config))
  56. })
  57. });
  58. return retryOriginalRequest;
  59. }
  60. } else if (response.data.code !== 1) {
  61. ElMessage({
  62. message: response.data.message,
  63. type: 'error',
  64. duration: 2000
  65. })
  66. return response.data
  67. } else {
  68. return response.data
  69. }
  70. },
  71. error => {
  72. ElMessage({
  73. message: error.message,
  74. type: 'error',
  75. duration: 3 * 1000
  76. })
  77. router.push({ path: '/login' })
  78. return Promise.reject(error)
  79. }
  80. )
  81. export default $axios
  82. // 刷新token请求
  83. function refreshToken() {
  84. return axios.post(`${baseUrl}auth/oauth/token`,
  85. {
  86. 'grant_type': 'refresh_token',
  87. 'refresh_token': sessionStorage.getItem("screen_token")
  88. }, { headers: { 'Authorization': 'Basic cGM6cGM=', 'clientType': 'SCREEN', 'Content-type': 'multipart/form-data' } });
  89. }
  90. let subscribers = [];
  91. // 执行队列
  92. function onAccessTokenFetched() {
  93. subscribers.forEach((callback) => {
  94. callback();
  95. })
  96. subscribers = [];
  97. }
  98. // 添加队列
  99. function addSubscriber(callback) {
  100. subscribers.push(callback)
  101. }

使用方法:

新建一个api.js文件 : 代码如下

  1. import $axios from './$axios'
  2. // GET 请求方式
  3. export const getList = (data) => {
  4. return $axios({
  5. method: 'GET',
  6. url: 'xxx/xxx',
  7. params: data
  8. })
  9. }
  10. // POST请求方式
  11. export const upload = (data) => {
  12. return $axios({
  13. method: 'POST',
  14. url: 'xxx/xxx',
  15. data: data
  16. })
  17. }

在组件中的使用方式

  1. <script setup>
  2. import {ref} from 'vue'
  3. import { getList } from "@/assets/api/api.js";
  4. const list = ref([])
  5. const getData = async () => {
  6. let obj = {
  7. pageSize:10,
  8. pageNum:1
  9. }
  10. let res = await getList(obj)
  11. list.value = res.data.list
  12. }
  13. </script>

完成

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/459212
推荐阅读