自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南

文章目录

      • 一、构建方法
        • 1、api/request.js
        • 2、api/requestHandler.js
        • 3、api/index.js
      • 二、测试方法
        • 1、api/axios.js
        • 2、main.js
        • 3、app.vue
        • 4、vue.config.js
        • 5、index.html
      • 三、打包
        • 1、配置package.json
        • 2、生成库包
        • 3、配置发布信息
        • 4、发布
      • 四、使用
        • 1、安装
        • 2、使用
      • 五、维护
        • 1、维护和更新
        • 2、注意事项

一、构建方法

  • 确定工具库的需求和功能:在开始构建工具库之前,你需要明确你的工具库需要包含哪些方法及工具,以及这些工具或方法应该具备哪些功能。这有助于你更好地规划你的开发工作。

  • 编写工具代码:使用你熟悉的前端框架(如React、Vue等)编写工具代码。确保你的代码具有良好的可读性和可维护性,并遵循相关的编码规范。

  • 创建工具库的结构:为了组织和管理你的组件,你需要创建一个清晰的目录结构。这可以包括组件的源代码、样式文件、文档和示例等。

1、api/request.js

这里是axios操作的封装

import axios from 'axios'
import {
    replayDefence,
    encryptRequest,
    distortDefence,
    requestTimeOut
} from './requestHandler'
axios.defaults.timeout = requestTimeOut || 20000; //超时响应
axios.defaults.headers['Content-Type'] = 'application/json;charset=UTF-8'; // 配置请求头
axios.defaults.headers['X-Requested-With'] = 'XMLHttpRequest'; // 区分ajax请求还是普通请求
axios.defaults.withCredentials = true; // axios 默认不发送cookie,需要全局设置true发送cookie

class HttpRequest {
    constructor() {
        this.instance = axios.create()
        this.interceptors()
    }
    interceptors() {
        // request拦截器
        this.instance.interceptors.request.use((config) => {
            if (config.url) {
                // 防重放
                replayDefence(config);
                // 报文加密
                encryptRequest(config);
                // 防篡改
                distortDefence(config);
                return config;
            }
        }, error => {
            return Promise.reject(error);
        })

        // respone拦截器
        this.instance.interceptors.response.use(async (res) => {
            if (res.status === 200) {
                // return Promise.resolve(res)
                return res
            } else {
                return Promise.reject(res)
            }
        }, error => {
            return Promise.reject(error)
        })
    }


    /**
     * 提交数据,同时支持  data 和 params
     * @param {*} url 
     * @param {*} params 
     * @returns 
     */
    post(url, params = {}) {
        return this.instance({
            url: url,
            method: 'post',
            data: params
        })
    }

    /**
     * 获取数据,只支持 params 传参
     * @param {*} url 
     * @param {*} params 
     * @returns 
     */
    get(url, params = {}) {
        return this.instance({
            url: url,
            method: 'get',
            params: params
        })
    }

    /**
     * 更新数据,同时支持  data 和 params
     * @param {*} url 
     * @param {*} params 
     * @returns 
     */
    put(url, params = {}) {
        return this.instance({
            url: url,
            method: 'put',
            data: params
        })
    }

    /**
     * 删除数据,只支持 params传参
     * @param {*} url 
     * @param {*} params 
     * @returns 
     */
    delete(url, params = {}) {
        return this.instance({
            url: url,
            method: 'delete',
            params: params
        })
    }
}

export default HttpRequest
2、api/requestHandler.js

这里是请求拦截中的方法的抽离

const winConfig = window._CONFIG || {}
const {
    urlRandom,
    tampering,
    SM4Rncrypt,
    timeout
} = winConfig

export const requestTimeOut = timeout

/**
 * 防重放,这里添加时间戳和6位随机数
 * @param {*} config 
 */
export const replayDefence = (config) => {
    if (urlRandom && config.url) {
        const nonce = Math.floor(Math.random() * 1000000)
        config.params = {
            _t: Date.parse(new Date()),
            nonce,
            ...config.params
        }
    }
}

/**
 * 报文加密,这里使用base64代替加密,你可以替换成SM4加密
 * @param {*} config 
 */
