手摸手教你制作自己的vue插件

832 阅读4分钟

  在即时聊天中经常会发送emoji表情,本次就以在git上一个现成的vue插件例子来给大家一步一步讲解如何用一个调试好的vue组件来制作插件,再上传到npm官网提供给大家下载使用。本次讲解主要目的是讲清楚vue插件的创建步骤,所以涉及到业务处理的地方会尽量简洁。

  git地址:github.com/DCzajkowski…

1.首先安装vue-cli,通过vue create vue-emoji-input初始化一个vue项目。components文件夹下初始化想要创建的组件,目录结构如下:

在emoji-pick文件夹中,简化了emoji表情选择器的实现,实现效果如图:

  我们可以点击emoji按钮来触发表情选择面板。点击表情后,会自动添加到输入框中。模版中首先是触发按钮的一个具名插槽,可以控制表情面板的显示。下边就是从插件的库文件夹lib引入emojis表情,再把emoji表情逐个渲染到表情面板上,可以通过panelWidth等props参数来控制面板的宽高位置。

<template>
  <div style="position:relative;display:inline-block;">
    <slot
      name="emoji-invoker"
      :events="{ click: (e) => toggle(e) }">
    </slot>
    <div
      v-if="display.visible"
      v-click-outside="hide">
      <div class="emojipanel" :style="`width:${panelWidth}px;height:${panelHeight}px;bottom:${posBottom}px;left:${posLeft}px`">
        <span
          v-for="(emoji, emojiName) in emojis"
          :key="emojiName"
          :title="emojiName"
          style="margin:0 4px 0 0;font-size: 18px;"
          @click="insert(emoji)"
        >{{ emoji }}</span>
      </div>
    </div>
  </div>
</template>

当点击表情的时候,会触发insert方法,冒泡到父组件中。

insert(emoji) {
    this.$emit('emoji', emoji)
}

在app根节点中引入子组件,在父组件中通过insert方法来为输入框中追加emoji表情:

2.在调试好了组件以后,在组件文件夹中添加vue插件的注册方法。vue的插件是用一个类来定义的,其中有一个函数名为install的方法专门为vue提供插件注册的功能:

import EmojiPicker from './EmojiPicker.vue'

const EmojiPickerPlugin = {
  install(Vue, options = {}) {
    Vue.component('emoji-picker', EmojiPicker)
  },
}

export default EmojiPickerPlugin

3.通过webpack对插件进行打包,并且解析ES6语法。 首先在组件的文件夹中初始化node项目:

npm init

然后安装打包时用到的包:

npm install --save-dev webpack-cli babel-core babel-loader @babel/preset-env vue-loader css-loader

  此处一定要用--save-dev来安装开发时依赖,如果按照默认的安装了线上依赖,那么每次用户下载npm包的时候都会自动下载node_modules文件夹。

添加webpack打包配置文件如下:

var path = require('path')
const VueLoaderPlugin = require('vue-loader/lib/plugin');

module.exports = {
  entry: './main.js',
  output: {
    path: path.resolve(__dirname, './dist'),
    publicPath: '/dist/',
    filename: 'main.js',
    library: 'es6Module',
    libraryTarget: 'umd'
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader'
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/,
        options: {
          presets: ["@babel/preset-env"]
        }
      },
      {
        test: /\.css$/,use: ["vue-style-loader""css-loader"]
      }
    ]
  },
  resolve: {
    alias: {
      'vue$''vue/dist/vue.esm.js'
    }
  },
  devServer: {
    historyApiFallback: true,
    noInfo: true
  },
  performance: {
    hints: false
  },
  devtool: '#source-map',
  plugins:[
    new VueLoaderPlugin()
  ]
}

  entry: './main.js'是刚才添加的组件入口文件。output配置的是打完包的文件的目录和入口文件,入口文件为dist/main.js。 在package.json文件中,通过main配置项来配置import引入到项目后的入口,即dist/main.js。

{
  "name""emoji-pick",
  "version""1.0.0",
  "description""a emoji picker",
  "main""dist/main.js",
  "directories": {
    "lib""lib"
  },
  "scripts": {
    "test""echo \"Error: no test specified\" && exit 1",
    "build""webpack --progress --hide-modules"
  },
  "keywords": [
    "emoji",
    "input"
  ],
  "author""yang",
  "license""MIT",
  " devDependencies": {
    "@babel/preset-env""^7.6.2",
    "babel-core""^6.26.3",
    "babel-loader""^8.0.6",
    "css-loader""^3.2.0",
    "vue-loader""^15.7.1",
    "webpack-cli""^3.3.9"
  }
}

现在执行打包命令:

npm run build

即可生成打包文件夹dist。

4.添加类型声明

之后需要在插件文件夹中建立"@types"文件夹,新建"index.d.ts"文件,输入:

declare module '组件名';

来进行组件声明,不然引用的时候会报错。

5.生成了打包文件夹以后,我们就可以上传到npm代码仓库中了 先在网站上注册账号https://www.npmjs.com (邮箱验证,注册的时候记得邮箱最好填写QQ邮箱,不然不会通过) 在组件文件夹中执行如下命令:
(1)npm adduser
(2)然后要求输入用户名、密码、注册时填的邮箱。
(3)然后输入npm publish即可(发布成功有邮件通知,每次更改package.json的version版本号)
如果publish的时候返回错误" You do not have permission to publish "可能是因为组件名已经被占用了,到npm官网检查一下,换个没用过的组件名。并且将package-lock、类型声明文件index.d.ts、main.js文件全都换成新的插件名。

6.之后就可以通过npm install "插件name" 来安装vue插件了

全局注册:

import { EmojiPicker } from '插件名'
Vue.use(EmojiPicker)

在组件中可以直接通过main.js文件中注册的插件名,作为template中的标签名来使用。

还可以通过vue-cli的命令直接打包,不用webpack。 大家感兴趣可以再研究下这个命令:vue-cli-service build --target lib --name myLib [entry]

目前组件已经上传到npm,名字为emoji-pick-test,大家感兴趣可以下载下来在node_modules中看下源码。

如果您对本文感兴趣想关注更多技术文章,请关注作者公众号,更多好文章为您呈现~