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 相关文章推荐
多个js与css文件的合并方法详细说明
Dec 26 Javascript
使用JavaScript 实现各种跨域的方法
May 08 Javascript
Extjs4中Form的使用之本地hiddenfield
Nov 26 Javascript
Jquery原生态实现表格header头随滚动条滚动而滚动
Mar 18 Javascript
javascript清空table表格的方法
May 14 Javascript
原生js仿jquery animate动画效果
Jul 13 Javascript
对js中回调函数的一些看法
Aug 29 Javascript
Bootstrap基本组件学习笔记之面板(14)
Dec 08 Javascript
js实现横向拖拽导航条功能
Feb 17 Javascript
基于Swiper实现移动端页面图片轮播效果
Dec 28 Javascript
vue.js中ref及$refs的使用方法解析
Oct 08 Javascript
VUE+Element实现增删改查的示例源码
Nov 23 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/10/09 PHP
.htaccess文件保护实例讲解
2011/02/06 PHP
PHP中PDO基础教程 入门级
2011/09/04 PHP
PHP面相对象中的重载与重写
2017/02/13 PHP
对象特征检测法判断浏览器对javascript对象的支持
2009/07/25 Javascript
子窗口、父窗口和Silverlight之间的相互调用
2010/08/16 Javascript
form表单只提交数据而不进行页面跳转的解决方案
2013/09/18 Javascript
基于jquery实现的图片在各种分辨率下未知的容器内上下左右居中
2014/05/11 Javascript
JavaScript Math.ceil 方法(对数值向上取整)
2015/01/09 Javascript
基于javascript简单实现对身份证校验
2021/01/25 Javascript
简单讲解jQuery中的子元素过滤选择器
2016/04/18 Javascript
利用JS实现点击按钮后图片自动切换的简单方法
2016/10/24 Javascript
详解js中==与===的区别
2017/01/08 Javascript
node.js操作mongodb简单示例分享
2017/05/25 Javascript
浅谈React前后端同构防止重复渲染
2018/01/05 Javascript
VUE-cli3使用 svg-sprite-loader
2018/10/20 Javascript
JSON字符串操作移除空串更改key/value的介绍
2019/01/05 Javascript
详解几十行代码实现一个vue的状态管理
2019/01/28 Javascript
p5.js临摹动态图形实现方法详解
2019/10/23 Javascript
Flask 让jsonify返回的json串支持中文显示的方法
2018/03/26 Python
python交互界面的退出方法
2019/02/16 Python
浅谈Python爬虫基本套路
2019/03/25 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
2019/06/12 Python
python脚本监控logstash进程并邮件告警实例
2020/04/28 Python
HTML5响应式(自适应)网页设计的实现
2017/11/17 HTML / CSS
Deichmann英国:德国鞋类零售商
2021/01/30 全球购物
制作部班长职位说明书
2014/02/26 职场文书
企业后勤岗位职责
2014/02/28 职场文书
产品发布会策划方案
2014/05/12 职场文书
行政监察建议书
2014/05/19 职场文书
放弃继承权公证书
2015/01/23 职场文书
2015年端午节活动策划书
2015/05/05 职场文书
母亲节主题班会
2015/08/14 职场文书
大学生军训心得体会5篇
2019/08/15 职场文书
 Python 中 logging 模块使用详情
2022/03/03 Python
CentOS7安装MySQL8的超级详细教程(无坑!)
2022/06/10 Servers