export const encryptRequest = (config) => {
    if (SM4Rncrypt && config.url && config.data) {
        if (['post', 'put', 'delete'].includes(config.method)) {
            config.headers["Content-Type"] = "application/json";
            let jsonStr = JSON.stringify(config.data);
            config.data = btoa(jsonStr);
        }
    }
}

/**
 * 防篡改,这里是btoa(url+params+btoa(data)),你可以再加盐
 * @param {*} config 
 */
export const distortDefence = (config) => {
    if (tampering && config.url) {
        let validCode = `${config.url}`
        if (config.params) {
            for (let key in config.params) {
                validCode += `&${key}=${config.params[key]}`
            }
        }
        if (config.data && config.method != 'get') {
            validCode += SM4Rncrypt ? config.data : JSON.stringify(config.data);
        }
        console.log('validCode:', validCode)
        config.headers["sign"] = btoa(validCode)
    }
}
3、api/index.js

这里文件首页

import HttpRequest from "./request";

const axios = new HttpRequest()

export default axios

二、测试方法

编写文档和示例:为你的工具方法编写清晰的文档和示例,这有助于其他开发者理解和使用你的工具库。

1、api/axios.js

这个是使用时的文件。现在测试用

import axios from "./index";

const baseURL = "";

//手机号归属地查询
export const getPhone = (params) => axios.post(baseURL + '/v2/phone', params)

//历史上的今天
export const getHistory = (params) => axios.post(baseURL + '/v2/history', params)

// Bing每日壁纸
export const getBing = (params) => axios.post(baseURL + '/v2/bing', params)

// 用户IP信息
export const getIp = (params) => axios.post(baseURL + '/v2/getip', params)

//随机颜色
export const getColor = (params) => axios.get(baseURL + '/v2/color', params)
2、main.js

这个是使用时的文件。现在测试用

import * as api from './api/axios'
Vue.prototype.$apis = api
3、app.vue

这个是使用时的文件。现在测试用

console.log(this.$apis)
        this.$apis.getPhone({ tel: 13225750729 }).then(res => {
            console.log(res.data)
        })
        this.$apis.getHistory({}).then(res => {
            console.log(res.data)
        })
        this.$apis.getIp({}).then(res => {
            console.log(res.data)
        })
        this.$apis.getColor({}).then(res => {
            console.log(res.data)
        })
4、vue.config.js

配置代理

module.exports = {
  productionSourceMap: false,
  devServer: {
    proxy: 'https://tenapi.cn/'
  }
}
5、index.html

首页添加全局变量配置信息

window._CONFIG = {
    urlRandom: true, //防重放
    tampering: true, //防篡改
    SM4Rncrypt: false, //报文加密
    timeout: 10000 //超时时间
}

三、打包

1、配置package.json

添加打包到库命令

{
  "scripts": {
    "plugin": "vue-cli-service build --target lib --name zouAxion --dest zouAxion src/api/index.js"
  },
}
2、生成库包

打包工具库:运行打包命令,将你的工具库打包成一个npm包。这通常会在你的项目根目录下生成一个目录,其中包含打包后的文件。

npm run plugin

这是生成的zouAxion文件夹。

在这里插入图片描述

3、配置发布信息

配置package.json:在项目的根目录下创建一个package.json文件,并配置相关的元信息,例如包的名称、版本、描述、入口文件等。确保你的包名在npm上是唯一的,尤其是如果你打算将它发布到公共npm仓库。

注意:如果你的npm仓库是私有的,你可能需要在package.json中添加一个publishConfig字段来指定你的私有仓库地址。

在zouAxion文件夹里面创建package.json文件,配置发布信息。

{
    "name": "zou-axion",
    "version": "0.1.2",
    "private": false,
    "license": "MIT",
    "description": "今天我发布一个zouAxion插件",
    "main": "zouAxion.umd.min.js",
    "scripts": {
      
    },
    "dependencies": {

    },
    "devDependencies": {

    }
  }

在这里插入图片描述

4、发布
  • 配置npm仓库:如果你还没有一个私有的npm仓库,你需要先搭建一个。你可以使用Verdaccio等工具来快速搭建一个私有的npm仓库。

  • 配置npm源:在你的本地开发环境中,将npm的源配置为你的私有仓库地址。这可以确保当你发布组件库时,它会被上传到你的私有仓库而不是公共的npm仓库。

  • 登录到npm仓库:在终端中运行npm login命令,并按照提示输入你的npm仓库的用户名、密码和邮箱地址。这将使你能够发布包到你的私有仓库。

  • 发布工具库:在终端中运行npm publish命令来发布你的工具库。这会将你的工具库上传到你的私有npm仓库中。

