在 Vue.js 中使用任意 JavaScript 第三方库

留平
• 阅读 4950

如何在 Vue.js 项目中 引入 JavaScript 第三方库


全局变量


将 JavaScript 第三方库 添加到项目中,最简单的办法是通过将其附加到 window 对象上,以使其成为全局变量:

// entry.js 文件
window._ = require('lodash'); 
JavaScript 代码:
// MyComponent.vue 文件
export default {
  created() {
    console.log(_.isEmpty() ? 'Lodash everywhere!' : 'Uh oh..');
  }
}

这种情况会使 window 变量不断增长,但是最关键的是,他们不能使用服务器渲染。当应用程序在服务端运行时,window 对象是 undefined 的,因此尝试访问 window 下的属性将会抛出一个错误。


在每个文件中导入


另一种二流的方法是将库导入到每个文件

// MyComponent.vue 文件
import _ from 'lodash';
export default {
  created() {
    console.log(_.isEmpty() ? 'Lodash is available here!' : 'Uh oh..');
  }
}

这是有效的,但是你需要重复手动导入和移除,这是一个痛点:你必须记住将这个库导入到每个文件中,然后当你的某个文件不用这个库的时候, 记得要将它从这个文件中移除。如果你没有正确地设置你的构建工具,则可能会最终导致在构建包中存在同一个库的多个副本。


一个更好的方式


在Vue项目中使用Javascript库的最干净,最健壮的方法是将其代理为 Vue 原型对象的属性。我们用这种方式,将 Moment日期和时间库添加到我们的项目中:

JavaScript 代码:
// entry.js 文件
import moment from 'moment';
Object.definePrototype(Vue.prototype, '$moment', { value: moment });
由于所有组件都会继承 Vue 原型对象上方法,这将使 Moment 自动可用于任何组件,没有全局变量或任何需要手动导入的组件。它可以在任何 实例/组件 中简单地通过 this.$moment 访问被访问:

JavaScript 代码:
// MyComponent.vue 文件
export default {
  created() {
    console.log('The time is ' . this.$moment().format("HH:mm"));
  }
}

现在让我们花点时间了解一下这是如何工作的。

Object.defineProperty
我们通常会像这样设置一个对象属性:

JavaScript 代码:
Vue.prototype.$moment = moment;

你可以这么做,但是通过使用 Object.defineProperty ,我们可以使用 描述符 来定义我们的属性。描述符允许我们设置一些低级细节,例如我们的属性是否可写,以及在 for 循环中枚举期间是否显示。

我们通常不会在日常使用 Javascript 中使用到描述符,因为 99% 的时间我们不需要这么细致的属性分配。但这里给我们一个明显的优势:默认情况下,使用描述符创建的属性是只读的。

这意味着,一些糊涂的开发人员(可能是你)不能在组件内去做一些很愚蠢的事情, 并且破坏一切.

JavaScript 代码:
this.$http = 'Assign some random thing to the instance method';
this.$http.get('/'); // TypeError: this.$http.get is not a function
相反, 我们的只读实例则能很好的保护我们的库, 因为如果有人试图去覆盖它, 将会获得一个错误:  TypeError: Cannot assign to read only property.

$


您会注意到,我们将库代理为以美元符号“$”为前缀的属性名。 你可能还看过其他的属性和方法,例如,$refs, $on, $mount等等也都是以”$”开头。

虽然属性名上添加前缀不是必须的,但是这样做可以提醒糊涂的开发人员(可能是你),这是一个公共API属性或方法,欢迎你使用,不像其他属性的实例,可能只是为了 Vue 的内部使用。

作为基于原型的语言,Javascript 中没有(真正的)类,因此也没有 “私有” 和 “公共” 变量或 “静态” 方法。 这个惯例是一种很好的替代品,我们认为是值得遵守的约定。


this


你还会注意到,你可以使用 this.libraryName 来使用这个库 ,但是这样做会有个小小的问题,因为它现在是一个实例方法。

然而,这样做的结果是,与全局变量不同,您在使用库时必须确保处于正确的作用域中。内部的回调方法不能通过 this 来访问你的库。

幸好,ES6中的箭头函数是一个不错的解决方案, 它能确保你在正确的作用域中:

JavaScript 代码:
// script.js
this.$http.get('/').then(res => {
  if (res.status !== 200) {
    this.$http.get('/') // etc
    // 只在箭头回调函数中起作用。愚人码头注:你也可以使用ES5 的 bind();
  }
});

为什么不使它成为一个插件?

如果您打算在多个 Vue 项目中使用 JavaScript 第三方库,或者您想与世界分享你的库,您可以将其构建成插件!

插件提取复杂性的部分,允许你在项目中简单地执行以下操作来添加你选择的库:

JavaScript 代码:
// script.js
import MyLibraryPlugin from 'my-library-plugin';
Vue.use(MyLibraryPlugin);

使用这两行,我们可以在任何组件中使用 JavaScript 第三方库,就像我们可以使用 Vue Router ,Vuex 和其他使用 Vue.use 的插件一样。

编写一个插件
首先,为您的插件创建一个文件。在这个例子中,我将创建一个插件,将 Axios 添加到你所有的 Vue 实例和组件中,因此我将调用文件 axios.js。

