Vue框架中正确引入JS库的方法介绍


Posted in Javascript onJuly 30, 2017

本文主要给大家介绍的是关于在Vue框架中正确引入JS库的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍:

错误示范

全局变量法

最不靠谱的方式就是将导入的库挂在全部变量window 对象下:

// entry.js:
window._ = require('lodash');

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

这种方式的缺点有很多,我们只说其中一个关键的点:不支持服务端渲染。当应用跑在服务端时,window对象不存在,当然试图去访问window下的属性会抛出错误。

处处引入法

另外一个不太优雅的方式就是在需要的每个文件中都引入对应的库:

// MyComponent.vue:
import _ from 'lodash';

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

虽然这方法是可行的,但是太不简洁。你必须在每个文件中都记得引入, 而且如果不需要了,又得重新删除。另外,如果打包策略不够明智的话,可能会打包出多份重复的代码。

正确引入方式

最简单靠谱的方式是用库变成Vue的原型对象的属性。下面,我来演示如何将Moment 库引入:

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

Object.definePrototype 语法参见 MDN

由于所有的组件都会继承Vue原型对象上的方法,因此这些方法在任何组件文件中都能通过this.$moment 访问到:

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

使用 Object.defineProperty 定义对象属性,如果不在属性描述器中额外说明,则该属性就是默认只读的,保护引入的库不被重新赋值。

写成插件

如果你在项目的很多地方都用了某个库,或者你希望全局可用,你可以构建自己的Vue 插件。

插件能化繁为简,能让你像下面这样很简单地引入自己想要的库:

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

就像Vue Route,Vuex等插件一样,我们的库仅仅需要两行,就能在任何地方使用了。

如何写插件

首先,创建一个文件。本例中,我将引入一个Axios库的插件。我们就把这个文件命名为axios.js 吧。

最关键的地方在于,我们需要暴露一个将Vue构造器作为第一个参数的install 方法。

// axios.js:

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

然后我们可以用之前的方式将库添加到Vue的原型对象上:

// axios.js
import axios from 'axios';

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

接着我们只需要Vue实例的use方法就能将这个库引入整个项目了。我们像下面代码一样简单引入:

// 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插件的方法名也是这个。然后,让我们利用第二个参数来修改它。

// axios.js
import axios from 'axios';

export default {
 install: function(Vue, name = '$http') {
 Object.defineProperty(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..');
 }
})

当然上面,我们可以直接在Object.defineProperty的中将name属性写死成$axios。也可以在install方法中引入多个需要的库。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持

Javascript 相关文章推荐
一直复略了的一个问题,关于表单重复提交
Feb 15 Javascript
在Ajax中使用Flash实现跨域数据读取的实现方法
Dec 02 Javascript
最佳JS代码编写的14条技巧
Jan 09 Javascript
jquery ajax学习笔记2 使用XMLHttpRequest对象的responseXML
Oct 16 Javascript
JavaScript将页面表格导出为Excel的具体实现
Dec 27 Javascript
JavaScript分页功能的实现方法
Apr 25 Javascript
深入理解JavaScript中Ajax
Aug 02 Javascript
Jquery UI实现一次拖拽多个选中的元素操作
Dec 01 Javascript
vue2.0 keep-alive最佳实践
Jul 06 Javascript
解决React Native端口号修改的方法
Jul 28 Javascript
vue中渲染对象中属性时显示未定义的解决
Jul 31 Javascript
微信小程序视频弹幕发送功能的实现
Dec 28 Javascript
webpack配置sass模块的加载的方法
Jul 30 #Javascript
Angular.js中$resource高大上的数据交互详解
Jul 30 #Javascript
Vue的Flux框架之Vuex状态管理器
Jul 30 #Javascript
webpack实现热加载自动刷新的方法
Jul 30 #Javascript
利用JavaScript如何查询某个值是否数组内
Jul 30 #Javascript
Angular.js中上传指令ng-upload的基本使用教程
Jul 30 #Javascript
关于前后端json数据的发送与接收详解
Jul 30 #Javascript
You might like
PHP中使用json数据格式定义字面量对象的方法
2014/08/20 PHP
ThinkPHP自动填充实现无限级分类的方法
2014/08/22 PHP
PHP实现提高SESSION响应速度的几种方法详解
2019/08/09 PHP
深入学习微信网址链接解封的防封原理visit_type
2019/08/15 PHP
通过Unicode转义序列来加密,按你说的可以算是混淆吧
2007/05/06 Javascript
javascript中expression的用法整理
2014/05/13 Javascript
jQuery实现table隔行换色和鼠标经过变色的两种方法
2014/06/15 Javascript
JavaScript中文件上传API详解
2016/04/01 Javascript
前端设计师们最常用的JS代码汇总
2016/09/25 Javascript
浅谈JavaScript作用域和闭包
2017/09/18 Javascript
jQuery读取本地的json文件(实例讲解)
2017/10/31 jQuery
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
javascript异步处理与Jquery deferred对象用法总结
2019/06/04 jQuery
Vue组件跨层级获取组件操作
2020/07/27 Javascript
Node.js path模块,获取文件后缀名操作
2020/11/07 Javascript
[02:46]解说DC:感谢430陪伴我们的DOTA2国际邀请赛岁月
2016/06/29 DOTA
跟老齐学Python之编写类之一创建实例
2014/10/11 Python
python中as用法实例分析
2015/04/30 Python
django框架如何集成celery进行开发
2017/05/24 Python
Python开发微信公众平台的方法详解【基于weixin-knife】
2017/07/08 Python
Django ORM框架的定时任务如何使用详解
2017/10/19 Python
Python反转序列的方法实例分析
2018/03/21 Python
python判断一个集合是否为另一个集合的子集方法
2018/05/04 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
2019/04/29 Python
python numpy 常用随机数的产生方法的实现
2019/08/21 Python
Python pip 常用命令汇总
2020/10/19 Python
阿里巴巴英国:Alibaba英国
2019/12/11 全球购物
澳大利亚家用电器在线商店:Billy Guyatts
2020/05/05 全球购物
博士研究生自我鉴定范文
2013/12/04 职场文书
社区七一党员活动方案
2014/01/25 职场文书
聊城大学毕业生自荐书
2014/02/01 职场文书
检查接待方案
2014/02/27 职场文书
地理科学专业自荐信
2014/09/01 职场文书
升学宴答谢词
2015/01/05 职场文书
人工作失职检讨书
2015/05/05 职场文书
2016继续教育研修日志
2015/11/13 职场文书