vue封装axios、webpack配置

axios封装

文件创建位置依个人喜好,我将axios的封装写在了public文件夹中 - fetch.js
在这里插入图片描述

文件代码!

import axios from "axios";
axios.defaults.headers.post["Content-Type"] = "application/json";
axios.defaults.headers.put["Content-Type"] = "application/json";
// baseurl 就是 在 .env.development 和 .env.development.local 中 预设的域名
console.log("baseUrl:", process.env.VUE_APP_URL); // => 'https://api.apiopen.top/'
let baseurl =
  process.env.VUE_APP_TITLE === "local" // 通过判断 当前的环境变量 得知 项目 运行在 本地 或者 线上
    ? process.env.VUE_APP_PROXY // 本地 使用代理 => '/dev' 此处在 vue.config.js 中代理请求处有配置
    : process.env.VUE_APP_URL; // 线上 使用域名 => 'https://api.apiopen.top/'
axios.defaults.baseURL = baseurl; // 将 baseurl 设置为 axios 的默认 baseURL
/**
 * 下面 是 axios 封装的 请求
 * 采用 es6 promise 和 async await 方式
 */
export default async (url = "", data = {}, type = "POST") => {
  type = type.toUpperCase();
  /**
   * get 请求
   */
  if (type == "GET") {
    //请求参数 拼接字符串
	/**为了实现restful风格,在get请求后,拼接id
	*参数 {id:"id",param:{其他参数}}
	*/
    data.id ? (url = url + "/" + data.id) : (url = url);
    if (data.param) {
      let dataStr = [];
      Object.keys(data.param).forEach((key) => {
        dataStr.push(key + "=" + data.param[key]);
      });
      if (dataStr.length) {
        dataStr = dataStr.join("&");
        url += "?" + dataStr;
      }
    }

    return new Promise((resolve, reject) => {
      axios
        .get(url)
        .then((res) => {
          resolve(res);
        })
        .catch((err) => {
          reject(err);
        });
    });
  }
  /**
   * post 请求
   */
  if (type == "POST") {
    return new Promise((resolve, reject) => {
      data = JSON.stringify(data);
      axios
        .post(url, data)
        .then((res) => {
          resolve(res);
        })
        .catch((err) => {
          reject(err);
        });
    });
  }
  if (type == "PUT") {
    data.id ? (url = url + "/" + data.id) : (url = url);
    return new Promise((resolve, reject) => {
      data = JSON.stringify(data.data || data);
      axios
        .put(url, data)
        .then((res) => {
          resolve(res);
        })
        .catch((err) => {
          reject(err);
        });
    });
  }
  if (type == "DELETE") {
    data.id ? (url = url + "/" + data.id) : (url = url);
    return new Promise((resolve, reject) => {
      data = JSON.stringify(data.data);
      axios
        .delete(url, data)
        .then((res) => {
          console.log(res);
          resolve(res);
        })
        .catch((err) => {
          console.log(err);
          reject(err);
        });
    });
  }
};

拦截器

请求和相应拦截器在main.js中配置

请求拦截器

