[译]在vuejs中使用任意js库
全局变量
最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库的更多相关文章
- 在 Ionic2 TypeScript 项目中导入第三方 JS 库
原文发表于我的技术博客 本文分享了在Ionic2 TypeScript 项目中导入第三方 JS 库的方法,供参考. 原文发表于我的技术博客 1. Typings 的方式 因在 TypeScript 中 ...
- 在 Angular 2 Component 中使用第三方 JS 库
本文所有内容以 Angular 2 Quick Start 项目为基础,使用 TypeScript 语言. 如上图,最近遇到一个需求,需要在一个刚启动的 Angular 2 项目中使用 snap.sv ...
- vue 中引入第三方js库
以 jQuery 为例 一.绝对路径直接引入,全局可用 主入口页面 index.html 中用 script 标签引入: <script src="./static/jquery-1. ...
- 在TypeScript中使用其他JS框架或库的方法
最近刚刚接触TypeScript,感觉非常强大,但是也有一些问题. 比如我们正常写js时,只要把其他js库引入页面,甚至于只要加入到项目中,ReSharper就会自动分析他,并提供语法只能感知,写代码 ...
- 现在流行什么 JS库/框架?
现在大家最感兴趣的 JS 库和框架是什么? jQuery 91.5% Underscore 38.6% AngularJS 28.5% Backbone 18.6% React 15.7% Knock ...
- 如何在Webstorm中添加js库 (青瓷H5游戏引擎)
js等动态语言编码最大的缺点就是没有智能补全代码,webstorm做到了. qici_engine作为开发使用的库,如果能智能解析成提示再好不过了,经测试80%左右都有提示,已经很好了. 其他js库同 ...
- 近期写js库中遇到的一个判别的问题
最近在写一个自己的js库,正写到数组包,在里面定义了一个排序,只对纯数字数据进行排序的方法,但是在测试的时候发现一个很诡异的问题,那就是传入一个对象的时候,它没有返回erroemsg而是返回了对象,上 ...
- 同一页面中引入多个JS库产生的冲突解决方案(转)
发生JS库冲突的主要原因:与jQuery库一样,许多JS库都使用‘$’符号作为其代号.因此在一个页面中引入多个JS库,并且使用‘$’作为代号时,程序不能识别其代表哪个库(这个是我自己的解释,但更深的原 ...
- 可在 html5 游戏中使用的 js 工具库
可在 html5 游戏中使用的 js 工具库 作者: 木頭 时间: September 21, 2014 分类: Utilities,Game 使用 cocos2d-js 3.0 开发游戏项目两三个月 ...
随机推荐
- lnmp架构搭建实例
lamp->lnmp nginx survey.netcraft.net 查看各大网站使用的web服务器,使用下面的命令 # curl -I www.sina.com 结论:现在大型网站几乎统一 ...
- ONI无法启动: Uh oh! Unable to launch Neovim...
问题描述 在终端中是可以打开nvim的,ONI无法正确找到位置 解决方法 修改配置文件,指定nvim的路径 终端中输入which nvim定位所在位置,这里返回的结果是/usr/local/bin/n ...
- 物联网温度服务器-ECharts、HTML5、JavaScript / ECharts gauge使用示例
https://blog.csdn.net/u012812482/article/details/51079890 1. 效果 2. 简介 1. 其中仪表的部分使用的是ECharts的gauge控件实 ...
- GUI 设计
GUI(图形化界面编程) Graphical User Interface (java.Awt javax.Swing) CLI(命令行操作接口) Command line User ...
- Solr7.1--- 高亮查询
由于测试数据比较少,昨天用Java爬了简书的几百篇文章,唉,又特么两点多睡的.如果你需要这些测试文件GitHub. 如果你看过我前面的文章,直接打开db-data-config.xml文件,添加一个e ...
- HR算法具体过程
首先研究HR算法在概率分布估计中的实现,我们再考虑如何将其应用于频繁项挖掘中. 一.确定输入数据类型 def generate_uniform_distribution(k): raw_distrib ...
- Nginx入门篇-基础知识与linux下安装操作
我们要深刻理解学习NG的原理与安装方法,要切合实际结合业务需求,应用场景进行灵活使用. 一.Nginx知识简述Nginx是一个高性能的HTTP服务器和反向代理服务器,也是一个 IMAP/POP3/SM ...
- chrome浏览器安装不上的惨痛经历
项目在赶进度的时候,手贱把chrome的一些文件删除了,整个浏览器都没法打开 决定重装下,但是连卸载的功能都打不开了 上网重新下载了个安装包,发现安装包都打不来 很绝望,查了很多资料 很多人说要删除注 ...
- MySQL数据库优化_索引
1.添加索引后减少查询需要的行数,提高查询性能 (1) 建表 CREATE TABLE `site_user` ( `id` ) NOT NULL AUTO_INCREMENT COMMENT '自增 ...
- TensorFlow tensor张量拼接concat - split & stack - unstack
TensorFlow提供两种类型的拼接: tf.concat(values, axis, name='concat'):按照指定的已经存在的轴进行拼接 tf.stack(values, axis=0, ...