一 第三方JavaScript库

前言
.vue文件 中不解析 script标签引入js文件,只能用 import 引入
有两种用法:
1.import a from ‘…/a’
2.import ‘…/a’
区别在于第一个你要用到export导出之后 才能用import导入。
第二个是直接引入 和script标签是一样的. 但是它作用在自己的js文件中。

在使用vue做项目的时候,我们一般不将css样式写到各自的组件里,这样不仅会让代码冗余,而且不美观整洁。如果你定义了一些外部css文件,如何引入到vue组件中去呢?我们这里使用ES6的引入方式:

<template></template>
<style scoped>@import "../assets/common/common.css";
</style>

那么JS文件如何引入呢?如果需要全局使用,则可以在main.js中引用并实例化对象:

部分js代码:

const DEBUG = true;
let BASE_URL = DEBUG ? 'url' : '';
const API = {//网关设备管理'edgeManager':{'deviceList':BASE_URL + '/devicemanager/device/list.do',//网关设备列表'deviceDelete':BASE_URL + '/devicemanager/device/delete.do'//网关设备删除}
}
export default API;

在main.js中:

import API from './assets/api/api.config.js'
Vue.prototype.$API = API;

这样,我们在vue组件中使用this.$API就可以找到这个js文件中的对象了。
如:this.$API.edgeManager.deviceList

如果需要按需引入,不在main.js中引入,直接在有需要的vue组件中引入:

部分代码:

<template></template>
<script>
import API from '../../assets/api/api.config.js'
</script>

这样引入的话,我们在当前组件可以直接使用API去找到这个js文件中的对象。
如:API.edgeManager.deviceList

需要注意的是,第二种方式按需引入的js文件在其他组件中是找不到这个对象的。

在Vue.js应用中,可能需要引入Lodash,Moment,Axios,Async等非常好用的JavaScript库。

当项目变得复杂庞大,通常会将代码进行模块化拆分。可能还需要跑在不同的环境下,比如浏览器,服务端。
如何在各个模块和组件文件中引入需要的库呢? 找到一种简单靠谱的方式,可以省去很多的麻烦。

----------------错误示范----------------

全局变量法

最不靠谱的方式就是将导入的库挂在全部变量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库引入:
entry.js

import moment from 'moment';
Object.defineProperty(Vue.prototype, '$moment', { value: moment });

由于所有的组件都会继承Vue原型对象上的方法,因此这些方法在任何组件文件中都能通过this.$moment访问到:
MyNewComponent.vue

export default {created() {console.log('The time is ' . this.$moment().format("HH:mm"));}
}

我们来仔细看一下其中的原理。

Object.defineProperty

通常我们会如下设置对象属性:

Vue.prototype.$moment = moment;

你也可以这么做,但是Object.defineProperty允许我们用属性描述器来定义我们的属性。我们可以定义该属性是否可写,可枚举,可配置。
一般情况下,我们不需要用那么复杂的方式来赋值属性。但这里用它有个好处:用属性描述器定义的属性是默认只读的。
这能防止那些脑子不清醒的开发者犯下一些低级错误:

this.$http = 'Assign some random thing to the instance method';
this.$http.get('/'); // TypeError: this.$http.get is not a function

Object.defineProperty能保护引入的库不被重新赋值,如果你尝试重写,程序会抛出“TypeError: Cannot assign to read only property”的错误。

$

可能你注意到,我们用“$”开头的属性来存放引入的库。当然,你应该记得还有其他的一些属性也是这样的,比如$refs, $on, $mount。
这种做法不是强制的,这个前缀就是为了提醒某些昏昏沉沉的开发者,这些属性是公有的,你可以在任何地方使用。反之,某些属性只能在Vue内部使用。

作为一门以原型为基本的语言,JavaScript中并没有真正的类,所以也就没有所谓的公有,私有变量,或者静态方法。上面这种约定,我觉得是种不错的选择。

this

现在你能用this.$libraryName的方式来访问你需要的库了。但,你得保证this的指向。如果你在回调函数中使用this,通常这个this不再指向Vue实例。
箭头函数是解决这个问题的好方法。

