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 相关文章推荐
测试JavaScript字符串处理性能的代码
Dec 07 Javascript
jquery时间下拉框小例子
Apr 15 Javascript
javascript实现des解密加密全过程
Apr 03 Javascript
javascript闭包传参和事件的循环绑定示例探讨
Apr 17 Javascript
JS实现title标题栏文字不间断滚动显示效果
Sep 07 Javascript
微信小程序 ES6Promise.all批量上传文件实现代码
Apr 14 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
Aug 07 Javascript
详解基于vue-cli优化的webpack配置
Nov 06 Javascript
一个简单的node.js界面实现方法
Jun 01 Javascript
webpack4+react多页面架构的实现
Oct 25 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
May 07 Javascript
解决layui的table插件无法多层级获取json数据的问题
Sep 19 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逐行输出(ob_flush与flush的组合)
2012/02/04 PHP
php比较多维数组中值的大小排序实现代码
2012/09/08 PHP
php中使用url传递数组的方法
2015/02/11 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
2016/12/29 PHP
PHP中的日期时间处理利器实例(Carbon)
2017/06/09 PHP
javascript 表单的友好用户体现
2009/01/07 Javascript
js简单实现让文本框内容逐个字的显示出来
2013/10/22 Javascript
JS中实现replaceAll的方法(实例代码)
2013/11/12 Javascript
微信企业号开发之微信考勤百度地图定位
2015/09/11 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
JavaScript学习笔记整理_setTimeout的应用
2016/09/19 Javascript
jquery  实现轮播图详解及实例代码
2016/10/12 Javascript
详解如何在vue中使用sass
2017/06/21 Javascript
JavaScript中三个等号和两个等号你了解多少
2017/07/04 Javascript
angular6.0开发教程之如何安装angular6.0框架
2018/06/29 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
2020/08/04 Javascript
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
Python爬虫代理IP池实现方法
2017/01/05 Python
python+opencv实现的简单人脸识别代码示例
2017/11/14 Python
Python OpenCV获取视频的方法
2018/02/28 Python
PyQt5每天必学之进度条效果
2018/04/19 Python
详解Python装饰器
2019/03/25 Python
python 协程中的迭代器,生成器原理及应用实例详解
2019/10/28 Python
Python如何爬取qq音乐歌词到本地
2020/06/01 Python
CSS3中引入多种自定义字体font-face
2020/06/12 HTML / CSS
Armor Lux法国官方网站:水手服装、成衣和内衣
2020/05/26 全球购物
二年级体育教学反思
2014/01/15 职场文书
酒店中秋节活动方案
2014/01/31 职场文书
实习生求职自荐信
2014/02/07 职场文书
社区学习雷锋活动总结
2014/04/25 职场文书
奥巴马上海演讲稿
2014/09/10 职场文书
党员专题组织生活会发言材料
2014/10/17 职场文书
给老婆的检讨书
2015/01/27 职场文书
寒山寺导游词
2015/02/03 职场文书
应届毕业生求职信范文
2015/03/19 职场文书
2016年清明节期间群众祭祀活动工作总结
2016/04/01 职场文书