我的编程空间,编程开发者的网络收藏夹
学习永远不晚

vue如何阻止重复请求

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

vue如何阻止重复请求

本篇内容介绍了“vue如何阻止重复请求”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

项目当中前端代码会遇到同一个请求向服务器发了多次的情况,我们要避免服务器资源浪费,同一个请求一定时间只允许发一次请求

思路

(1)如果业务简单,例如同一个按钮防止多次点击,我们可以用定时器做防抖处理
(2)如果业务复杂,例如多个组件通过代码,同一个请求发多次,这个时候防抖已经不好处理了,最好是对重复的ajax请求统一做取消操作

实现

方式1-通过定时器做防抖处理

(a)概述

效果:当用户连续点击多次同一个按钮,最后一次点击之后,过小段时间后才发起一次请求
原理:每次调用方法后都产生一个定时器,定时器结束以后再发请求,如果重复调用方法,就取消当前的定时器,创建新的定时器,等结束后再发请求,工作当中可以用第三方封装的工具函数例如lodashdebounce方法来简化防抖的代码  

(b)代码

<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <script class="lazy" data-src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/lodash.js/4.17.21/lodash.min.js" type="application/javascript"></script>    <script class="lazy" data-src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue/2.6.14/vue.min.js" type="application/javascript"></script>    <script class="lazy" data-src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/axios/0.26.0/axios.min.js" type="application/javascript"></script></head><body>    <div id="app">        <button @click="onClick">请求</button>    </div></body><script>// 定义请求接口function sendPost(data){    return axios({        url: 'https://nodejs-cloud-studio-demo-bkzxs.nodejs-cloud-studio-demo.50185620.cn-hangzhou.fc.devsapp.net/test',        method: 'post',        data    })}new Vue({    el: '#app',    methods: {        // 调用lodash的防抖方法debounce,实现连续点击按钮多次,0.3秒后调用1次接口        onClick: _.debounce(async function(){            let res = await sendPost({username:'zs', age: 20})            console.log('请求的结果', res.data)        }, 300),    },})</script></html>

(c)预览

连接

(d)存在的问题

无法解决多个按钮件的重复请求的发送问题,例如下面两种情况

情况-在点击事件上做防抖

按钮事件间是相互独立的,调用的是不同方法,做不到按钮间防抖效果

<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <script class="lazy" data-src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/lodash.js/4.17.21/lodash.min.js" type="application/javascript"></script>    <script class="lazy" data-src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue/2.6.14/vue.min.js" type="application/javascript"></script>    <script class="lazy" data-src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/axios/0.26.0/axios.min.js" type="application/javascript"></script></head><body>    <div id="app">        <button @click="onClick1" ref="btn1">请求1</button>        <button @click="onClick2" ref="btn2">请求2</button>    </div></body><script>  let sendPost = function(data){    return axios({        url: 'http://nodejs-cloud-studio-demo-bkzxs.nodejs-cloud-studio-demo.50185620.cn-hangzhou.fc.devsapp.net/test',        method: 'post',        data    })}new Vue({    el: '#app',    mounted() {        this.$refs.btn1.click()        this.$refs.btn2.click()    },    methods: {        // 使用lodash对请求方法做防抖        //这里有问题,只是对每个按钮的点击事件单独做了防抖,但是两个按钮之间做不到防抖的效果        onClick1: _.debounce(async function(){            let res = await sendPost({username:'zs', age: 20})            console.log('请求1的结果', res.data)        }, 300),        onClick2: _.debounce(async function(){            let res = await sendPost({username:'zs', age: 20})            console.log('请求2的结果', res.data)        }, 300),    },})</script></html>

预览

情况2-在接口方法做防抖

按钮间调用的方法是相同的,是可以对方法做防抖处理,但是处理本身对方法做了一次封装,会影响到之前方法的返回值接收,需要对之前的方法做更多处理,变得更加复杂,不推荐

<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <script class="lazy" data-src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/lodash.js/4.17.21/lodash.min.js" type="application/javascript"></script>    <script class="lazy" data-src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue/2.6.14/vue.min.js" type="application/javascript"></script>    <script class="lazy" data-src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/axios/0.26.0/axios.min.js" type="application/javascript"></script></head><body>    <div id="app">        <button @click="onClick1" ref="btn1">请求1</button>        <button @click="onClick2" ref="btn2">请求2</button>    </div></body><script>// 使用lodash对请求方法做防抖,    let sendPost = _.debounce(function(data){    //这里有问题,这里的返回值不能作为sendPost方法执行的返回值,因为debounce内部包裹了一层    return axios({        url: 'http://nodejs-cloud-studio-demo-bkzxs.nodejs-cloud-studio-demo.50185620.cn-hangzhou.fc.devsapp.net/test',        method: 'post',        data    })}, 300)new Vue({    el: '#app',    mounted() {        this.$refs.btn1.click()        this.$refs.btn2.click()    },    methods: {        onClick1: async function(){            //这里有问题,sendPost返回值不是promise,而是undefined            let res = await sendPost({username:'zs', age: 20})            console.log('请求1的结果', res)        },        onClick2: async function(){            let res = await sendPost({username:'zs', age: 20})            console.log('请求2的结果', res)        },    },})</script></html>