配置npm源

npm set registry http://localhost:4873/

在zouAxion文件夹里面执行发布命令

npm publish

在这里插入图片描述

四、使用

一旦你的工具库被发布到私有npm仓库,你就可以在其他项目中使用它了。只需在项目中使用npm install命令来安装你的工具库,然后按照文档中的说明来使用它即可。

跟使用axios的方法一样。

1、安装
npm install axios
npm install zou-axios

在这里插入图片描述

2、使用

api/axios.js

import axios from "zou-axios";
const baseURL = "";
//历史上的今天
export const getHistory = (params) => axios.post(baseURL + '/v2/history', params)

main.js

import * as api from './api/axios'
Vue.prototype.$apis = api

app.vue

this.$apis.getHistory({}).then(res => {
    console.log(res.data)
})

五、维护

1、维护和更新

随着项目的进行,你可能需要对你的工具库进行维护和更新。这包括修复bug、添加新功能、更新文档等。在每次更新后,记得重新打包并发布你的工具库,以便其他项目能够使用到最新的版本。

2、注意事项
  • 版本控制:确保你的工具库使用版本控制(如Git),以便你可以追踪和管理不同版本的代码。

  • 测试:在发布工具库之前,确保进行充分的测试,以确保其稳定性和可用性。

  • 文档和示例:持续更新和维护你的文档和示例,以帮助其他开发者更好地理解和使用你的工具库。

  • 记得在开发过程中保持代码质量和可维护性,并定期更新和维护你的组件库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/532925.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AGI的核心对齐问题:能力泛化和急速左转

在解决人工智能对齐(alignment)的技术挑战时,一个核心问题是确保人工智能系统的行为与人类价值和期望保持一致。 然而,人工智能系统往往在获取更强大的能力时会比在对齐方面更容易实现泛化。换句话说,尽管我们可能能够…

Git 安装和配置

下载 Git 网址: https://git-scm.com/download 安装 Git 双击安装包, 开始安装. 修改安装路径, 选择非中文无空格路径: 开始安装: 安装成功: 配置 Git 安装完成后, 在任意文件夹内, 右键, 可以显示两个 Git 选项, 就说明安装成功了.

数据结构——线性表(链式存储结构)

语言:C语言软件:Visual Studio 2022笔记书籍:数据结构——用C语言描述如有错误,感谢指正。若有侵权请联系博主 一、线性表的逻辑结构 线性表是n个类型相同的数据元素的有限序列,对n>0,除第一元素无直接…

如何用electron(vue)搜索电脑本地wifi

对于搜索本地 WiFi 网络,可以使用 Electron 结合 Node.js 来编写一个简单的应用程序。 以下是一个基本的示例,它使用 Node.js 的 wifi 模块来搜索并列出附近的 WiFi 网络: 首先,确保你已经安装了 Node.js 和 Electron。 然后&am…

【Qt】:对话框(一)

对话框 一.基本的对话框二.自定义对话框三.通过图形化界面自定义对话框四.关于对话框mode 对话框是GUI程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务或者…

Learning Feature Sparse Principal Subspace 论文阅读

1 Abstract: 这篇论文提出了新的算法来解决特征稀疏约束的主成分分析问题(FSPCA),该问题同时执行特征选择和PCA。现有的FSPCA优化方法需要对数据分布做出假设,并且缺乏全局收敛性的保证。尽管一般的FSPCA问题是NP难问题&#xff…

华为海思数字芯片设计笔试第二套

1.声明 下面的题目作答都是自己认为正确的答案,并非官方答案,如果有不同的意见,可以评论区交流。 这些题目也是笔者从各个地方收集的,感觉有些题目答案并不正确,所以在个别题目会给出自己的见解,欢迎大家讨…

Adobe After Effects 2024 v24.3 macOS 视频合成及特效制作软件 兼容 M1/M2/M3

Adobe After Effects 是一款适用于视频合成及特效制作软件,是制作动态影像设计不可或缺的辅助工具,是视频后期合成处理的专业非线性编辑软件。 macOS 12.0及以上版本可用 应用介绍 Adobe After Effects简称 AE 是一款适用于视频合成及特效制作软件,是制作动态影像设计不可或缺…

