碎碎念

上一篇文章,我们介绍了如何构建一个 react 插件,今天我们说说如何构建 vue 插件

准备工作

由于与上一篇 react 插件文章使用的是相同的结构,代码测试、持续集成及发布 npm 包也都是一个套路,这里就不再敖述。 下面主要说下不同的地方,let's start ?

  1. 开发依赖包
{"devDependencies": {"@babel/core": "^7.0.0","@babel/preset-env": "^7.0.0","babel-loader": "^8.0.2","chai": "^4.2.0","coveralls": "^3.0.2","css-loader": "^1.0.0","jest": "^23.6.0","style-loader": "^0.23.1","vue": "^2.5.21","vue-loader": "^15.5.0", // 解析 SFC 文件"vue-style-loader": "^4.1.2","vue-template-compiler": "^2.5.21", // vue-loader 的同步依赖 "webpack": "^4.17.2","webpack-cli": "^3.1.0"},
}
复制代码
  1. webpack 配置
const path = require('path');
const { VueLoaderPlugin } = require("vue-loader");module.exports = {mode: "production", // 生产模式entry: { // 入口"YanProgress": path.resolve(__dirname, './src/index.js')},output: { // 出口path: path.resolve(__dirname, './dist'),filename: '[name].min.js',publicPath: "./dist/",libraryTarget: 'umd', // 按 UMD 模式打包},module: {rules: [{test: /\.vue$/,loader: 'vue-loader',options: {// 模板编译过程中,编译器可以将某些特性转换为 require 调用transformAssetUrls: {video: ['src', 'poster'],source: 'src',img: 'src',image: 'xlink:href' // SVG}},// 只命中src目录里的js文件,加快 Webpack 搜索速度include: path.resolve(__dirname, "./src"),},{test: /\.js$/,use: [{loader: 'babel-loader',options: {presets: ['@babel/preset-env']}},],// 只命中src目录里的js文件,加快 Webpack 搜索速度include: path.resolve(__dirname, "./src/"),},{test: /\.css$/,loader: "style-loader!css-loader"}]},plugins: [// vue-loader **这个插件是必须的!**它的职责是将你定义过的其它规则复制并应用到 .vue 文件里相应语言的块。new VueLoaderPlugin],resolve: { // 省略文件后缀时,默认按下面的配置取extensions: ['.js', '.vue'],},externals: { // 不把 vue 打包进去vue: 'vue',}
};
复制代码

编写插件

写 vue 插件稍微复杂一点 ?,根据官网的案例,我们需要提供一个包含 install 方法的对象或者一个函数(传送门),供 Vue.use 调用注册你的插件

  • 写法一
import Component from './YanProgress.vue'; // 这个就是你平时写的 SFC 组件// 这里要导出一个包含 install 方法的对象
let plugin = { // 这里要导出一个 install 方法install(Vue,options) { // 这里写你的代码,你可以全局注册组件,也可以写全局指令,也可以扩展 Vue 的方法// 1. 全局组件Vue.component('yan-progress',Component); // 2. 全局方法或属性Vue.myGlobalMethod = function () {// 逻辑...}// 3. 全局指令Vue.directive('my-directive', {bind (el, binding, vnode, oldVnode) {// 逻辑...}})// 4. 注入组件Vue.mixin({created: function () {// 逻辑...}})// 5. 添加实例方法Vue.prototype.$myMethod = function (methodOptions) {// 逻辑...}}
};if (window && window.Vue) { // 如果是渐进式开发(script 引入简单粗暴的开发方式),需要自动注册你的插件window.Vue.use(plugin);
}export default plugin;复制代码
  • 写法二
import Component from './YanProgress.vue'; // 这个就是你平时写的 SFC 组件// 或者这里也可以写成函数
function plugin(Vue,options) { // 这里写你的代码,你可以全局注册组件,也可以写全局指令,也可以扩展 Vue 的方法Vue.component('yan-progress',Component); }
};if (window && window.Vue) { // 如果是渐进式开发(script 引入简单粗暴的开发方式),需要自动注册你的插件window.Vue.use(plugin);
}export default plugin;
复制代码

这样写的原因是,下面源码伺候?

export function initUse (Vue: GlobalAPI) {Vue.use = function (plugin: Function | Object) { // 在这里哦,可以传对象,也可以传函数const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))if (installedPlugins.indexOf(plugin) > -1) { // 避免重复注册插件return this}// additional parametersconst args = toArray(arguments, 1)args.unshift(this)if (typeof plugin.install === 'function') { // 如果是带有 install 方法的对象plugin.install.apply(plugin, args) // 不改变插件的 this(这里的 this 还是指向插件对象本身)} else if (typeof plugin === 'function') { // 如果是函数plugin.apply(null, args) // 不改变插件的 this(这里应该是指向window,在浏览器非严格模式下)}installedPlugins.push(plugin)return this}
}
复制代码

开源贡献

拥抱开源,这样才能让社区,乃至行业发展更有动力,哎,似曾相识的赶脚,?

注:例如,你的 star 是对我最大的鼓励,是支持我继续开源的动力,?

  • awesome-vue 社区 awesome-vue
  • 其他社区,可以到 Github 探索

完结撒花?

? 再次欢迎大家一起和我搞 ji 由(Github)?

  • 项目地址 github.com/Yangfan2016…
  • 博客原文 yangfan2016.github.io
  • react-yan-progress github.com/Yangfan2016…
  • vue-yan-progress github.com/Yangfan2016…

手牵手教你写 Vue 插件相关推荐

  1. 手牵手教你写代码,从入门到精通

    如果说到什么是好代码,我们肯定都能说出一堆规则,例如使用一致的格式和缩进.使用清晰的变量名和方法名.在必要时提供文档与注释.不要过度精简代码等等. 但是对于什么是烂代码,你有比较清晰的认识吗? 在 G ...

  2. 手牵手教Docker部署Springboot+vue ,全过程十分详细,轻松完成项目部署(简单,高效,通用)

    手把手教Docker部署Springboot+vue ,详细全过程,轻松完成项目部署(简单,高效) 上线前准备 腾讯云的服务器,服务器安装好docker 和docker-compose 最好事先了解技 ...

  3. 手牵手系列之搭建Vue+Electron项目

    https://blog.csdn.net/weixin_41549915/article/details/110931264 前言 electron:使用 JavaScript,HTML 和 CSS ...

  4. 手牵手教你使用ngComponentOutlet创建一个支持自定义插入子组件的angular公共搜索表单组件

    目录 雏形 主体 逻辑完善 使用公共表单组件 总结 最后 这几天笔者所接手的angular项目需要重新封装一个公共表单组件,由于之前封装的表单组件自由度不够,每出现一种新的类型的特殊输入框就需要在公共 ...

  5. Vue 源码之手写Vue Router

    Vue 源码之手写Vue Router 源码地址:https://github.com/CONOR007/Handwritten-routing 一.Vue Router的两种模式 hash模式实现原 ...

  6. vue filter对象_学习vue源码(3) 手写Vue.directive、Vue.filter、Vue.component方法

    一.Vue.directive Vue.directive(id,[definition]); 1)参数 { string } id{ Function | Object } [ definition ...

  7. web 前端签名插件_手写签名插件—jSignature

    jSignature 是一个通过捕捉笔画的矢量轮廓输出多种格式数据的jQuery插件,通过该插件我们可以实现绘画板.手写签名等功能. 使用该插件需要引入 jQuery 和jSignature.js,首 ...

  8. 手摸手带你用实现vue全屏loading插件

    手摸手带你用实现vue全屏loading插件 前言: 由于我们打开网页时,浏览器与服务器交互需要时间,受限于宽带以及服务器性能,导致用户在访问一个网页时,往往需要一个等待期,才能在浏览器中真正完全展示 ...

  9. 页面手写签名插件 jSignature.min.js 使用实例

    页面手写签名插件 jSignature.min.js 使用实例 jSignature.min.js 插件下载 页面使用demo <!DOCTYPE html> <html xmlns ...

最新文章

  1. SVN linux 服务器端配置
  2. jquery json 判断用户是否已注册
  3. tenserflow.js 环境搭建
  4. js实现给html固定区域增加水印
  5. 中石油训练赛 - Faulhaber’s Triangle(打表)
  6. Azure DevOps+Docker+Asp.NET Core 实现CI/CD(一 .简介与创建自己的代理池)
  7. es6 属性的可枚举性和遍历
  8. abs和pc混在一起怎么解决_PC、ABS常见的7大问题及解决方案
  9. Android Studio eclipse 调试技巧
  10. 类加载过程(时机)略解
  11. [Toolkit]最新Silverlight Toolkit中的DragDrop支持
  12. html网页中获取vf数据到mysql_怎样从HTML网页中获取SQL数据库里的数据
  13. java上路系列之一
  14. Android数字签名机制和应用场景
  15. 智慧环境应急平台建设方案
  16. The7强大多功能模板Var9.16.0+基于WordPress
  17. 基于图神经网络的图像分类,遥感图像分析
  18. 使用uniapp实现全局悬浮按钮(可拖动)
  19. opencv的imwrite设置图片压缩率
  20. bash: ./xx: Permission denied解决方法

热门文章

  1. linux下的权限粘滞位
  2. 深圳新生儿出生入户办理流程 - 父深圳公司集体户 母内地户口
  3. mysql语句计算距离_mysql查询中的距离计算
  4. 怎样取得sql服务器时间?
  5. python中导入模块是用哪个关键字_python中导入模块的关键字是什么_后端开发
  6. 无法远程访问工作组计算机,如何在另一个工作组计算机上进行远程调试?
  7. ENSP | ipv6网络配置,需要配置VLAN技术,实现隔离各部门间PC的通信,仅允许部门内部相互通信。
  8. 银河麒麟+FT2000源码安装Qt
  9. 目前主要的计算机汉字输入方法是什么,计算机汉字输入方法专利_专利申请于2001-03-28_专利查询 - 天眼查...
  10. 判断奇偶性。输入一个整数n,判断n是奇函数还是偶数,若为奇函数输出“奇数”,若为偶函数输出“偶数”