预览

方式2-通过取消ajax请求

(a) 概述

直接对请求方法做处理,通过ajax库的api方法把重复的请求给取消掉

(b)原理

原生ajax取消请求

通过调用XMLHttpRequest对象实例的abort方法把请求给取消掉

<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title></head><body></body><script>//原生ajax的语法    let xhr = new XMLHttpRequest();xhr.open("GET", "http://nodejs-cloud-studio-demo-bkzxs.nodejs-cloud-studio-demo.50185620.cn-hangzhou.fc.devsapp.net/test?username=zs&age=20", true);xhr.onload = function(){    console.log(xhr.responseText)}xhr.send();//在谷歌浏览器的低速3g下面测试//通过XMLHttpRequest实例的abort方法取消请求setTimeout(() => xhr.abort(), 100);</script></html>

预览

axios取消请求

通过axiosCancelToken对象实例cancel方法把请求给取消掉

<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <script class="lazy" data-src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/axios/0.26.0/axios.min.js" type="application/javascript"></script></head><body></body><script>// 方式1-通过axios.CancelToken.source产生cancelToken和cancel方法// 方式2-通过new axios.CancelToken产生cancelToken和cancel方法let cancelFn const cancelToken =  new axios.CancelToken(cancel=>{    cancelFn = cancel});axios.get('http://nodejs-cloud-studio-demo-bkzxs.nodejs-cloud-studio-demo.50185620.cn-hangzhou.fc.devsapp.net/test', {    params: {username: 'zs', age: 20},     cancelToken: cancelToken}).then(res=>{    console.log('res', res.data)}).catch(err=>{    console.log('err', err)})//在谷歌浏览器的低速3g下面测试//通过调用cancelFn方法取消setTimeout(() => cancelFn(), 100);</script></html>

预览

(c)代码

步骤1-通过axios请求拦截器取消重复请求

通过axios请求拦截器,在每次请求前把请求信息和请求的取消方法放到一个map对象当中,并且判断map对象当中是否已经存在该请求信息的请求,如果存在取消上传请求

<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <script class="lazy" data-src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue/2.6.14/vue.min.js" type="application/javascript"></script>    <script class="lazy" data-src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/axios/0.26.0/axios.min.js" type="application/javascript"></script>    <script class="lazy" data-src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/qs/6.10.3/qs.js" type="application/javascript"></script></head><body>    <div id="app">        <button @click="onClick1" ref="btn1">请求1</button>        <button @click="onClick2" ref="btn2">请求2</button>    </div></body><script>//存储请求信息和取消方法的的map对象    const pendingRequest = new Map();  //根据请求的信息(请求方式,url,请求get/post数据),产生map的keyfunction getRequestKey(config){    const { method, url, params, data } = config;    return [method, url, Qs.stringify(params), Qs.stringify(data)].join("&");}   //请求拦截器axios.interceptors.request.use(    function (config) {    //根据请求的信息(请求方式,url,请求get/post数据),产生map的key    let requestKey = getRequestKey(config)    //判断请求是否重复    if(pendingRequest.has(requestKey)){        //取消上次请求        let cancel = pendingRequest.get(requestKey)        cancel()        //删除请求信息        pendingRequest.delete(requestKey)     }    //把请求信息,添加请求到map当中    // 生成取消方法    config.cancelToken = config.cancelToken || new axios.CancelToken(cancel => {        // 把取消方法添加到map        if (!pendingRequest.has(requestKey)) {            pendingRequest.set(requestKey, cancel)        }    })    return config;  },  (error) => {     return Promise.reject(error);  });let sendPost = function(data){    return axios({        url: 'http://nodejs-cloud-studio-demo-bkzxs.nodejs-cloud-studio-demo.50185620.cn-hangzhou.fc.devsapp.net/test',        method: 'post',        data    })}new Vue({    el: '#app',    mounted() {        this.$refs.btn1.click()        this.$refs.btn2.click()    },    methods: {        // 使用lodash对请求方法做防抖        //这里有问题,只是对每个按钮的点击事件单独做了防抖,但是两个按钮之间做不到防抖的效果        onClick1: async function(){            let res = await sendPost({username:'zs', age: 20})            console.log('请求1的结果', res.data)        },        onClick2: async function(){            let res = await sendPost({username:'zs', age: 20})            console.log('请求2的结果', res.data)        },    },})</script></html>

