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 相关文章推荐
jQuery 1.0.2
Oct 11 Javascript
javascript getElementsByClassName实现代码
Oct 11 Javascript
silverlight线程与基于事件驱动javascript引擎(实现轨迹回放功能)
Aug 09 Javascript
js中的内部属性与delete操作符介绍
Aug 10 Javascript
Easyui form combobox省市区三级联动
Jan 13 Javascript
微信小程序 删除项目工程实现步骤
Nov 10 Javascript
jquery mobile移动端幻灯片滑动切换效果
Apr 15 Javascript
快速使用node.js进行web开发详解
Apr 26 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
Sep 13 Javascript
解决vue-cli webpack打包后加载资源的路径问题
Sep 25 Javascript
JSON字符串操作移除空串更改key/value的介绍
Jan 05 Javascript
浅谈bootstrap layer.open中end的使用方法
Sep 12 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 jQuery表单,带验证具体实现方法
2014/02/15 PHP
php中base64_decode与base64_encode加密解密函数实例
2014/11/24 PHP
PHP实现删除字符串中任何字符的函数
2015/08/11 PHP
apache集成php7.3.5的详细步骤
2019/06/20 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
2012/02/27 Javascript
html+js实现动态显示本地时间
2013/09/21 Javascript
js获取select默认选中的Option并不是当前选中值
2014/05/07 Javascript
js检验密码强度(低中高)附图
2014/06/05 Javascript
jQuery实现ajax无刷新分页页码控件
2017/02/28 Javascript
angularjs ui-router中路由的二级嵌套
2017/03/10 Javascript
浅谈Vue SSR 的 Cookies 问题
2017/11/20 Javascript
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
axios post提交formdata的实例
2018/03/16 Javascript
微信小程序拍照和摄像功能实现方法示例
2019/02/01 Javascript
js实现随机8位验证码
2020/07/24 Javascript
layui checkbox默认选中,获取选中值,清空所有选中项的例子
2019/09/02 Javascript
js实现无缝轮播图
2020/03/09 Javascript
基于element-ui对话框el-dialog初始化的校验问题解决
2020/09/11 Javascript
[03:48]大碗DOTA
2019/07/25 DOTA
使用python实现strcmp函数功能示例
2014/03/25 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
2018/04/18 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
CSS3 创建网页动画实现弹跳球动效果
2018/10/30 HTML / CSS
如何强制垃圾回收
2015/10/06 面试题
Java中各种基本数据类型的默认值都是什么
2016/12/22 面试题
会计自我鉴定范文
2013/10/06 职场文书
法律专业应届生自荐信范文
2014/01/06 职场文书
高中微机老师自我鉴定
2014/02/16 职场文书
团购业务员岗位职责
2014/03/15 职场文书
2015年服务员个人工作总结
2015/05/27 职场文书
2016医师资格考试考生诚信考试承诺书
2016/03/25 职场文书
调研报告的主要写法
2019/04/18 职场文书
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
2021/05/17 Python
Python OpenCV形态学运算示例详解
2022/04/07 Python
docker compose 部署 golang 的 Athens 私有代理问题
2022/04/28 Servers