防止邮箱发信泄露服务器IP教程

使用QQ邮箱,网易邮箱,189邮箱,新浪邮箱,139邮箱可能会泄露自己的服务器IP。 泄露原理:服务器通过请求登录SMTP邮箱服务器接口,对指定的收件人发送信息。 建议大家使用商业版的邮箱,比如阿里云邮箱发信等 防止邮件发信漏源主要关注的是确保邮件…

智能边缘自动化:HDMI接口钡铼ARM工业电脑实践案例

一款具备HDMI接口的高性能ARM工业计算机应运而生,为实现在工业4.0时代的关键数据实时处理与可视化管理提供了强有力的硬件支撑。这款计算机依托其独特的边缘计算能力,完美解决了工业环境中大规模数据传输至云端的高延迟问题,成功实现了OT&…

内网安全--AS-REP Roasting攻击

AS-REP Roasting是一种对用户账号进行离线爆破的攻击方式。但是该攻击方式利用比较局限,因为其需要用户账户设置“不要求Kerberos预身份验证”选项,而该选项是默认没有勾选上的。Kerberos预身份验证发送在Kerberos身份验证的第一阶段(AS_REQ&AS-REP)…

免费的GPT-3.5 API服务aurora

什么是 aurora ? aurora 是利用免登录 ChatGPT Web 提供的无限制免费 GPT-3.5-Turbo API 的服务,支持使用 3.5 的 access 调用。 【注意】:仅 IP 属地支持免登录使用 ChatGPT的才可以使用(也可以自定义 Baseurl 来绕过限制&#x…

逐步学习Go-sync.RWMutex(读写锁)-深入理解与实战

概述 在并发编程中,我们经常会遇到多个线程或协程访问共享资源的情况。为了保护这些资源不被同时修改,我们会用到"锁"的概念。 Go中提供了读写锁:sync.RWMutex。 sync.RWMutex是Go语言提供的一个基础同步原语,它是Rea…

3D Matching:实现halcon中的find_surface_model

halcon中的三维匹配大致分为两类,一类是基于形状的(Shape-Based),一类是基于表面的(Surface-Based)。基于形状的匹配可用于单个2D图像中定位复杂的3D物体,3D物体模型必须是CAD模型,且几何边缘清晰可见,使用的相机也要预…

com.intellij.diagnostic.PluginException 问题

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 未经允许不得转载 目录 一、导读二、 推荐阅读 一、导读 遇到…

淘宝批量采集商品详情数据(属性丨详情图丨sku丨价格等)

淘宝批量采集商品详情数据(包括属性、详情图、SKU、价格等)可以通过以下几种方式实现: 使用淘宝数据抓取工具:这类工具,如某鱼等,能够自动化采集淘宝商品数据,并将其转换成CSV、Excel等格式&am…

潍微科技-水务信息管理平台 ChangePwd SQL注入漏洞复现

0x01 产品简介 水务信息管理平台主要帮助水务企业实现水质状态监测、管网运行监控、水厂安全保障、用水实时监控以及排放有效监管,确保居民安全稳定用水、环境有效保护,全面提升水务管理效率。由山东潍微科技股份有限公司研发,近年来,公司全力拓展提升水务、水利信息化业务…

[react] 受控组件和非受控组件

什么是受控? 就是比如一个文本框,你可以随便输入就是受控,他收到状态的影响 <div className"App" >受控<input value{name}></input><br />非受控<input defaultValue{name}></input></div > 你想强行改?浏览器报错!…

Substance 3D2024版 下载地址及安装教程

Substance 3D是Adobe公司推出的一套全面的3D设计和创作工具集合&#xff0c;用于创建高质量的3D资产、纹理和材质。 Substance 3D包括多个功能强大的软件和服务&#xff0c;如Substance 3D Painter、Substance 3D Designer和Substance 3D Sampler等。这些工具提供了广泛的功能…

Kubesphere 在 devops 部署项目的时候下载 maven 依赖卡住

Kubesphere 在 devops 部署项目的时候下载 maven 依赖卡住 我下载 下面这段 maven 依赖一直卡住&#xff1a; <build><plugins><plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><version>…