要了解的主要内容是:插件必须公开一个 install 方法,并且将 Vue 构造函数作为第一个参数:

JavaScript 代码:
// axios.js
export default {
  install: function(Vue) {
    // Do stuff
  }
}

现在我们可以使用之前介绍的方法将库添加到原型对象中:

JavaScript 代码:
// axios.js
import axios from 'axios';
export default {
  install: function(Vue,) {
    Object.defineProperty(Vue.prototype, '$http', { value: axios });
  }
}

我们现在需要做的事情是 use 实例方法将我们的库添加到一个项目。例如,我们现在可以轻松地添加 Axios 库:

JavaScript 代码:
// entry.js
import AxiosPlugin from './axios.js';
Vue.use(AxiosPlugin);
new Vue({
  created() {
    console.log(this.$http ? 'Axios works!' : 'Uh oh..');
  }
})

彩蛋: 插件可选参数


你插件里的 install 方法允许接受可选参数。 一些开发人员可能不是很喜欢使用 axios 实例的方法名 $http ,因为 Vue Resource 已经使用了这个名字,所以让我们使用一个可选参数来让它们变成你所喜欢的方法名:

JavaScript 代码:
// axios.js
import axios from 'axios';
export default {
  install: function(Vue, name = '$http') {
    Object.defineProperty(Vue.prototype, name, { value: axios });
  }
}
JavaScript 代码:
// entry.js
import AxiosPlugin from './axios.js';
Vue.use(AxiosPlugin, '$axios');
new Vue({
  created() {
    console.log(this.$axios ? 'Axios works!' : 'Uh oh..');
  }
})
点赞
收藏
评论区
推荐文章
Easter79 Easter79
4年前
Vue 3 高阶指南之 WeakMap
高阶指南之WeakMap「WeakMap」对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。在JavaScript里,mapAPI可以通过使其四个API方法共用两个数组(一个存放键,一个存放值)来实现。给这种map设置值时会同时将键和值添加到这两个数组的末尾。从
她左右 她左右
4年前
安装 | Vue3中文文档
安装Vue.js设计的初衷就包括可以被渐进式地采用。这意味着它可以根据需求以多种方式集成到一个项目中。将Vue.js添加到项目中有三种主要方式。1.在页面上以的形式导入。2.使用安装它。3.使用官方的来构建一个项目,它为现代前端工作流程提供了功能齐备的构建设置(例如,热重载、保存时的提示等等)。每个版本的详细发行说明可在
linbojue linbojue
5个月前
一篇文章带您深入了解JavaScript供应链安全
在如今的互联网时代下,JavaScript已经是开发动态和交互式用户体验的重要工具。随着开发者对第三方库和包的依赖越来越多,JavaScript供应链安全问题也逐渐浮出水面。本文将深入探讨JavaScript供应链安全的概念,分析其中的潜在风险和漏洞,并提
Stella981 Stella981
4年前
Cocos Creator基础教程(9)—优化代码编辑器
CocosCreator游戏开发主要是使用JavaScript语言,这里向大家推荐VisualStudioCode和Webstorm两款JavaScript神级编辑器。这两款编辑器的安装都很简单,这里主要介绍在CocosCreator项目中如何调整编辑器配置,以提升开发效率。1\.排除干扰文件我们知道CocosCre
Stella981 Stella981
4年前
JavaScript的 基本数据类型
第一:Javascript对象是第二:Javascript中第三:Javascript的对象是数据;第四:JavaScript中的对象可以简单理解成"名称:值"对(name:value)。名称(name):"名称"部分是一个JavaScript字符串参考https://www
Stella981 Stella981
4年前
HarmonyOS应用开发引入第三方库的三种方式
我们在做应用开发的时候,往往需要引入些优秀的第三方库来进行开发,下面就讲讲我们在做HarmonyOS应用开发中引入第三方库的三种方式。1、通过编写gradle依赖进行引入,熟悉maven或者gradle的朋友对这个就太熟悉了。针对这个方式,我就拿个fastjson库的引入进行举例吧,在对应的Module下的build.gradle文件中添加依赖项即可
Wesley13 Wesley13
4年前
BOOM和DOOM操作
\TOC\BOMBOM操作指的是浏览器对象模型,它可以是JavaScript可以于浏览器进行对话,在JavaScript中与浏览器交互就是对window对象进行操作window对象window对象是客户端JavaScript最高层对象之一,由于window对象是其他大部分对象的共同的祖先,在调用window对象的
Wesley13 Wesley13
4年前
1分钟选好最合适你的JavaScript框架
Javascript框架(以下简称框架)也被称为Javascript库,是一组包含丰富功能和函数的JavaScript代码集,能够帮助开发者快速完成Web设计和开发工作。随着Web社区的越发活跃,新的框架也层出不穷,目前流行的有:Angular、React、Vue.js和Knockout等。面对如此丰富多样的框架,很多Web开发团队都感到难以抉择,性能、
linbojue linbojue
1年前
SpringBoot2.X+Vue+UniAPP,全栈开发医疗小程序
开发医疗小程序的技术选型和开发流程在开发医疗小程序时,可以根据具体需求和项目规模选择合适的技术选型。以下是一些常用的技术选项:前端开发:医疗小程序的前端开发可以使用基于HTML、CSS和JavaScript的框架和库,如Vue.js、React.js和An