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

这篇具有很好参考价值的文章主要介绍了自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、构建方法

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

  • 编写工具代码:使用你熟悉的前端框架(如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文件夹。

自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南,vue,npm,其他,axios,私有npm仓库,封装axios通用方法,防重放,报文加密,防篡改,拦截器

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": {

    }
  }

自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南,vue,npm,其他,axios,私有npm仓库,封装axios通用方法,防重放,报文加密,防篡改,拦截器

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

自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南,vue,npm,其他,axios,私有npm仓库,封装axios通用方法,防重放,报文加密,防篡改,拦截器

四、使用

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

跟使用axios的方法一样。

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

自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南,vue,npm,其他,axios,私有npm仓库,封装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),以便你可以追踪和管理不同版本的代码。

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

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

  • 记得在开发过程中保持代码质量和可维护性,并定期更新和维护你的组件库。文章来源地址https://www.toymoban.com/news/detail-851397.html

到了这里,关于自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端架构师-week4-封装通用的npm包管理类Package

    目录 脚手架命令本地调试功能支持 动态执行库exec模块创建 创建 npm 模块通用类 Package Package 类的属性、方法定义及构造函数逻辑开发 Package 类获取入口文件路径功能开发(pkg-dir应用+解决不同操作系统路径兼容问题)  利用 npminstall 库安装 npm 模块 Package 类判断模块是否存在

    2024年02月03日
    浏览(42)
  • 上传自己的npm依赖包

    有时候我们需要对某个依赖包的源码进行修改进行使用,但我们又不能对已有的源码官网进行上传更新,这时,我们可以获取依赖包进行修改后,自行部署到https://npmjs.com中 1.官网https://npmjs.com中注册一个账号(账号,密码,邮箱,记住了,到时候要用) 2.对自己要上传的依赖

    2024年02月11日
    浏览(38)
  • 如何封装Vue组件并上传到npm

    1.注册npm账号:npm | Home (npmjs.com) 2.保证当前环境安装了vue、webpack、node,以下工作将在该环境下进行(没有的小伙伴自行百度安装哈~) 3.一下用到的环境版本 webpack:v5.1.4 node:v12.10.0 vue:v2.6.14 4.创建一个基于webpack的vue项目,这个项目将会是我们的组件项目了。 在我们日常开

    2024年04月25日
    浏览(33)
  • 如何自己创建一个工具项目并上传到npm上使用

    选择框架:   选择语言: 在项目中使用命令安装项目依赖:   运行项目:  运行成功界面: 注意: version:当前发布的版本号,项目每次改动后需要修改版本后再发布,  默认要0.0.1开始才能上传,相同版本是传不上去的,一定要记得每次更改了代码都改下版本号。 name: 包

    2024年02月12日
    浏览(41)
  • axios详解以及完整封装方法

    \\\"\\\"\\\" Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 axios有以下特性: 从浏览器创建 XMLHttpRequests 从 node.js 创建 http 请求

    2024年02月16日
    浏览(31)
  • 立创eda学习笔记五:如何自己画器件的符号和封装并上传

    立创eda画符号和封装很方便的,一般是先画符号,再画封装,再关联起来。 这里的符号是电气符号,即原理图里面用到的表示一个电气器件的电气符号。 这里的封装不是指的引脚封装图,而是放到pcb板上进行焊接时用的焊盘封装图。 其实主要的资料在立创eda推出的使用教程

    2023年04月14日
    浏览(139)
  • 【Python】面向对象 - 封装 ② ( 访问私有成员 | 对象无法访问私有变量 / 方法 | 类内部访问私有成员 )

    在下面的 Python 类 Student 中 , 定义了私有的成员变量 , 该私有成员变量 , 只能在类内部进行访问 , 类的外部无法进行访问 ; 在 类外部 创建的 Student 实例对象 , 是无法访问 __address 私有成员的 ; 使用 实例对象 访问 类的私有成员 , 编译时不会报错 , 但是运行时会报错 最后一行代

    2024年02月13日
    浏览(50)
  • Vue3 + Vite + Ts自己封装的基础组件库发布npm ,npm安装使用(Volar )支持TS 类型提示功能(vite-plugin-dts 使用)

    在开发Vue3 + Ts项目时:使用自己二次封装的基础组件,没有 Ts类型提示 ,不能像 Element-plus 鼠标停在标签或者属性上就能提示当前组件有哪些属性(即props)及其属性的类型,如下图是 Element-plus 组件的 使用Vs Code Volar的提示: 此插件的作用:为打包的库里加入声明文件(即生

    2024年02月09日
    浏览(68)
  • Java多线程查表(封装方法 多表通用)

    经过多线程的学习和实践 总结了两种多线程查表方法  两种方法都经过我的封装 某表使用时 server层加上方法sql即可 查询流程: 1 count全表条数 2 通过总条数 将全表数据分为10份 3 开辟10个线程查询limit语句(线程数可自定义) 以下方法均以mysql数据库测试 其他库同理 目录 一 线

    2024年02月12日
    浏览(45)
  • 用PHP封装一个强大且通用的cURL方法

    用PHP封装一个强大且通用的cURL方法。 用PHP封装一个强大且通用的cURL方法。 用PHP封装一个强大且通用的cURL方法。 用PHP封装一个强大且通用的cURL方法。

    2024年02月14日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包