this.$http.get('/').then(res => {if (res.status !== 200) {this.$http.get('/') // etc// Only works in a fat arrow callback.}
});

二 如何创建自己的Vue插件

如果你在项目的很多地方都用了某个库,或者你希望全局可用,你可以构建自己的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方法中引入多个需要的库。

Vue引入第三方JavaScript库和如何创建自己的Vue插件相关推荐

  1. Vue引入第三方js库

    情况一:无法通过npm install安装包引入 方法一:在index.html中引用script 直接在index.html中引用script,任何时候皆可用!! 注意:第三方js必须放在stati ...

  2. php引入外部js,vue.js怎么引入外部js,vue引入第三方js库

    vue.js怎么引入外部js·怎么介绍外部js,在vue.js中引入外部js的方法如下:1.使用外部文件[config.js],代码为[函数格式XML(text){ return text }]:2. ...

  3. Vue 引入第三方图标库

    我的项目是Vue+element,由于这个element中的图标比较少,所以咋们引入阿里云的图标 阿里云图标库地址:https://www.iconfont.cn/home/index 首先你要有个阿 ...

  4. html中如何引入vue,vue.js怎样引入到HTML中,vue引入第三方js库

    vue.js怎样引入到HTML中如何将vue.js引入HTML,把vue.js引入HTML的方法:一.下载vue . js:然后在HTML中添加vue.js包,其语法为"script src ...

  5. vue引入第三方js的方案 报错

    vue引入第三方js的方案 报错< 问题描述 vue项目中引用一个外部js包 npm中没有响应的js下载 所以只能通过外部引用 使用方法如下: 1.首先是第三方js包存放的位置 一定要放在 st ...

  6. vue+element-ui项目引入第三方图标库:阿里巴巴矢量图标库(问题:小方框)

    因为element-ui内置的小图标非常有限,所以有时候,我们需要自定义或引入第三方图标库. 先介绍下阿里巴巴矢量图标库iconfont: 这个截图只显示了第一行的图标库,还有很多. 也许,我们需要的 ...

  7. uniapp微信小程序引入第三方字体库

    前言 最近在使用第三方字体库,然后发现使用uniapp做小程序时引入第三方字体库有着挺多坑,收集了一些网上的资料,我大概整理下,防止以后继续踩坑 这是uniapp官网的引入字体图标方法 字体引入 从c ...

  8. 引入第三方图标库,并在前台罗列图标

    目前在项目中引入一个第三方矢量图标库已经成为了非常常见的需求.这是因为矢量图不仅体积小,而且在放大时不会失真,颜色也可以轻松修改.相比于传统的方式去加载大量的图片(假设你没有用"雪碧图&qu ...

  9. Swift 引入第三方字体库

    引入第三方字体库 为了达到好的效果展现,我们往往会引入第三方字体库,以使我们工程中的字体展示达到最佳,这方面可能对于阅读之类的APP会用到的更多. 在这里也是随便从网上下载的一个字体,名为经典隶书变体 ...

最新文章

  1. Android点击图标重新启动问题
  2. Servlet接口中有哪些方法?
  3. 文本编辑器中实现自定义编辑框中字体和大小的功能
  4. 实时音频抗弱网技术揭秘
  5. ASP.NET Core微服务(二)——【ASP.NET Core Swagger配置】
  6. 手机还是不要随便更新的好
  7. 生化危机5 / BIOHAZARD5 简直就是一款完美的印钞机?(+2009.4.9)
  8. hibernateTemplate update 修改指定字段
  9. 20 万台 QQ 服务器全面上云!
  10. Pycharm community配置Django
  11. Jboss4.2.3.GA运行后war包解压在哪
  12. php判断搜索为空,【杂谈】PHP怎么判断变量是否为空和是否有值存在?(图文+视频教程)...
  13. 测试er如何通过MacOS连接IOS系统iPhone查看系统崩溃日志?
  14. 1、查询姓名中包含‘u’字母的员工记录2、同名去重3、字段计算
  15. 新用户注册之验证码短信、语音解决方案
  16. win7命令启动计算机管理,关于Win7中运行的命令
  17. python 安装module
  18. Python使用zlib对数据进行简单压缩处理
  19. 扔掉你的鼠标,VIM及Vimium吐血推荐
  20. SpingBoot yml语法及测试总结yml文件常用的五种方式

热门文章

  1. python删除某列数据_python删除txt第一列数据库
  2. 在Adobe Illustrator中创建太阳系行星图标包
  3. CPU底层那些事(goto的优势)
  4. Linux下驱动SD/MMC读卡器(转)
  5. 文字与图片渐变效果(图层CALayer与属性蒙版mask )
  6. 有感于湖南卫视在宁波消失
  7. NORDFLASH与NANDFLASH的区别及选型
  8. 2016天天飞车服务器维护,腾讯《天天飞车》游戏将停服:12月15日关闭服务器
  9. Oracle 12c 新特性之: ILM 数据生命周期管理
  10. 转载:首都医科大学校长饶毅实名举报3人学术论文造假