预览

步骤2-通过axios响应拦截器处理请求成功

通过axios的响应拦截器,在请求成功后在map对象当中,删除该请求信息的数据

<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <script class="lazy" data-src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue/2.6.14/vue.min.js" type="application/javascript"></script>    <script class="lazy" data-src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/axios/0.26.0/axios.min.js" type="application/javascript"></script>    <script class="lazy" data-src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/qs/6.10.3/qs.js" type="application/javascript"></script></head><body>    <div id="app">        <button @click="onClick1" ref="btn1">请求1</button>        <button @click="onClick2" ref="btn2">请求2</button>    </div></body><script>//存储请求信息和取消方法的的map对象    const pendingRequest = new Map();  //根据请求的信息(请求方式,url,请求get/post数据),产生map的keyfunction getRequestKey(config){    const { method, url, params, data } = config;    return [method, url, Qs.stringify(params), Qs.stringify(data)].join("&");}   //请求拦截器axios.interceptors.request.use(    function (config) {    //根据请求的信息(请求方式,url,请求get/post数据),产生map的key    let requestKey = getRequestKey(config)    //判断请求是否重复    if(pendingRequest.has(requestKey)){        //取消上次请求        let cancel = pendingRequest.get(requestKey)        cancel()        //删除请求信息        pendingRequest.delete(requestKey)     }    //把请求信息,添加请求到map当中    // 生成取消方法    config.cancelToken = config.cancelToken || new axios.CancelToken(cancel => {        // 把取消方法添加到map        if (!pendingRequest.has(requestKey)) {            pendingRequest.set(requestKey, cancel)        }    })    return config;  },  (error) => {     return Promise.reject(error);  });//响应拦截器axios.interceptors.response.use(  (response) => {        //请求成功        //删除请求的信息        let requestKey = getRequestKey(response.config)        if(pendingRequest.has(requestKey)){            pendingRequest.delete(requestKey)           }        return response;   },   (error) => {        return Promise.reject(error);   });let sendPost = function(data){    return axios({        url: 'http://nodejs-cloud-studio-demo-bkzxs.nodejs-cloud-studio-demo.50185620.cn-hangzhou.fc.devsapp.net/test',        method: 'post',        data    })}new Vue({    el: '#app',    mounted() {        this.$refs.btn1.click()        this.$refs.btn2.click()    },    methods: {        // 使用lodash对请求方法做防抖        //这里有问题,只是对每个按钮的点击事件单独做了防抖,但是两个按钮之间做不到防抖的效果        onClick1: async function(){            let res = await sendPost({username:'zs', age: 20})            console.log('请求1的结果', res.data)        },        onClick2: async function(){            let res = await sendPost({username:'zs', age: 20})            console.log('请求2的结果', res.data)        },    },})</script></html>

预览

步骤3-通过axios响应拦截器处理请求失败

通过axios的响应拦截器,在请求失败后在map对象当中,删除该请求信息的数据

