如何构建一个Vue插件并生成npm包


Posted in Javascript onOctober 26, 2020

    vue的插件一般用来添加全局性的功能,具体可分为:

  1. 添加全局方法或者属性;
  2. 添加全局资源(指令、过滤器等);
  3. 通过全局 mixin 方法添加一些组件选项;
  4. 在 Vue.prototype 上 添加 Vue 实例方法;
  5. 创建一个库,提供自己的 API,同时提供上面提到的一个或多个功能;    

一般来说我们在项目中倾向于第五种方式,可以通过创建一个js文件包含我们需要添加的多种全局性功能,指令、过滤器、实例方法之类的。这样的一个插件的构建也不难,主要就是使用vue提供的install 方法,传入Vue构造器以及你所能用到的参数对象;添加对应的功能,export出去,在需要的地方引入并Vue.use()方法注册即可;具体使用参考vue官网插件部分——开发插件。

    这一次我的项目中需要添加‘反爬'功能,具体实现就是后端在检测到用户触发‘反爬'规则后返回指定错误码以及对应的验证页面,前端在全局请求中监测该错误码,在检测到错误码后通过插件加载验证页面让用户去验证,并将验证结果反馈给后端,在后端收到验证结果后移除验证页面。

     需求确定后,我们就知道这个插件需要做的事情就是创建一个vue组件实例=>加载后端返回的页面=>解析并执行其中的js文件=>注册验证成功的全局回调函数。具体操作如下:

const antiReptilian = {
 install(Vue, options) {
  Vue.$antirept = checkText => {
   if (!checkText) return;
   let wrapperTemp = Vue.extend({
    // 1、创建构造器,定义模板
    template:
     '<div id="antiReptWrapper" style="z-index:9999 !important;"></div>'
   });
   let antiObj = new wrapperTemp().$mount().$el; // 2、创建实例
   antiObj.innerHTML = checkText;
   initScripts(antiObj);//3、解析并顺序执行js
   let App = document.getElementById('app');
   let wrapper = document.getElementById('antiReptWrapper');
   if (wrapper) {
    return;
   }
   App.appendChild(antiObj); // 4、把创建的实例添加到App中
   window.checkSucceed = res => {
    // 5、验证通过后移除实例
    App.removeChild(antiObj);
    window.location.reload();
   };
  };
 }
};

    需要注意的是通过设置innerHTML 的方式加载验证页面会导致内部的js文件不执行;因此我们还必须将验证页面的的js文件提取出来再重新插入,并且还要保证内部多个js文件的执行顺序,具体代码如下:

//重新引入js文件
const initScripts = function(cont) {
 let oldScripts = cont.getElementsByTagName('script');
 let newScripts = [];
 for (let i = 0; i < oldScripts.length; i++) {//提取内部js文件
  let newScript = document.createElement('script');
  newScript.type = 'text/javascript';
  newScript.innerHTML = oldScripts[i].innerHTML;
  if (oldScripts[i].src) {
   newScript.src = oldScripts[i].src;
  }
  newScripts.push(newScript);
 }
 while (oldScripts.length !== 0) {
  cont.removeChild(oldScripts[0]);//移除之前的js文件
 }
 for (let i = 0; i < newScripts.length; i++) {
  if (i == 0) {
   cont.appendChild(newScripts[i]);
  } else {//保证每个js文件按照之前的顺序执行
   newScripts[i - 1].onload = newScripts[
    i - 1
   ].onreadystatechange = function(event) {
    cont.appendChild(newScripts[i]);
   };
  }
 }
};

    到此为止这个简单的插件功能就完成了,在需要的地方引入、注册并调用Vue.$antirept()方法传入要加载的页面即可;

    将写好的插件生成npm包的方法也简单,分为以下几步:

1、前往npm官网注册一个npm账号=>【npm官网】;

2、将写好的插件生成一个简单的npm包:

  • 创建一个空文件夹,名称即为你的npm包的名称,注意名称不要与现有的npm包重复;
  • 切到该文件夹下,输入‘npm init'命令生成一个package.json文件,内部信息自定义;
  • 将写好的插件js文件拷到该文件夹下,重命名为index.js;
  • 在根目录下创建README.md文件,添加关于包的介绍信息(非必需);

3、发布创建好的包:

