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

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

(1) .env.development 文件内容

// 开发环境

ENV = 'development'

VITE_BASE_URL='https://xxx'

(2) .env.production 文件内容

​
// 生产环境

ENV = 'production'

VITE_BASE_URL='https://xxx'

​

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

 "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview",
    "build:prod": "vite build --mode production",
    "build:dev": "vite build --mode development"
  },

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

import { defineConfig, loadEnv} from 'vite'
import vue from '@vitejs/plugin-vue'
// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {
  const config = loadEnv(mode, './')
  return {
    plugins: [
      vue(),
     
    ],
    
    server: {
      hmr:true,
      proxy: {
        '/api': {
          target: config.VITE_BASE_URL, //目标url
          changeOrigin: true, //支持跨域
          rewrite: (path) => path.replace(/^\/api/, ""),
          //重写路径,替换/api
        }
      }
    },
   
  }
})

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

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

npm install axios

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

import axios from 'axios'
import { ElMessage } from 'element-plus'
import router from '@/router/index'

// 创建axios实例

const baseUrl = '/api/';
const $axios = axios.create({
  baseURL: baseUrl,
  timeout: 200000 // 请求超时时间
})
let isRefreshing = true;

// request拦截器
$axios.interceptors.request.use(config => {
  if (localStorage.getItem("token")) {
    config.headers['Authorization'] = localStorage.getItem("token");
  } else {
    config.headers['Authorization'] = 'Basic cGM6cGM='
  }
  config.headers['Content-type'] = 'multipart/form-data'
  config.headers['clientType'] = 'PC'

  return config
}, error => {
  Promise.reject(error)
})

// respone拦截器
$axios.interceptors.response.use(
  response => {
    // const loadingInstance = ElLoading.service()
    // 接口请求失败;  与后端约定 10010 代表token失效 需要刷新token
    if (response.data.code == 10010) {
      if (isRefreshing) {
        return refreshToken().then((res) => {
          if (res.data.code == 1) {
            localStorage.setItem("token", "Bearer " + res.data.access_token);
            // 已经刷新了token,将所有队列中的请求进行重试
            onAccessTokenFetched();
            // 再发请求 
            return instance(response.config);
          } else {
            localStorage.removeItem('token')
            router.push({ path: '/login' })
            return false
          }
        }).catch(() => {
          console.log('请求refreshToken接口异常', error)
          localStorage.removeItem('token')
          router.push({ path: '/login' })

          return false;
        }).finally(() => {
          isRefreshing = true
        })
      } else {
        // 正在刷新token 将失败401的请求放入队列
        const retryOriginalRequest = new Promise((resolve) => {
          addSubscriber(() => {
            resolve(instance(response.config))
          })
        });
        return retryOriginalRequest;
      }
    } else if (response.data.code !== 1) {
       ElMessage({
          message: response.data.message,
          type: 'error',
          duration: 2000
        })
    
      return response.data

    } else {
     
      return response.data

    }
  },
  error => {
    ElMessage({
      message: error.message,
      type: 'error',
      duration: 3 * 1000
    })
    router.push({ path: '/login' })
    return Promise.reject(error)
  }
)

export default $axios

// 刷新token请求
function refreshToken() {
  return axios.post(`${baseUrl}auth/oauth/token`,
    {
      'grant_type': 'refresh_token',
      'refresh_token': sessionStorage.getItem("screen_token")
    }, { headers: { 'Authorization': 'Basic cGM6cGM=', 'clientType': 'SCREEN', 'Content-type': 'multipart/form-data' } });
}

let subscribers = [];

// 执行队列
function onAccessTokenFetched() {
  subscribers.forEach((callback) => {
    callback();
  })
  subscribers = [];
}

// 添加队列
function addSubscriber(callback) {
  subscribers.push(callback)
}

使用方法:

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

import $axios from './$axios'

// GET 请求方式
export const getList = (data) => {
  return $axios({
    method: 'GET',
    url: 'xxx/xxx',
    params: data
  })
}

// POST请求方式
export const upload = (data) => {
  return $axios({
    method: 'POST',
    url: 'xxx/xxx',
    data: data
  })
}

在组件中的使用方式

<script setup>
import {ref} from 'vue'
import { getList } from "@/assets/api/api.js";

const list = ref([])
const getData = async () => {
    let obj = {
        pageSize:10,
        pageNum:1
            
    }

    let res = await getList(obj)
    list.value = res.data.list
}

</script>

完成

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Vue 3中,可以使用Vite构建工具来快速搭建项目。下面是一个简单的示例,演示如何使用ViteAxios进行二次封装。 首先,确保已经安装了ViteAxios。 1. 创建一个新的Vue项目: ```bash # 使用Vite创建新项目 npm init vite my-project cd my-project npm install ``` 2. 安装Axios: ```bash npm install axios ``` 3. 创建一个`api`文件夹,并在其中创建一个`request.js`文件,用于封装Axios的请求逻辑: ```javascript import axios from 'axios' // 创建自定义Axios实例 const instance = axios.create({ baseURL: 'http://api.example.com', // 设置接口基本路径 timeout: 5000 // 设置请求超时时间 }) // 请求拦截器 instance.interceptors.request.use(config => { // 在发送请求之前做一些处理,例如添加认证信息等 return config }, error => { return Promise.reject(error) }) // 响应拦截器 instance.interceptors.response.use(response => { // 在接收到响应数据之前做一些处理,例如统一处理错误码等 return response.data }, error => { return Promise.reject(error) }) export default instance ``` 4. 在Vue组件中使用封装好的Axios实例: ```javascript import request from '@/api/request' export default { methods: { fetchData() { request.get('/data') .then(response => { // 处理返回的数据 }) .catch(error => { // 处理请求错误 }) } } } ``` 使用以上方法,我们可以将Axios进行二次封装,在Vue项目中更方便地使用。你还可以根据实际需求,进一步扩展封装的功能,例如处理全局错误、统一处理Loading状态等。 **

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值