axios.interceptors.request.use(
  function(config) {
    // 在发送请求之前做些什么
    loading = Vue.prototype.$loading({
      lock: true,
      text: "客官请稍后....",
      spinner: "el-icon-loading",
      background: "rgba(0, 0, 0, 0.7)",
    });

    //!    验证是否登录

    if (sessionStorage.getItem("Authorization") === null) {
      router.replace({
        path: "/",
      });
    }

    if (sessionStorage["Authorization"] === undefined)
      router.replace({
        path: "/",
      });
    else
      config.headers.common["Authorization"] = sessionStorage["Authorization"];

    return config;
  },
  function(error) {
    loading.close();
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

响应拦截器

axios.interceptors.response.use(
  function(response) {
    if ("Authorization" in response.headers)
      sessionStorage["Authorization"] = response.headers.Authorization;

    if (response.data.errorCode === 401) {
      Vue.prototype.$message.error(response.data.message);
      router.replace({
        path: "/login",
      });
    }

    if (sessionStorage.getItem("Authorization") === null) {
      router.replace({
        path: "/login",
      });
    }

    loading.close();

    return response;
  },
  function(error) {
    loading.close();
    if (error.response.status >= 500) {
      Vue.prototype.$message.error("服务异常,稍后重试 !");
    } else if (error.response.status === 401) {
      router.replace({
        path: "/login",
      });
      Vue.prototype.$message.error("登录超时,请重新登录!");
    }
    return Promise.reject(error);
  }
);

将所有接口API统一管理

在这里插入图片描述

引入封装好的axios

// 引入 封装请求
import fetch from "../public/fetch.js";

接口export示例

export const getData = (data) => fetch("getData", data, "get");

接口调用示例

async getOilMark(){
	const res = await getData({id:1,param:{test:123}});
}

vue.config.js

const path = require("path");
function resolve(dir) {
  return path.join(__dirname, dir);
}
console.log("接口地址:", process.env.VUE_APP_URL)

const CompressionPlugin = require("compression-webpack-plugin"); //Gzip
module.exports = {
  // 基本路径
  publicPath: "./",

  // 输出文件目录
  outputDir: "dist",

  // 放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录。
  assetsDir: "static",

  // eslint-loader 是否在保存的时候检查
  lintOnSave: false,

  // 如果机器有超过1个内核,则在默认情况下为生产构建中的babel&ts使用线程加载器
  parallel: require("os").cpus().length > 1,

  // 生产环境是否生成 sourceMap 文件,一般情况不建议打开
  productionSourceMap: false,

  // PWA 插件相关配置 see https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-pwa
  pwa: {},

  // webpack配置 see https://github.com/vuejs/vue-cli/blob/dev/docs/webpack.md
  chainWebpack: config => {
    // 别名配置 可进行 链式操作
    config.resolve.alias
      .set("@", resolve("src"))
      .set("views", resolve("src/views"))
      .set("$img", resolve("src/assets"));
  },

  //调整 webpack 配置 https://cli.vuejs.org/zh/guide/webpack.html#%E7%AE%80%E5%8D%95%E7%9A%84%E9%85%8D%E7%BD%AE%E6%96%B9%E5%BC%8F
  configureWebpack: config => {
    // 入口文件
    config.entry = "./src/main.js";
    // 生产 & 测试环境
    let pluginsPro = [
      new CompressionPlugin({
        //文件开启Gzip,也可以通过服务端(如:nginx)(https://github.com/webpack-contrib/compression-webpack-plugin)
        filename: "[path].gz[query]",
        algorithm: "gzip",
        test: new RegExp("\\.(" + ["js", "css"].join("|") + ")$"),
        threshold: 8192,
        minRatio: 0.8
      })
    ];
    // 为生产环境修改配置...process.env.NODE_ENV !== 'development'
    if (process.env.NODE_ENV !== "development") {
      config.plugins = [...config.plugins, ...pluginsPro];
    }
    // 打包上线 清除 所有 console
    if (process.env.NODE_ENV === "production") {
      config.optimization.minimizer[0].options.terserOptions.compress.drop_console = true;
    }
  },

  // 入口文件 可 单独进行配置 写法如下
  // configureWebpack: {
  //   entry: './src/view/index/main.js',
  // },

  // css相关配置
  css: {
    // 是否使用css分离插件 ExtractTextPlugin
    extract: true,
    // 开启 CSS source maps?
    sourceMap: false,
    // css预设器配置项
    loaderOptions: {},
    // 启用 CSS modules for all css / pre-processor files.
    modules: false
  },

  // webpack-dev-server 相关配置
  devServer: {
    open: true, // 是否 自动打开浏览器 在项目启动的时候
    host: "",
    port: 8080, // 端口
    https: false,
    hotOnly: false,

    // 设置代理
    // 这里设置了两个代理请求 为了匹配 不同环境的, 根据实际情况配置代理
    // 比如 公司有 开发 连调 测试 演示 生产等环境, 除了生产环境以外其他环境都需要配置 代理请求
    // 当启动 vue 项目的 时候 运行在 localhost:8080 上,假设公司的 开发环境 为 http://development.com 当发送请求时 就会发生跨域, 所以 采用代理方式 进行 同域,
    // 当 项目上线 后 根据 环境变量 使用不同 的域名 就不会有跨域情况
    // 读到这里 如果 还有 不理解 请往下进行
    proxy: {
      "/dev": {
        target: process.env.VUE_APP_URL, // 代理请求的地址 => https://api.apiopen.top/
        changeOrigin: true,
        pathRewrite: {
          "^/dev": ""
        }
      },
      "/api": {
        target: process.env.VUE_APP_URL,
        changeOrigin: true,
        pathRewrite: {
          "^/api": ""
        }
      }
    }
  },
  // 第三方插件配置
  pluginOptions: {}
};

不同环境的配置文件格式

在这里插入图片描述

NODE_ENV=development
VUE_APP_TITLE=local
VUE_APP_URL=localhost:8080/
VUE_APP_PROXY=/api
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
Vue3是一种用于构建用户界面的JavaScript框架,它具有快速、灵活、可重用等特点。Webpack则是一种JS的打包工具,可以将多个JS文件打成一个JS文件。Vue-Router是Vue框架中的路由管理器,通过它可以实现前端路由的切换。Axios则是一种基于Promise的 HTTP 库,用于处理前端与后端的数据交互。Vuex则是Vue框架中的状态管理工具,将组件的共享状态抽取出来,以集中管理,便于开发人员管理。这些技术都是前端开发中必不可少的技术,用于优化前端项目的结构,提高开发效率。 在具体的项目开发中,为了提高代码的复用性,通常会对这些技术进行进一步的封装。对于Vue-Router,可以将项目的路由进行封装,创建一个Route.js文件,用于统一管理路由。通过这样的封装,可以使得路由的管理更加清晰。 对于Axios,可以通过封装一个API.js文件,将后端接口进行统一管理,减少代码的重复性。在API.js中可以封装所有后端接口的请求方法,统一处理请求返回的数据。 对于Vuex,则可以将项目的状态进行封装,写一个store.js文件,用于集中管理应用的状态。在store.js中可以设置全局数据,方便在各个组件中进行访问和修改。同时,也可以将状态的变化通过mutations.js文件封装,以保证数据的可靠性。 最后,使用Webpack进行打包。Webpack可以将多个JS文件打成一个JS文件,减少了请求的次数,提高了页面的加载速度。 综上所述,通过对Vue3、WebpackVue-Router、AxiosVuex等技术的封装,可以提高代码的复用性和可维护性,从而加快项目的开发进度。同时,这些技术的结合还能够为项目提供更好的架构,提升用户的使用体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BUSTER丨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值