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函数调用常用方法详解
Dec 03 Javascript
jQuery中setTimeout的几种使用方法小结
Apr 07 Javascript
在HTML代码中使用JavaScript代码的例子
Oct 16 Javascript
JavaScript日期类型的一些用法介绍
Mar 02 Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
Jun 01 Javascript
JS弹出新窗口被拦截的解决方法
Aug 09 Javascript
JavaScript获取短信验证码(周期性)
Dec 29 Javascript
浅谈 vue 中的 watcher
Dec 04 Javascript
解决vue 打包发布去#和页面空白的问题
Sep 04 Javascript
微信小程序上传多图到服务器并获取返回的路径
May 05 Javascript
简单了解微信小程序的目录结构
Jul 01 Javascript
Echarts如何重新渲染实例详解
May 30 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对二维数组按指定键值key排序示例代码
2013/11/26 PHP
PHP定时更新程序设计思路分享
2014/06/10 PHP
php+mysql实现用户注册登陆的方法
2015/01/03 PHP
php获取英文姓名首字母的方法
2015/07/13 PHP
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
js form 验证函数 当前比较流行的错误提示
2009/06/23 Javascript
javascript客户端解决方案 缓存提供程序
2010/07/14 Javascript
javascript从右边截取指定字符串的三种实现方法
2013/11/29 Javascript
js浏览器本地存储store.js介绍及应用
2014/05/13 Javascript
JavaScript获取路径设计源码
2014/05/22 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
2015/08/27 Javascript
学习JavaScript设计模式之迭代器模式
2016/01/19 Javascript
简单介绍jsonp 使用小结
2016/01/27 Javascript
让图片跳跃起来  javascript图片轮播特效
2016/02/16 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
jquery append与appendTo方法比较
2017/05/24 jQuery
JQuery实现table中tr上移下移的示例(超简单)
2018/01/08 jQuery
vue3.0 CLI - 1 - npm 安装与初始化的入门教程
2018/09/14 Javascript
jQuery-ui插件sortable实现自由拖动排序
2018/12/01 jQuery
vue 中使用print.js导出pdf操作
2020/11/13 Javascript
举例讲解Python中的Null模式与桥接模式编程
2016/02/02 Python
Django JWT Token RestfulAPI用户认证详解
2019/01/23 Python
Python3远程监控程序的实现方法
2019/07/15 Python
解决python 读取 log日志的编码问题
2019/12/24 Python
利用Canvas模仿百度贴吧客户端loading小球的方法示例
2017/08/13 HTML / CSS
日本最大级玩偶手办购物:あみあみ Amiami
2018/04/23 全球购物
BudgetAir印度:预订航班、酒店和汽车租赁
2019/07/07 全球购物
豪华复古化妆:Besame Cosmetics
2019/09/06 全球购物
香奈儿美国官网:CHANEL美国
2020/05/20 全球购物
毕业生求职的求职信
2013/12/05 职场文书
拓展策划方案
2014/06/03 职场文书
政府班子四风问题整改措施思想汇报
2014/10/08 职场文书
入党培养人考察意见
2015/06/08 职场文书
职业规划从高考志愿专业选择开始
2019/08/08 职场文书
Vue项目中如何封装axios(统一管理http请求)
2021/05/02 Vue.js
python编程学习使用管道Pipe编写优化代码
2021/11/20 Python