自己动手封装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发送cookieclass 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
} = winConfigexport 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),以便你可以追踪和管理不同版本的代码。

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索GlusterFS:开源分布式文件系统

目录 引言 一、GlusterFS简介 (一)基本介绍 (二)GlusterFS特点 (三)GlusterFS术语 (四)GlusterFS工作流程 二、GlusterFs的卷类型 (一)卷类型 &…

通过一篇文章让你了解Linux的重要性

Linux 前言一、什么是Linux后台vs前台为何大多数公司选择使用Linux作为后台服务器 二、Linux的背景介绍UNIX发展的历史Linux发展历史开源官网发行版本DebianUbuntu红帽企业级LinuxCentOSFedoraKali Linux 三、国内企业后台和用户使用Linux现状IT服务器Linux系统应用领域嵌入式L…

linux下动态库的运用

这里写目录标题 将头文件放入系统路径将.so动态库放入系统路径复制库文件:更新库缓存:验证安装: 完成 将头文件放入系统路径 先将include内容放入/usr/local/include下,这里可以先在/usr/local/include创建一个mkdir hpdf 文件夹…

一种驱动器的功能安全架构介绍

下图提供了驱动器实现安全功能的架构 具有如下特点: 1.通用基于总线或者非总线的架构。可以实现ethercat的FSOE,profinet的profisafe,或者伺服本体安全DIO现实安全功能。 2.基于1oo2D架构,安全等级可以达到sil3。 3.高可用性。单…

Pixel-GS:用于3D高斯溅射的具有像素感知梯度的密度控制

Pixel-GS: Density Control with Pixel-aware Gradient for 3D Gaussian Splatting Pixel-GS:用于3D高斯溅射的具有像素感知梯度的密度控制 Zheng Zhang  Wenbo Hu†  Yixing Lao   老宜兴市郑张文博胡 † Tong He  Hengshuang Zhao† 赵同和恒双 †1122113311 …

【oracle数据库安装篇一】Linux5.6基于LVM安装oracle10gR2单机

说明 本篇文章主要介绍了Linux5.6基于LVM安装oracle10gR2单机的配置过程,比较详细,基本上每一个配置部分的步骤都提供了完整的脚本,安装部分都提供了简单的说明和截图,帮助你100%安装成功oracle数据库。 安装过程有不明白的地方…

抖音视频无水印采集拓客软件|视频批量下载提取工具

抖音视频无水印批量采集拓客软件助力高效营销! 随着抖音平台的崛起,视频已成为各行各业进行营销的重要工具。但是,传统的视频下载方式往往效率低下,无法满足快速获取大量视频的需求。针对这一问题,我们开发了一款视频无…

【PDF.js】PDF文件预览

【PDF.js】PDF文件预览 一、PDF.js二、PDF.js 下载1、下载PDF.js2、在项目中引入3、屏蔽跨域错误 三、项目中使用四、说明五、实现效果 使用PDFJS实现pdf文件的预览,支持预览指定页、关键词搜索、缩略图、页面尺寸调整等等。 一、PDF.js 官方地址 文档地址 二、PD…

JVM、maven、Nexus

一、jvm简介 1.应用程序申请内存时出现的三种情况: ①OOM:内存溢出,是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。此时程序就运行不了,系统会提示内存溢出&#xff0c…

react query 学习笔记

文章目录 react query 学习笔记查询客户端 QueryClient获取查询客户端 useQueryClient异步重新请求数据 queryClient.fetchQuery /使查询失效 queryClient.invalidateQueries 与 重新请求数据queryClient.refetchQueries 查询 QueriesuseQuery查询配置对象查询的键值 Query Key…

最前沿・量子退火建模方法(1) : subQUBO讲解和python实现

前言 量子退火机在小规模问题上的效果得到了有效验证,但是由于物理量子比特的大规模制备以及噪声的影响,还没有办法再大规模的场景下应用。 这时候就需要我们思考,如何通过软件的方法怎么样把大的问题分解成小的问题,以便通过现在…

模型 洛萨达比例

系列文章 分享 模型,了解更多👉 模型_思维模型目录。积极和消极的平衡,左右着你们的关系。 1 洛萨达比例的应用 1.1 企业团队管理之洛萨达比例的应用 一个软件开发公司的团队经理注意到团队的士气和生产力有所下降。此时洛萨达比例是在2.9:…

故障诊断 | Matlab实现基于小波包结合鹈鹕算法优化卷积神经网络DWT-POA-CNN实现电缆故障诊断算法

故障诊断 | Matlab实现基于小波包结合鹈鹕算法优化卷积神经网络DWT-POA-CNN实现电缆故障诊断算法 目录 故障诊断 | Matlab实现基于小波包结合鹈鹕算法优化卷积神经网络DWT-POA-CNN实现电缆故障诊断算法分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现基于小波…

关于机器学习/深度学习的一些事-答知乎问(二)

进化算法与深度强化学习算法结合如何进行改进? (1)进化算法普遍存在着样本效率低下的问题,虽然其探索度较高,但其本质为全局随机性搜索,需要在整个回合结束后才能更新其种群,而深度强化学习在每…

Linux系统——Elasticsearch企业级日志分析系统

目录 前言 一、ELK概述 1.ELK简介 2.ELK特点 3.为什么要使用ELK 4.完整日志系统基本特征 5.ELK工作原理 6.Elasticsearch介绍 6.1Elasticsearch概述 6.2Elasticsearch核心概念 7.Logstash介绍 7.1Logstash简介 7.2Logstash主要组件 8.Kibana介绍 8.1Kibana简介 …

爬取学习强国视频小示例

因为需要爬取的视频数量并不是很大,总共需要将131个视频下载下来,所以就直接去手动找找视频的地址和名称保存下来的。由于页面是动态加载的,所以我们无法在网站源码中直接找到视频的超链接。设想是可以用Selenium模拟浏览器点击进行动态加载获…

Java基础(一)--语法入门

文章目录 第一章、语法入门一、Java简介1、JVM2、Java程序执行过程3、JDK4、JRE5、JDK、JRE和JVM三者关系 二、Java常量与变量1、标识符2、关键字3、保留字4、变量5、数据类型6、常量 三、运算符1、算术运算符2、赋值运算符3、关系运算符4、逻辑运算符5、条件运算符6、运算符的…

SpringMVC(一)【入门】

前言 学完了大数据基本组件,SpringMVC 也得了解了解,为的是之后 SpringBoot 能够快速掌握。SpringMVC 可能在大数据工作中用的不多,但是 SSM 毕竟是现在就业必知必会的东西了。SpringBoot 在数仓开发可能会经常用到,所以不废话学吧…

CSS盒模型(详讲)

目录 概述: 内容区(content): 内边距(paddingj): 前言: 设置内边距: 边框(border): 前言: 示例: 外边…

机器人路径规划:基于Q-learning算法的移动机器人路径规划,可以自定义地图,修改起始点,提供MATLAB代码

一、Q-learning算法 Q-learning算法是强化学习算法中的一种,该算法主要包含:Agent、状态、动作、环境、回报和惩罚。Q-learning算法通过机器人与环境不断地交换信息,来实现自我学习。Q-learning算法中的Q表是机器人与环境交互后的结果&#…