1. 若第一次发布包,执行‘ npm adduser'命令,输入前面注册好的npm账号,密码和邮箱;
2. 若不是第一次发布包,执行‘ npm login'命令进行登录,同样输入npm账号,密码和邮箱;
3.  登录成功以后,在刚才的文件夹下,执行‘npm publish'命令,即可发布该npm包;
4.  若要更新之前的包,只需要更改版本号,再执行‘npm publish'命令即可;

    至此一个简单的vue插件就生成了一个npm包了,以后使用就不需要加载js文件,可以直接通过npm的方式引入了,其它的小伙伴也可以一起愉快的玩耍了==>全剧终。

以上就是如何构建一个Vue插件并生成npm包的详细内容,更多关于vue生成npm包的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
javascript 面向对象全新理练之继承与多态
Dec 03 Javascript
为jQuery.Treeview添加右键菜单的实现代码
Oct 22 Javascript
jquery实现表格本地排序的方法
Mar 11 Javascript
PageSwitch插件实现100种不同图片切换效果
Jul 28 Javascript
基于jQuery实现收缩展开功能
Mar 18 Javascript
jQuery基本过滤选择器用法示例
Sep 09 Javascript
利用JS屏蔽页面中的Enter按键提交表单的方法
Nov 25 Javascript
关于微信上网页图片点击全屏放大效果
Dec 19 Javascript
用 js 的 selection range 操作选择区域内容和图片
Apr 18 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
Aug 07 Javascript
全选复选框JavaScript编写小结(附代码)
Aug 16 Javascript
JavaScript动态生成表格的示例
Nov 02 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
Oct 26 #Javascript
vue实现前端列表多条件筛选
Oct 26 #Javascript
vue实现单一筛选、删除筛选条件
Oct 26 #Javascript
vue通过接口直接下载java生成好的Excel表格案例
Oct 26 #Javascript
基于elementUI竖向表格、和并列的案例
Oct 26 #Javascript
原生js实现贪吃蛇游戏
Oct 26 #Javascript
JavaScript实现五子棋小游戏
Oct 26 #Javascript
You might like
雄兵连三大错觉:凯莎没了,凉冰阵亡了,华烨觉得自己又行了
2020/04/09 国漫
异步加载技术实现当滚动条到最底部的瀑布流效果
2014/09/16 PHP
php实现根据url自动生成缩略图的方法
2014/09/23 PHP
从wamp到xampp的升级之路
2015/04/08 PHP
PHP编程快速实现数组去重的方法详解
2017/07/22 PHP
angular简介和其特点介绍
2015/01/29 Javascript
jQuery简单自定义图片轮播插件及用法示例
2016/11/21 Javascript
jQuery向webApi提交post json数据
2017/01/16 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
2017/09/28 Javascript
JS设计模式之访问者模式定义与用法分析
2018/02/05 Javascript
VUE-Table上绑定Input通过render实现双向绑定数据的示例
2018/08/27 Javascript
vue的keep-alive用法技巧
2019/08/15 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
2020/11/17 Javascript
[05:42]DOTA2英雄梦之声_第10期_蝙蝠骑士
2014/06/21 DOTA
[01:59][TI9趣味视频] 全明星赛奖励
2019/08/23 DOTA
Python使用django搭建web开发环境
2017/06/09 Python
对python中的xlsxwriter库简单分析
2018/05/04 Python
python2与python3爬虫中get与post对比解析
2019/09/18 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
2020/01/10 Python
django2.2 和 PyMySQL版本兼容问题
2020/02/17 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
2020/06/11 Python
HTML5实现的震撼3D焦点图动画的示例代码
2019/09/26 HTML / CSS
HTML5自定义data-* data(obj)属性和jquery的data()方法的使用
2012/12/13 HTML / CSS
18-35岁旅游团的全球领导者:Contiki
2017/02/08 全球购物
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
MAC Cosmetics官方网站:魅可专业艺术彩妆
2019/04/10 全球购物
英语自我评价范文
2014/01/24 职场文书
2014年文学毕业生自我鉴定
2014/04/23 职场文书
市级文明单位申报材料
2014/05/07 职场文书
原料仓仓管员岗位职责
2014/07/08 职场文书
2014年社区卫生工作总结
2014/12/18 职场文书
住房公积金贷款工资证明
2015/06/12 职场文书
公务员学习中国梦心得体会
2016/01/05 职场文书
python四个坐标点对图片区域最小外接矩形进行裁剪
2021/06/04 Python
springboot项目以jar包运行的操作方法
2021/06/30 Java/Android
Meta增速拉垮,元宇宙难当重任
2022/04/29 数码科技