<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <script class="lazy" data-src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue/2.6.14/vue.min.js" type="application/javascript"></script>    <script class="lazy" data-src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/axios/0.26.0/axios.min.js" type="application/javascript"></script>    <script class="lazy" data-src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/qs/6.10.3/qs.js" type="application/javascript"></script></head><body>    <div id="app">        <button @click="onClick1" ref="btn1">请求1</button>        <button @click="onClick2" ref="btn2">请求2</button>    </div></body><script>//存储请求信息和取消方法的的map对象    const pendingRequest = new Map();  //根据请求的信息(请求方式,url,请求get/post数据),产生map的keyfunction getRequestKey(config){    const { method, url, params, data } = config;    return [method, url, Qs.stringify(params), Qs.stringify(data)].join("&");}   //请求拦截器axios.interceptors.request.use(    function (config) {    //根据请求的信息(请求方式,url,请求get/post数据),产生map的key    let requestKey = getRequestKey(config)    //判断请求是否重复    if(pendingRequest.has(requestKey)){        //取消上次请求        let cancel = pendingRequest.get(requestKey)        cancel()        //删除请求信息        pendingRequest.delete(requestKey)     }    //把请求信息,添加请求到map当中    // 生成取消方法    config.cancelToken = config.cancelToken || new axios.CancelToken(cancel => {        // 把取消方法添加到map        if (!pendingRequest.has(requestKey)) {            pendingRequest.set(requestKey, cancel)        }    })    return config;  },  (error) => {     return Promise.reject(error);  });//删除请求信息function delPendingRequest(config){    let requestKey = getRequestKey(config)    if(pendingRequest.has(requestKey)){        pendingRequest.delete(requestKey)       } }//响应拦截器axios.interceptors.response.use(  (response) => {        //请求成功        //删除请求的信息        delPendingRequest(response.config)        return response;   },   (error) => {        //请求失败        //不是取消请求的错误        if (!axios.isCancel(error)){            //服务器报400,500报错,删除请求信息            delPendingRequest(error.config || {})        }         return Promise.reject(error);   });let sendPost = function(data){    return axios({        url: 'http://nodejs-cloud-studio-demo-bkzxs.nodejs-cloud-studio-demo.50185620.cn-hangzhou.fc.devsapp.net/test',        method: 'post',        data    })}new Vue({    el: '#app',    mounted() {        this.$refs.btn1.click()        this.$refs.btn2.click()    },    methods: {        // 使用lodash对请求方法做防抖        //这里有问题,只是对每个按钮的点击事件单独做了防抖,但是两个按钮之间做不到防抖的效果        onClick1: async function(){            let res = await sendPost({username:'zs', age: 20})            console.log('请求1的结果', res.data)        },        onClick2: async function(){            let res = await sendPost({username:'zs', age: 20})            console.log('请求2的结果', res.data)        },    },})</script></html>

“vue如何阻止重复请求”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

vue如何阻止重复请求

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

vue如何阻止重复请求

本篇内容介绍了“vue如何阻止重复请求”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!项目当中前端代码会遇到同一个请求向服务器发了多次的情况,
2023-07-05

一文聊聊vue怎么阻止重复请求

vue怎么阻止重复请求?下面本篇文章给大家介绍一下vue阻止重复请求的两种方式,希望对大家有所帮助!
2023-05-14

springboot如何防止重复请求

本文小编为大家详细介绍“springboot如何防止重复请求”,内容详细,步骤清晰,细节处理妥当,希望这篇“springboot如何防止重复请求”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。利用 springbo
2023-07-05

vuejs如何防止重复请求

这篇文章主要讲解了“vuejs如何防止重复请求”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vuejs如何防止重复请求”吧!vuejs防止重复请求的方法:1、添加自定义文件“preventR
2023-06-25

vue禁止重复点击发送多次请求如何实现

本篇内容介绍了“vue禁止重复点击发送多次请求如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!某些情况下,为了阻止用户短时间内重复点击
2023-07-05

springboot防止重复请求防止重复点击的操作

这篇文章主要介绍了springboot防止重复请求防止重复点击的操作,URL拦截器可以使用spring拦截器,但使用spring,每个需要过滤的新URL都需要添加配置,因此这里使用AOP注解的形式来实现,结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
2023-01-30

vue 禁止重复点击发送多次请求的实现

本文主要介绍了vue 禁止重复点击发送多次请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-06

java怎么防止重复请求数据

有以下几种方法可以防止重复请求数据:前端防重复提交:前端可以通过禁用提交按钮或者添加遮罩层等方式,在接收到请求后禁止用户再次提交,待请求返回后再恢复提交按钮的状态。后端去重:后端可以在接收到请求时,根据请求的特征(如请求参数、请求路径等)判
2023-10-25

springboot怎么防止接口重复请求

为了防止接口重复请求,可以使用以下方法:1. 幂等性设计:在接口设计时,尽量遵循幂等性的原则,即无论调用多少次,结果应该是相同的。可以使用唯一标识符或者操作序列号来标识请求,并在服务端对重复请求进行判断。2. Token验证:为每个请求生成
2023-10-20

如何阻止vue组件渲染

这篇文章主要介绍“如何阻止vue组件渲染”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何阻止vue组件渲染”文章能帮助大家解决问题。一、为什么要阻止Vue组件的渲染在某些情况下,我们可能需要阻止V
2023-07-05

java防止重复数据请求怎么实现

有多种方法可以实现防止重复数据请求的功能,以下是其中一种常见的做法:在Java应用中定义一个全局的缓存对象,用于存储已经处理过的请求数据。当接收到一个新的请求时,首先检查缓存对象中是否已经存在相同的请求数据。如果缓存对象中不存在相同的请
2023-10-23

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录