插件通常会为 Vue 添加全局功能,常见的几种如下
下面是官网的示例:
Vue.js 的插件应该有一个公开方法 install。这个方法的第一个参数是 Vue 构造器,第二个参数是一个可选的选项对象:
MyPlugin.install = function (Vue, options) {
// 1. 添加全局方法或属性
Vue.myGlobalMethod = function () {
// 逻辑...
}
// 2. 添加全局资源
Vue.directive('my-directive', {
bind (el, binding, vnode, oldVnode) {
// 逻辑...
}
...
})
// 3. 注入组件
Vue.mixin({
created: function () {
// 逻辑...
}
...
})
// 4. 添加实例方法
Vue.prototype.$myMethod = function (methodOptions) {
// 逻辑...
}
}
通过全局方法 Vue.use() 使用插件。它需要在你调用 new Vue() 启动应用之前完成:
// 调用 `MyPlugin.install(Vue)`
Vue.use(MyPlugin)
new Vue({
//... options
})
也可以传入一个选项对象:
// 调用 `MyPlugin.install(Vue)`
Vue.use(MyPlugin, { someOption: true })
Vue.use 会自动阻止多次注册相同插件,届时只会注册一次该插件。
Vue.js 官方提供的一些插件 (例如 vue-router) 在检测到 Vue 是可访问的全局变量时会自动调用 Vue.use()。然而在例如 CommonJS 的模块环境中,你应该始终显式地调用 Vue.use():
// 用 Browserify 或 webpack 提供的 CommonJS 模块环境时
var Vue = require('vue')
var VueRouter = require('vue-router')
// 不要忘了调用此方法
Vue.use(VueRouter)
Vue.use()属于Vue的公共方法,initGlobalAPI(Vue)=》 initUse(Vue)
先贴一段源码:
import { toArray } from '../util/index'
export function initUse (Vue: GlobalAPI) {
Vue.use = function (plugin: Function | Object) {
// vue首先判断这个插件是否被注册过,不允许重复注册。
const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))
if (installedPlugins.indexOf(plugin) > -1) {
return this
}
// additional parameters
// 将类数组转换为数组形式,并且剔除传入的第一个参数,,。后续把Vue对象作为第一个参数传入
const args = toArray(arguments, 1)
args.unshift(this)
if (typeof plugin.install === 'function') {
plugin.install.apply(plugin, args)
} else if (typeof plugin === 'function') {
plugin.apply(null, args)
}
installedPlugins.push(plugin)
return this
}
}
结合和插件的调用方法
传入Vue.use(plugin)第一个参数plugin有两种情况
当然从源码上可以看出,也可以传入第二个参数,作为函数的参数如下的调用方法可以在install方法中获取参数
//将类数组转换为数组形式,并且剔除传入的第一个参数,,。后续把Vue对象作为第一个参数传入
const args = toArray(arguments, 1)
//将Vue实例传入args作为调用install方法中的第一个参数
args.unshift(this)
if (typeof plugin.install === 'function') {
plugin.install.apply(plugin, args)
} else if (typeof plugin === 'function') {
plugin.apply(null, args)
}
所以通常插件开发时,可以得到两个参数,一个是Vue实例对象,一个是传入的自定义参数。install(Vue , options)。
vue init webpack-simple yan-button
//yan-button.vue
<template>
<div>
<div class="button" @click="fn1">
click
</div>
</div>
</template>
<script>
export default {
name:"yanButton",
data(){
return {
}
},
props:['msg'],
methods:{
fn1(){
alert(this.msg)
}
}
}
</script>
<style>
.button{
height: 20px;
padding: 5px 20px;
color:#fff;
background: green;
border-radius: 15px;
display: inline-block;
}
</style>
然后在index.js中封装导出Vue.use()所需要的格式。里面调用了Vue.component()是全局注册组件的方法。当然在这里只是一个示范,也可以添加各种全局的属性方法,实例方法,指令等。
//index.js
import yanButton from '../src/components/yan-button.vue'
const install =function(Vue,options){
Vue.component(yanButton.name,yanButton)
}
export default install
封装好后就是在main.js中注册插件 ,以及在app.vue中的调动
//main.js
import Vue from 'vue'
import App from './App.vue'
import Plugin from './index.js'
Vue.use(Plugin)
new Vue({
el: '#app',
render: h => h(App)
})
//app.vue
<template>
<div id="app">
<yan-button msg="my npm Plugin"></yan-button>
</div>
</template>
<script>
export default {
name: 'app',
data () {
return {
msg: 'Welcome to Your Vue.js App'
}
}
}
</script>
module.exports = {
// entry: './src/main.js',
entry: './src/index.js',//修改打包入口文件
output: {
path: path.resolve(__dirname, './dist'),
publicPath: '/dist/',
// filename: 'build.js'
filename: 'yan-button.js',//修改打包输出文件
library: 'yanButton', //新增
libraryTarget: 'umd', //新增
umdNamedDefine: true //新增
},
...
}
.DS_Store
node_modules/
npm-debug.log
yarn-error.log
# Editor directories and files
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
1.如果没有npm账号就去官网注册一个
2. cmd登录npm账号 依次输入账户信息
npm login
3 进入刚才的项目目录
运行 npm publish 就开始进行上传你编写的插件了 。
撤销删除包的发布 npm unpublish 包名 --force
更多详细命令参考 【npm】利用npm安装/删除/发布/更新/撤销发布包
在新的Vue项目中,注意是新的(因为在原来的项目中是安装不成功的,因为包名和项目名是一样的)。
新的Vue项目中执行 npm i yan-button
然后在main.js中写入
import yanbutton from 'yan-button'
Vue.use(yanbutton)
//app.vue
<template>
<div id="app">
<img src="./assets/logo.png">
<yan-button msg="my npm Plugin"></yan-button>
<router-view/>
</div>
</template>
<script>
export default {
name: 'App',
data(){
return{
msg:'my npm plugin! '
}
}
}
</script>