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生产批量批处理执行命令
Jul 28 Javascript
关于javascript document.createDocumentFragment()
Apr 04 Javascript
几个有趣的Javascript Hack
Jul 24 Javascript
JS实现进入页面时渐变背景色的方法
Feb 25 Javascript
原生JS实现响应式瀑布流布局
Apr 02 Javascript
JavaScript返回上一页的三种方法及区别介绍
Jul 04 Javascript
javascript下拉列表菜单的实现方法
Nov 18 Javascript
JavaScript jquery及AJAX小结
Jan 24 Javascript
jquery.qtip提示信息插件用法简单实例
Jun 17 Javascript
JS常用正则表达式总结【经典】
May 12 Javascript
简单快速的实现js计算器功能
Aug 17 Javascript
浅谈AngularJs 双向绑定原理(数据绑定机制)
Dec 07 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
模拟xcopy的函数
2006/10/09 PHP
解析php安全性问题中的:Null 字符问题
2013/06/21 PHP
PHP Web木马扫描器代码分享
2015/09/06 PHP
Zend Framework教程之Zend_Config_Ini用法分析
2016/03/23 PHP
php分页查询的简单实现代码
2017/03/14 PHP
PHP中Static(静态)关键字功能与用法实例分析
2019/04/05 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
2019/04/15 PHP
农历与西历对照
2006/09/06 Javascript
JavaScript 创建对象和构造类实现代码
2009/07/30 Javascript
JavaScript Math.floor方法(对数值向下取整)
2015/01/09 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
2016/09/26 Javascript
Javascript中常用类型的格式化方法小结
2016/12/26 Javascript
详细分析单线程JS执行问题
2017/11/22 Javascript
分析javascript原型及原型链
2018/03/18 Javascript
node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)
2019/04/10 Javascript
ES6知识点整理之函数对象参数默认值及其解构应用示例
2019/04/17 Javascript
node中IO以及定时器优先级详解
2019/05/10 Javascript
Vue.js实现可编辑的表格
2019/12/11 Javascript
Vue 构造选项 - 进阶使用说明
2020/08/14 Javascript
前端如何实现动画过渡效果
2021/02/05 Javascript
Vue中使用wangeditor富文本编辑的问题
2021/02/07 Vue.js
sublime text 3配置使用python操作方法
2017/06/11 Python
python tensorflow学习之识别单张图片的实现的示例
2018/02/09 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
python实现经纬度采样的示例代码
2020/12/10 Python
详解Python遍历列表时删除元素的正确做法
2021/01/07 Python
HTML5移动开发图片压缩上传功能
2016/11/09 HTML / CSS
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
YOOX台湾:意大利奢侈品电商
2018/10/13 全球购物
香港演唱会订票网站:StubHub香港
2019/10/10 全球购物
美国沙龙美发产品购物网站:Hair.com by L’Oreal
2020/11/09 全球购物
PHP命令行与定时任务
2021/04/01 PHP
教你使用Pandas直接核算Excel中快递费用
2021/05/12 Python
springmvc直接不经过controller访问WEB-INF中的页面问题
2022/02/24 Java/Android
Android studio 简单计算器的编写
2022/05/20 Java/Android
css弧边选项卡的项目实践
2023/05/07 HTML / CSS