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 相关文章推荐
JsRender for index循环索引用法详解
Oct 31 Javascript
在JavaScript中访问字符串的子串
Jul 07 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
Sep 20 Javascript
解析JavaScript数组方法reduce
Dec 12 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
Mar 31 Javascript
原生javascript上传图片带进度条【实例分享】
Apr 06 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
Jul 05 Javascript
node.js 发布订阅模式的实例
Sep 10 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
Sep 12 jQuery
Vue 样式绑定的实现方法
Jan 15 Javascript
Vue组件更新数据v-model不生效的解决
Apr 02 Vue.js
vue项目proxyTable配置和部署服务器
Apr 14 Vue.js
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
如何使用脚本模仿登陆过程
2006/11/22 PHP
PHP 数组排序方法总结 推荐收藏
2010/06/30 PHP
php编程实现获取excel文档内容的代码实例
2011/06/28 PHP
php定时计划任务的实现方法详解
2013/06/06 PHP
PHP中SQL查询语句的id=%d解释(推荐)
2016/12/10 PHP
PHP memcache在微信公众平台的应用方法示例
2017/09/13 PHP
基于PHP实现用户在线状态检测
2020/11/10 PHP
给jqGrid数据行添加修改和删除操作链接(之一)
2011/11/04 Javascript
JS代码放在head和body中的区别分析
2011/12/01 Javascript
JavaScript实现点击按钮后变灰避免多次重复提交
2013/07/15 Javascript
jQuery(js)获取文字宽度(显示长度)示例代码
2013/12/31 Javascript
vue中如何实现变量和字符串拼接
2017/06/19 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
2017/08/09 Javascript
Material(包括Material Icon)在Angular2中的使用详解
2018/02/11 Javascript
React native ListView 增加顶部下拉刷新和底下点击刷新示例
2018/04/27 Javascript
Vue2 轮播图slide组件实例代码
2018/05/31 Javascript
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
用C++封装MySQL的API的教程
2015/05/06 Python
python正则中最短匹配实现代码
2018/01/16 Python
Python机器学习库scikit-learn安装与基本使用教程
2018/06/25 Python
NumPy 数学函数及代数运算的实现代码
2018/07/18 Python
Win10下python 2.7.13 安装配置方法图文教程
2018/09/18 Python
使用 Python ssh 远程登陆服务器的最佳方案
2020/03/06 Python
Keras 实现加载预训练模型并冻结网络的层
2020/06/15 Python
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
SmartBuyGlasses台湾:名牌眼镜,名牌太阳眼镜及隐形眼镜
2017/01/04 全球购物
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
为什么group by 和order by会使查询变慢
2014/05/16 面试题
2014年作风建设心得体会
2014/10/22 职场文书
2014年小学辅导员工作总结
2014/12/23 职场文书
2015年个人招商工作总结
2015/04/25 职场文书
于丹讲座视频观后感
2015/06/15 职场文书
Flask使用SQLAlchemy实现持久化数据
2021/07/16 Python
vue实现书本翻页动画效果实例详解
2022/04/08 Vue.js
Android中的Launch Mode详情
2022/06/05 Java/Android