发布于 2026-01-05 0 阅读
0

我们来聊聊一个不必要但却很流行的 Vue 插件:vue-axios。我们会讨论它的替代方案、区别以及原因。最后,我们来总结一下。

我们来聊聊一个不必要但却很流行的 Vue 插件。

罪犯

vue-axios

另一种选择

区别与借口

结论

几天前,一条关于某个流行的 npm 包包含恶意代码的新闻迅速传播开来。这件事提醒我们,在将任何包添加到依赖项之前,都应该三思。

这让我想起了我见过几次的一个不必要的 Vue 插件。Vue 的学习曲线平缓,因此深受初级开发者的欢迎,因为对他们来说,弄清楚自己该写什么以及该安装什么插件就更加困难了。

罪犯

我想介绍的这个包/插件是 vue-axios。如果你在谷歌上搜索“vue axios”,它就是第一个搜索结果。我认为这就是它如此受欢迎的主要原因。

GitHub 标志 imcvampire / vue-axios

一个用于将 axios 集成到 Vue.js 的小型封装库

vue-axios

npm 版本 安装大小 npm 下载 jsdelivr 执照

一个用于将 axios 集成到 Vue.js 的小型封装库

为什么

我创建这个库是因为过去我需要一个简单的解决方案来从一个迁移vue-resource到另一个axios

它只是将 axios 绑定到vue实例,这样每次使用时就不必导入了axios

安装方法:

ES6 模块:

npm install --save axios vue-axios
Enter fullscreen mode Exit fullscreen mode

在入口文件中导入库:

// import Vue from 'vue'   // in Vue 2
import * as Vue from 'vue' // in Vue 3
import axios from 'axios'
import VueAxios from 'vue-axios'
Enter fullscreen mode Exit fullscreen mode

在 Vue 2 中的用法:

Vue.use(VueAxios, axios)
Enter fullscreen mode Exit fullscreen mode

在 Vue 3 中的用法:

const app = Vue.createApp(...)
app.use(VueAxios, axios)
Enter fullscreen mode Exit fullscreen mode

脚本:

只需按顺序添加 3 个脚本:vueaxiosvue-axios到您的document

用法:

在 Vue 2 中

这个包装器绑定axiosVue……

让我们来看看一款拥有超过 1000 个 GitHub 星标和每周 23000 次下载量的插件是做什么的。我们可以先阅读一下它的描述:

用法:

这个包装器将 axios 绑定到 Vue,或者如果您使用的是单文件组件,则使用此包装器。

此外,还有一个代码示例,使插件的使用方法更加清晰:

Vue.axios.get(api).then((response) => {
  console.log(response.data)
})

this.axios.get(api).then((response) => {
  console.log(response.data)
})

this.$http.get(api).then((response) => {
  console.log(response.data)
})
Enter fullscreen mode Exit fullscreen mode

基本上,这个包允许你导入一次 axios,然后在每个组件中使用它。

这其实非常实用。你不仅不必在每个组件中都导入 axios,还可以创建一个带有自定义配置的 axios 实例,并在所有组件中使用它。然而,插件的描述中并没有明确提及这一点,所以我不太确定安装该插件的用户是否了解它。

另一种选择

我们发现这个插件确实很有用。那么问题出在哪里呢?让我们不用插件来实现同样的功能:

import Vue from 'vue'
import axios from "axios";

Vue.prototype.$http = axios;
Vue.prototype.axios = axios;
Enter fullscreen mode Exit fullscreen mode

让我们将其与配置插件所需的代码进行比较:

import Vue from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'

Vue.use(VueAxios, axios)

Enter fullscreen mode Exit fullscreen mode

我们可以看到,自己编写整个功能所需的代码行数与配置插件所需的代码行数相同。

最后,我们来展示一下将 axios 与 Vue 结合使用的增强版方法:

import Vue from 'vue'
import axios from "axios";

const instance = axios.create({
  baseURL: 'https://myapi.com'
});

const instanceUserApi = axios.create({
  baseURL: 'https://userapi.com'
});
instanceUserApi.defaults.headers.common["Authorization"] =
  "Token" + localStorage.getItem("authToken");

Vue.prototype.$http = instance;
Vue.prototype.$httpUserApi = instanceUserApi;

Enter fullscreen mode Exit fullscreen mode

我们可以创建多个 axios 实例,每个实例都可以使用不同的配置。这个插件不仅没有任何价值,而且灵活性也比不上我们自己的代码。需要说明的是,该插件允许你在配置过程中传递一个对象来创建多个 axios 实例。

区别与借口

正如 GitHub issue
#18 中所述:Vue.prototype 和 vue-axios 的区别是什么?

该插件使属性(axios 和 $http)变为不可变。对于某些人来说,这可能比上一段描述的方法更具优势。然而,我相当确信,使用此插件的绝大多数开发者并不真正关心属性的不可变性。

结论

Vue-axios 插件的功能正如其描述。在我看来,这里面没有任何欺诈或恶意行为。只是有些开发者缺乏相关知识,在向项目中添加内容时没有仔细考虑而已。

您如何看待这类小型插件/软件包?
您认为这类插件的开发者是否应该公开替代方案?

文章来源:https://dev.to/heftyhead/lets-talk-about-an-unnecessary-but-popular-vue-plugin-1ied