如何构建一个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 相关文章推荐
js中eval()函数和trim()去掉字符串左右空格应用
Feb 02 Javascript
js处理自己不能定义二维数组的方法详解
Mar 03 Javascript
利用try-catch判断变量是已声明未声明还是未赋值
Mar 12 Javascript
JQuery 在线引用及测试引用是否成功
Jun 24 Javascript
js获取域名的方法
Jan 27 Javascript
比例尺、缩略图、平移缩放之百度地图添加控件方法
Aug 03 Javascript
谈谈JavaScript自定义回调函数
Oct 18 Javascript
微信小程序图片轮播组件gallery slider使用方法详解
Jan 31 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
Sep 06 Javascript
让IDE识别webpack的别名alias的实现方法
May 06 Javascript
JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记
Jul 15 Javascript
处理canvas绘制图片模糊问题
May 11 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
PHP下的Oracle客户端扩展(OCI8)安装教程
2014/09/10 PHP
PHP SESSION机制的理解与实例
2019/03/22 PHP
js去字符串前后空格5种实现方法及比较
2013/04/03 Javascript
jQuery中.live()方法的用法深入解析
2013/12/30 Javascript
高性能JavaScript 重排与重绘(2)
2015/08/11 Javascript
向JavaScript的数组中添加元素的方法小结
2015/10/24 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
2016/11/01 Javascript
简单理解vue中实例属性vm.$els
2016/12/01 Javascript
angular select 默认值设置方法
2017/06/23 Javascript
JavaScript之underscore_动力节点Java学院整理
2017/07/03 Javascript
Vue应用部署到服务器的正确方式
2017/07/15 Javascript
给vue项目添加ESLint的详细步骤
2017/09/29 Javascript
jQuery实现的页面遮罩层功能示例【测试可用】
2017/10/14 jQuery
vue组件发布到npm简单步骤
2017/11/30 Javascript
结合Vue控制字符和字节的显示个数的示例
2018/05/17 Javascript
AngularJS实现的自定义过滤器简单示例
2019/02/02 Javascript
微信小程序基于picker实现级联菜单
2019/02/15 Javascript
win7 下搭建sublime的python开发环境的配置方法
2014/06/18 Python
Python获取电脑硬件信息及状态的实现方法
2014/08/29 Python
python实现梯度下降算法
2020/03/24 Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
2019/04/15 Python
python3实现猜数字游戏
2020/12/07 Python
Python 3.6打包成EXE可执行程序的实现
2019/10/18 Python
python 使用opencv 把视频分割成图片示例
2019/12/12 Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
2020/02/17 Python
Python实现在Windows平台修改文件属性
2020/03/05 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
python3 中使用urllib问题以及urllib详解
2020/08/03 Python
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
碧欧泉Biotherm加拿大官方网站:法国高端护肤品牌
2019/10/18 全球购物
奥巴马演讲稿
2014/01/08 职场文书
行政专员的岗位职责
2014/03/10 职场文书
汽车促销活动方案
2014/03/31 职场文书
2015年化工厂工作总结
2015/05/04 职场文书
2015小学教师德育工作总结
2015/05/12 职场文书
MySQL慢查询中的commit慢和binlog中慢事务的区别
2022/06/16 MySQL