之前一直在分享低代码和可视化的文章,其中涉及到很多有趣的知识点和设计思路。今天继续给大家分享一个很有趣也很实用的前端实战项目——从零开始实现一个基于react+canvas的滑动验证码,并发布到npm上供大家使用。当然,如果你更喜欢vue开发方式,也不用担心,本文的设计思路和思路是通用的。如果你想学习如何打包vue组件并发布到npm上,也可以参考我之前的文章:从零到一教你开发基于vue的组件库。从这个实际项目中,我们可以学到以下知识点:前端组件设计的基本思想和技巧Canvas基础知识和ReactHooks的使用滑动验证码的基础知识和使用基本设计原则如何封装一个可扩展的滑动验证码component如何使用dumi构建组件文档如何发布你的第一个npm组件包如果你对以上任何一个知识点感兴趣,相信本文会对你有所启发。效果演示滑动验证组件的基本用法和技术实现上图是滑动验证组件实现的效果演示。当然还有很多配置项可以选择,支持更多的自定义场景。下面我先介绍一下如何安装和使用这个验证码插件,让大家有个直观的体验,然后再详细介绍一下滑动验证码的实现思路。如果有一定的技术基础,也可以直接跳转到技术实现部分。基本使用因为我已经在npm上发布了react-slider-vertify组件,大家可以按如下方式安装使用:1.安装#oryarnadd@alex_xu/react-slider-vertifynpmi@alex_xu/react-slider-vertify-S2。使用importReactfrom'react';import{Vertify}from'@alex_xu/react-slider-vertify';exportdefault()=>{returnalert('成功')}onFail={()=>alert('失败')}onRefresh={()=>alert('刷新')}/>};通过以上两步我们就可以轻松的使用这个滑动验证码组件了,是不是很简单呢?当然我也暴露了很多可配置的属性,让大家对组件有更好的控制。参考如下:技术实现在做这个项目之前,我也学习了一些滑动验证码的知识和现有的技术方案,收获颇丰。下面我将用我的组件设计思路来介绍一下如何使用react来实现和封装滑动验证码组件。如果大家有更好的想法和建议,也可以随时在评论区反馈给我。1.组件设计的思路和技巧每个人都有自己的组件设计方式和风格,但最终的目的是让组件设计得更优雅。在这里我大致列举了优雅组件的设计指标:可读性(统一清晰的代码格式、完整的注释、清晰的代码结构、正确使用编程范式)易用性(完整的代码功能、不同场景良好的兼容、业务逻辑的覆盖)可重用性(代码可以被其他业务模块复用)可维护性(代码易于维护和扩展,具有一定的向下/向上兼容性)高性能是我自己设计组件时考虑的指标,大家可以参考。此外,我们需要在设计组件之前明确需求。以滑动验证码组件为例。我们需要知道它的使用场景(登录注册、活动、论坛、短信等高风险业务场景的人机验证服务)和需求。(交互逻辑,如何验证,需要暴露哪些属性)。以上是我整理的一个通用的组件开发需求。在开发具体组件之前,如果遇到复杂的业务逻辑,我们也可以把每个实现步骤都列出来,然后一一实现,这样有助于理清思路。和更高效的发展。2.滑动验证码的基本实现原理介绍完组件设计思路和需求分析,我们来看看滑动验证码的实现原理。我们都知道设计验证码的主要目的是防止机器非法暴力入侵我们的应用。要解决的核心问题是确定谁在操作应用程序(人还是机器),因此通常的解决方案是随机识别。在上图中,我们可以看到,只有用户手动将滑块拖动到相应的镂空区域,才能验证成功。镂空区域的位置是随机的(随机性测试暂时在前端实现,比较安全的方式是通过后端返回位置和图片)。基于以上分析,我们可以画出一个基本的滑动验证码设计示意图:接下来,我们将把这个可扩展的滑动验证码组件封装在一起。3、封装一个可扩展的滑动验证码组件。按照我一贯的开发组件的风格,我会先根据需求写出组件的基础框架:importReact,{useRef,useState,useEffect,ReactNode}from'react';interfaceIVertifyProp{/***@descriptioncanvaswidth*@default320*/width:number,/***@descriptioncanvasheight*@default160*/height:number,/***@description滑块边长*@default42*/l:number,/***@description滑块半径*@default9*/r:number,/***@descriptionisvisible*@defaulttrue*/visible:boolean,/***@descriptionslidertext*@defaultrightSlidetofillthepuzzle*/text:string|ReactNode,/***@description刷新按钮图标为图标的url地址*@default-*/refreshIcon:string,/***@description用于获取随机图片的url地址*@defaulthttps://picsum.photos/${id}/${width}/${height},详见https://picsum.photos/,只需要实现一个类似的接口即可*/imgUrl:string,/***@description验证成功回调*@default():void=>{}*/onSuccess:VoidFunction,/***@description验证失败回调*@default():void=>{}*/onFail:VoidFunction,/***@description回调*@default():void=>{}*/onRefresh:VoidFunction}exportdefault({width=320,height=160,l=42,r=9,imgUrl,text,refreshIcon='http://yourimgsite/icon.png',visible=true,onSuccess,onFail,onRefresh}:IVertifyProp)=>{return