当前位置: 首页 > 后端技术 > Node.js

从头开发一个健壮的npm包

时间:2023-04-03 17:46:53 Node.js

最近在写node的时候,遇到需要清理某个目录下超过3天的图片。想在npm上找个包直接拿来用,但是没找到合适的,于是决定自己pick一个。本文主要讲述如何从零开始开发一个完整健壮的npm包。主要涉及一些工具的使用和配置,包的功能不是重点。1、配置eslintESLint是一个代码风格检测工具,比如是否使用空格或制表符,是否加分号,是否使用驼峰命名或下划线等。它可以确保一个团队的编码风格是一致的。npminstalleslint-geslintinit将eslint提供的选项与您自己的需求相结合。一路选择之后,会在根目录下创建一个.eslintrc.json文件,里面包含了一系列的规则配置。这时候你就可以重新写代码了。如果不符合需求规范,编辑器会报错,如果有些目录不想使用校验,可以创建一个.eslintignore,把不需要校验的目录放进去。为了方便验证,我们在package.json中配置脚本:"scripts":{"lint":"eslint--fixsrc"}可以配合github每次提交时强制验证码:使用githook做eslint验证2.写代码我们把我们的代码写在src目录下,拆分成具体的步骤读取目录下的所有文件,过滤掉我们需要处理的文件,比如创建或修改图片或者日志删除等已创建或修改超过3天我们将这些文件分为3个函数://readAllFileInfo.js//使用fs.readdir读取目录中的所有文件fs.readdir(filePath,function(err,files){if(err){reject(err);}else{Promise.all(files.map(file=>{returnfilterFile(file,options);})).then(deleteFiles=>{resolve(deleteFiles.filter(deleteFile=>deleteFile));});}});//filterFile.js//使用fs.stat读取文件信息,然后过滤掉需要删除的文件fs.stat(fileName,(err,stats)=>{如果(错误){拒绝(错误);}else{consttime=stats[expiredType];constdistanceTime=formatDate(date);constextName=path.extname(文件名);if(now-time>distanceTime&&extName===`.${ext}`){deleteFile(fileName).then((res)=>{resolve(res);});}else{解决();}}});//deleteFile.js//使用fs.unlink删除文件fs.unlink(fileName,err=>{if(err){reject(err);}else{resolve(fileName);}});这里主要说一下解决问题的思路,先梳理一下解决这个问题需要的步骤,然后每个步骤都可以抽象成一个函数,想想函数的参数传递和返回值,最后设计一个更容易扩展的API,具体代码可以在仓库查看:https://github.com/wulv/del-e...3.在低版本的node中使用babel可能有些不支持es6语法,比如对象解构等,所以需要用babel编译成低版本可以识别的语法。我们把src目录下的代码编译到lib目录下,然后我们把package.json里的“main”改成“lib/index.js”,这样对外暴露的代码就不会有兼容性问题。下载babel-cli依赖:npminstall--save-devbabel-cli//下载presets,presets是别人配置的一系列规则,规则中编译的语法npminstall--save-devbabel-preset-es2015已配置。babelrc:{"presets":["es2015"]}在package.json中配置脚本:"scripts":{"build":"babelsrc-dlib","build:watch":"npmrunbuild----watch"}以便运行npmrunbuild将源文件编译到lib目录。4.写测试为了保证程序的稳定性,我们一定要写测试用例,尤其是当你的程序依赖越来越多的时候,比如你改了A模块,你以为你改的没问题,但是一旦出乎意料发布时会出现错误,因为它影响了一个你不知道的模块。这时测试就显得尤为重要,它可以帮助你避免很多低级错误。我们使用mocha和chai来测试框架和断言,下载依赖项。npminstallmochachai--save-dev我们在项目根目录下创建一个test目录。使用内容创建index.formatDate.js:'usestrict';constchai=require('柴');constformatDate=require('../lib/formatDate');constexpect=chai.expect;constS=1000;describe('formatdete',()=>{it('test2s',function(){expect(formatDate('2s')).to.be.equal(2*S);});});这里只是演示基本语法,代码较多,具体请参考仓库。然后在package.json中再添加一个脚本:"test":"npmrunbuild&&mocha-t5000"五、Travis-CI+CoverallsTravis-CI是一个持续集成构建项目,结合github可以实现非常强大的功能,例如,当你提交PR到仓库后,它会自动为你运行测试用例。如果测试失败,则无法合并到master中。Coveralls是一种用于收集测试覆盖率报告的自动化测试覆盖率服务。对于开源项目Free,配置这个之后,你可以生成一个徽章,显示你的代码的测试覆盖率。Coveralls可以使用GitHub帐户登录。登录后,您可以在https://coveralls.io/repos/new添加需要收集报告的repo。首先安装istanbul工具来检测代码的测试覆盖率:npminstallistanbul--save-dev然后在package.json的脚本中添加:"cover":"istanbulcovernode_modules/mocha/bin/_mocha"runnpm运行cover以查看您的代码测试覆盖率=========覆盖率摘要==========语句:92.65%(63/68)分支:75%(15/20)函数:100%(14/14)行:92.65%(63/68)======================================将测试覆盖率报告提交给Coveralls,首先安装coveralls:npminstallcoveralls--save-dev然后在package.json中的scripts中添加“coveralls”:“npmruncover----reportlcovonly&&cat./coverage/lcov.info|coveralls"并创建一个.travis.yml文件,sudo:falselanguage:node_jsos:-linux-osxnode_js:-6-8-9-10branches:only:-masterinstall:-npminstallscript:-npmrunlint-npmrunbuild-npmruncoverafter_success:-npmruncoveralls将代码推送到github后,打开https://travis-ci.org/,点击右上角头像->个人资料,打开开关你的仓库:在README.md中添加代码测试覆盖率徽章,我们可以使用http://shields.io来添加徽章,比如下载量、星星等。徽章[![构建状态](https://travis-ci.org/wulv/del-expired-file.png)](https://travis-ci.org/wulv/del-expired-file)[![覆盖状态](https://img.shields.io/coveralls/wulv/del-expired-file/master.svg?style=flat)](https://coveralls.io/github/wulv/del-expired-file?branch=master)最后可以看到如下效果。当你看到一个npm显示测试覆盖率时,你是不是马上就放心了?6.发布至此我们基本写出了一个比较健壮的仓库,现在发布到npm上。如果没有npm账号,需要先注册,然后运行npmadduser输入用户名和密码,npmpublish,这样你的仓库就发布了。如果要更新版本,必须遵循Semver(语义版本号)规范:升级补丁版本号:npmversionpatch升级小版本号:npmversionminor升级大版本号:npmversionmajor以上总结用到的工具和技术:我们可以看到,如果只实现功能,把目标定为只实现需求,写这个npm包,用一个文件三个函数来完成,但是这种情况下包估计是只有自己用,以后的维护和修改会比较麻烦,但是用了这套工具后,会健壮很多。在工作中也是如此,我们需要追求卓越,不断打磨自己的手艺,做出更加完美的作品。作为广告,杭州有赞诚招前端开发工程师。我们在四月份举办了前端技术开放日。详情请查看链接:https://tech.youzan.com/fe-op...。公司福利多多:标配:MacBook,报销:显示屏,鼠标,机械键盘,五险一金,980元/月餐补,加班打车报销,每年外出体检,每人每年有机会参加外部会议/培训等高规格晚宴、奇葩团建、长期零食架……高端电视、游戏机、台球、乒乓球、桌球、健身器材、以及四驱履带等,等你来战~有意者请将简历发送至wulv#youzan.com。参考链接mocha教程travis-cihow-to-add-badge-in-github-readme