原文

全局变量

最naive的办法是通过附加类库到window对象,使之成为全局变量:

entry.js

window._ = require('lodash');

MyComponent.vue

export default {
created() {
console.log(_.isEmpty() ? 'Lodash everywhere!' : 'Un oh..');
}
}

这个办法不好的是,当app运行在服务端的时候就糟糕了,我们会发现抛出了一个异常:window对象没有定义。

每个文件都导入

MyComponent.vue

import _ from 'lodash';

export default {
created() {
console.log(_.isEmpty() ? 'Lodash is available here!' : 'Uh oh..');
}
}

这个方法违背了DRY原则。你必须在每个要使用lodash的文件中都import。

推荐的做法

最聪明的做法是将类库作为Vue prototype对象的一个属性:

entry.js

import moment from 'moment';

Object.definePrototype(Vue.prototype, '$moment', { value: moment });

MyNewComponent.vue

export default {
created() {
console.log('The time is '+ this.$moment().format('HH:mm'));
}
}

现在我们花点时间来看看它是如何工作的。

Object.definePrototype

通常我们这样设置一个对象的属性:

Vue.prototype.$moment = moment;

你可以像上面一样做。但是使用Object.definePrototype,可以定义一个有descriptor的属性。descriptor能让我们设置一些低级别的细节,例如属性是否是可写的,在枚举循环中是否出现。

当然99%的情况我们不需要处理descriptor的低级别的细节。但是使用它有一个好处:使用descriptor定义的属性默认是只读的

这意味不要当心这个属性被别人覆盖了:

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”。

$

你可能注意到我们代理类库的属性名以$为前缀。

根据约定,$前缀告诉使用者,这个属性是一个公共API的属性或者方法,大家可以使用它。而不是只在Vue内部中使用的属性或方法。

this

this.libraryName告诉我们这个是个实例方法。

这样的话,我们在使用类库的时候要注意要在正确的上下文当中。

箭头函数是一个解决作用域的好办法:

this.$http.get('/').then(res => {
if (res.status !== 200) {
this.$http.get('/') // etc
// Only works in a fat arrow callback.
}
});

为什么不做成一个插件

如果你计划在多个Vue项目中使用一个类库,你可以将他build为你的一个插件!

使用插件非常简单:

import MyLibraryPlugin from 'my-library-plugin';
Vue.use(MyLibraryPlugin);

写一个插件

首先,为你的插件创建一个文件。在这个例子中我做了一个Axios的插件,可以在任何Vue实例和component中使用axios,因此这个名为axios.js

一个插件最重要的是install方法,它将Vue构造器作为第一个参数:

axios.js:

export default {
install: function (Vue) {
// Do stuff
}
}

现在我们使用上面的方法将类库添加到prototype对象:

axios.js:

import axios from 'axios'

export default {
install: function (Vue) {
Object.definePrototype(Vue.prototype, '$http', { value: axios });
}
}

我们可以如下一样,非常简单的就能使用Axios类库了:

entry.js

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

福利:插件的可选参数

插件的install方法接受一个可选的参数。有些开发者可能不喜欢$http这个名字,通过这个可选参数,可以让这些开发者自定义名字:

axios.js:

import axios from 'axios';

export default {
install: function(Vue, name = '$http') {
Object.definePrototype(Vue.prototype, name, { value: axios };
}
}

entry.js

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

[译]在vuejs中使用任意js库的更多相关文章

  1. 在 Ionic2 TypeScript 项目中导入第三方 JS 库

    原文发表于我的技术博客 本文分享了在Ionic2 TypeScript 项目中导入第三方 JS 库的方法,供参考. 原文发表于我的技术博客 1. Typings 的方式 因在 TypeScript 中 ...

  2. 在 Angular 2 Component 中使用第三方 JS 库

    本文所有内容以 Angular 2 Quick Start 项目为基础,使用 TypeScript 语言. 如上图,最近遇到一个需求,需要在一个刚启动的 Angular 2 项目中使用 snap.sv ...

  3. vue 中引入第三方js库

    以 jQuery 为例 一.绝对路径直接引入,全局可用 主入口页面 index.html 中用 script 标签引入: <script src="./static/jquery-1. ...

  4. 在TypeScript中使用其他JS框架或库的方法

    最近刚刚接触TypeScript,感觉非常强大,但是也有一些问题. 比如我们正常写js时,只要把其他js库引入页面,甚至于只要加入到项目中,ReSharper就会自动分析他,并提供语法只能感知,写代码 ...

  5. 现在流行什么 JS库/框架?

    现在大家最感兴趣的 JS 库和框架是什么? jQuery 91.5% Underscore 38.6% AngularJS 28.5% Backbone 18.6% React 15.7% Knock ...

  6. 如何在Webstorm中添加js库 (青瓷H5游戏引擎)

    js等动态语言编码最大的缺点就是没有智能补全代码,webstorm做到了. qici_engine作为开发使用的库,如果能智能解析成提示再好不过了,经测试80%左右都有提示,已经很好了. 其他js库同 ...

  7. 近期写js库中遇到的一个判别的问题

    最近在写一个自己的js库,正写到数组包,在里面定义了一个排序,只对纯数字数据进行排序的方法,但是在测试的时候发现一个很诡异的问题,那就是传入一个对象的时候,它没有返回erroemsg而是返回了对象,上 ...

  8. 同一页面中引入多个JS库产生的冲突解决方案(转)

    发生JS库冲突的主要原因:与jQuery库一样,许多JS库都使用‘$’符号作为其代号.因此在一个页面中引入多个JS库,并且使用‘$’作为代号时,程序不能识别其代表哪个库(这个是我自己的解释,但更深的原 ...

  9. 可在 html5 游戏中使用的 js 工具库

    可在 html5 游戏中使用的 js 工具库 作者: 木頭 时间: September 21, 2014 分类: Utilities,Game 使用 cocos2d-js 3.0 开发游戏项目两三个月 ...

随机推荐

  1. Linux下启动,停止,重启Nginx、Mysql、PHP

    LINUX启动Nginx的命令: 一.查询是否启动 [root@jiang php-fpm.d]# ps -ef | grep nginx root 25225 1 0 19:26 ? 00:00:0 ...

  2. 译:Spring Boot 自动伸缩

    原文链接:https://dzone.com/articles/spring-boot-autoscaler 作者:Piotr Mińkowski 译者:helloworldtang 自动伸缩是每个人 ...

  3. 时间复杂度和大O表示法

    大O表示法:称一个函数g(n)是O(f(n)),当且仅当存在常数c>0和n0>=1,对一切n>n0均有|g(n)|<=c|f(n)|成立,也称函数g(n)以f(n)为界或者称g ...

  4. 【UOJ 351】新年的叶子

    http://uoj.ac/problem/351 其实原来看到这题是真的不想做的 毕竟真的特别怕期望题 后来莫名发现自己打了正解 也是很震惊的2333 Description   对于一棵树,每次随 ...

  5. luogu3731 新型城市化

    题目链接 思路 这道题对于题意的转化很关键. 题目要求的是添上一条边,使得图中最大团的大小变大.给出的边是原图的补集,这就给我们了提示. 因为题目中说,原图中最多有两个团.所以给出的边一定形成了一个二 ...

  6. Ubuntu系统修改BIOS时间问题

    http://forum.ubuntu.org.cn/viewtopic.php?t=477606 ubuntu16.04将硬件时间改为CST 原因: 在安装ubuntu双系统的情况下,ubuntu的 ...

  7. crond守护进程实现定时监控某进程占有内存的大小

    1)添加计划任务 crontab -e会使用某个编辑器打开某个文件,然后在内输入需要执行的计划任务,保存后在/var/spool/cron/crontabs/下会出现以用户名命名的文件 2)计划任务如 ...

  8. marks学习2

    控件的大小单位用dp  控件的高度和宽度 sp字体的单位 控件的字体的大小.可缩放字体. 内边距 padding控件的边缘到控件内荣的距离

  9. 论文总结(negFIN: An efficient algorithm for fast mining frequent itemsets)

    一.论文整体思路: 作者提出了一种基于前缀树的数据结构,NegNodeset,其实是对之前前缀树的一种改进,主要区别在于采用了位图编码,通过这种数据结构产生的算法称为negFIN. negFIN算法高 ...

  10. 关于处理iis8.0中设置Request.BinaryRead 不允许操作的解决方法

    iis6.0解决方案: 起初我刚开始上传的是小文件运行都是正常的,后来我弄个文件大点的上传看程序运行怎么样?就上面的问题,在网上搜索正好找到跟我一样的问题,拿过来自己记录下.其中行62指的是:oUpF ...