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

30个有用的Node.jsNPM包

时间:2023-04-03 10:50:55 Node.js

TNTWeb-全称是腾讯新闻中台前端团队。群里的小伙伴在Web前端、NodeJS开发、UI设计、手机APP等大前端领域都有实践和积累。目前团队主要支持腾讯新闻各项业务的前端开发。除了业务发展,它还积累了一些前端基础设施,以实现业务效率提升和产品创新。团队倡导开源共建,拥有各类技术人才。团队Github地址:https://github.com/tnfe本文作者云峰项目地址:https://github.com/tnfe/mdebug很久以前,一位软件工程师加快了开??发进程通过减少程序中的重复代码。Nodejs生态以npm包的形式重用代码,目前有超过100万个开源包可用。从小型的互联网项目到知名的科技创业公司等等,都会用到npm包。其中一些流行的软件包每周有超过1000万次下载,是许多应用程序的基础。如今,现代Web应用程序中的许多代码都来自npm模块。我们精选了30个常用的nodejs安装包,让你免于重新发明轮子。一、实用功能1、qs一个简单易用的字符串解析格式化库constqs=require('qs');constvassert=require('断言');constobj=qs.parse('a=c');assert.deepEqual(obj,{a:'c'});conststr=qs.stringify(obj);assert.equal(str,'a=c');2.rxjsRxJS是一组模块化库,用于在JavaScript中使用可观察集合和组合来编写异步和基于事件的程序。const{范围}=require('rxjs');const{map,filter}=require('rxjs/operators');range(1,200).pipe(filter(x=>x%2===1),map(x=>x+x)).subscribe(x=>console.log(x));3.mittmicro200b功能事件发射器/发布订阅。从'mitt'constemitter=mitt()emitter.on('foo',e=>console.log('foo',e))emitter.on('*',(type,e)=>console.log(type,e))emitter.emit('foo',{a:'b'})emitter.all.clear()functiononFoo(){}emitter.on('foo',onFoo)//listenemitter.off('foo',onFoo)//unlisten4.Underscore.jsUnderscore.js是一个JavaScript实用程序库,它为常见的功能嫌疑人(each、map、reduce、filter等)而不扩展任何核心JavaScript对象。const_=require("underscore);constlist=[[5,1,7],[3,2,1]];_.invoke(list,'sort');//=>[[1,5,7],[1,2,3]]5.day.jsDay.js是一个极简主义的JavaScript库,它为现代浏览器解析、验证、操作和显示日期和时间,其API与Moment基本兼容。constdayjs=require(“dayjs”);dayjs().startOf('month').add(1,'day').set('year',2018).format('YYYY-MM-DDHH:mm:ss');6.RamdaRamda是一个函数库,具有无副作用的函数,可以与柯里化相结合。import*asRfrom'ramda';constdouble=x=>x*2;R.map(double,[1,2,3]);//=>[2,4,6]R.map(double,{x:1,y:2,z:3});//=>{x:2,y:4,z:6}7.validatorValidator是一个字符串验证器和消毒器库。varvalidator=require('验证器');validator.isEmail('foo@bar.com');//=>true8.yupyup是一个用于复杂、相互依赖的验证和转换的模式构建器。import*asyupfrom'yup';letschema=yup.object().shape({name:yup.string().required(),age:yup.number().required().positive().integer(),电子邮件:yup.string().email(),网站:yup.string().url(),createdOn:yup.date().default(function(){returnnewDate();}),});//检查validityschema.isValid({name:'jimmy',age:24,}).then(valid=>console.log(valid)//=>true);//你可以尝试输入cast定义的schema.cast({name:'jimmy',age:'24',createdOn:'2014-09-23T19:25:25Z',});//=>{name:'jimmy',age:24,createdOn:Date}9.LodashLodash是一个实用程序库,通过消除处理数组、数字、对象、字符串等的麻烦,使JavaScript变得更容易。const_=require("lodash");常量数=_。范围(1,9);//=>[1,2,3,4,5,6,7,8,9]常量块=_.chunk(nums,3);//=>[[1,2,3],[4,5,6],[7,8,9]]constright=_.takeRight(nums,2);//=>[7,8,9]10.date-fnsDate-fns为在浏览器和Node.js中操作JavaScript日期提供了最全面、简单和一致的工具集。import{format,formatDistance,formatRelative,subDays}from'date-fns'format(newDate(),'[Todayisa]dddd')//=>“今天是星期三”formatDistance(subDays(newDate()),3),newDate())//=>“3天前”formatRelative(subDays(newDate(),3),newDate())//=>“上周五晚上7点26分。”11.jsonwebtokenJsonwebtoken是一个用于签名、验证和解码JSONWeb令牌的库。constjwt=require('jsonwebtoken');consttoken=jwt.sign({foo:'bar'},'shhhhh');12.uuidUUID是一个用于创建RFC4122通用唯一标识符的库。const{v4:uuidv4}=require('uuid');uuidv4();//=>'1a68a438-b077-468b-b1e8-dcdd976a0f5b'2.操作系统文件系统1.rimrafRimraf为节点提供与UNIXrm-rf命令等效的命令。constrimraf=require(“rimraf”);rimraf('./build',error=>{if(error)console.error(error);});2.fs-extraFS-extra在fs模块中增加了Filesystem方法,并增加了对fs方法的promise支持。constfs=require('fs-extra');asyncfunctioncopyFiles(){try{awaitfs.copy('/tmp/myfile','/tmp/mynewfile');console.log('成功!');}catch(err){console.error(err);}}复制文件();3.mkdirp与mkdir-p一样,mkdirp递归地创建目录和所有必要的子目录。constmkdirp=require('mkdirp')//返回值是一个Promise解析到创建的第一个目录mkdirp('/tmp/foo/bar/baz').then(made=>console.log(`madedirectories,starting用${made}`));4.globGlob是一个使用各种模式匹配文件的库。constglob=require("glob");//options是可选的glob("**/*.js",options,function(er,files){//files是一个文件名数组。//如果`nonull`选项已设置,但没有找到//文件,然后文件是["**/*.js"]//er是一个错误对象或null。});5.shelljsShellJS是一个基于Node.jsAPIPortable(Windows/Linux/OSX)实现的Unixshell命令。constshell=require('shelljs');if(!shell.which('git')){shell.echo('抱歉,这个脚本需要git');shell.exit(1);}//复制文件到releasedirshell.rm('-rf','out/Release');shell.cp('-R','stuff/','out/Release');//替换每个.js文件中的宏shell.cd('lib');shell.ls('*.js').forEach(function(file){shell.sed('-i','BUILD_VERSION','v0.1.2',文件);shell.sed('-i',/^.*REMOVE_THIS_LINE.*$/,'',文件);shell.sed('-i',/.*REPLACE_LINE_WITH_MACRO.*\n/,shell.cat('macro.js'),file);});shell.cd('..');//同步运行外部工具if(shell.exec('gitcommit-am"Auto-commit"').code!==0){shell.echo('错误:Git提交失败');shell.exit(1);}6.js-yamlJs-yaml是YAML的实现,YAML是一种流行的人性化数据序列化语言。constyaml=require('js-yaml');constfs=require('fs');//获取文档,或在错误时抛出异常{constdoc=yaml.load(fs.readFileSync('/home/ixti/example.yml','utf8'));console.log(doc);}catch(e){console.log(e);}3.Web框架1.koaKoa是由Express背后的团队设计的一个新的web框架,旨在成为一个更小、更具表现力、Web应用程序和API的更强大基础。constKoa=require('koa');constapp=newKoa();应用程序。使用(异步ctx=>{ctx.body='HelloWorld';});应用程序。听(3000);2.expressExpress是最流行、最快和最小的node.js后端Web框架。constexpress=require('快递');constapp=express();应用程序。get('/',function(req,res){res.send('HelloWorld');});应用程序。听(3000);3。FastifyFastify是最快的可扩展Web框架之一,专注于以最少的开销提供最佳的开发人员体验。constfastify=require('fastify')({logger:true});fastify.get('/',async(request,reply)=>{reply.type('application/json').code(200);return{hello:'world'};});fastify.listen(3000,(err,address)=>{if(err)throwerr;fastify.log.info(`Applisteningon${address}`);});4.socket.ioSocket.IO使用长轮询或WebSockets实现基于事件的实时双向通信,具有断开检测和自动重新连接支持。constserver=require('http').createServer();constio=require('socket.io')(服务器);io.on('connection',client=>{client.on('event',data=>{/*...*/});client.on('disconnect',()=>{/*...*/});});服务器.listen(3000);四、辅助开发1.jestJest已经完成并准备设置JavaScript测试解决方案test('adds1+2toequal3',()=>{expect(1+2).toBe(3);});2.typescriptTypeScript是可扩展的JavaScript。它是一种添加可选类型并编译为简单易读的JavaScript的语言。接口用户{名称:字符串;id:number;}constuser:User={name:"Hayes",id:0,};3.winstonWinston是一个简单通用的日志库,支持多种传输方式。constwinston=require('winston');constlogger=winston.createLogger({level:'info',format:winston.format.json(),defaultMeta:{service:'user-service'},transports:[//写入所有级别为`error`的日志和belowto`error.log`newwinston.transports.File({filename:'error.log',level:'error'}),//将级别为`info`及以下的所有日志写入`combined.log`newwinston.transports.File({filename:'combined.log'}),],});logger.log({level:'error',message:'Hellodistributedlogfiles!'});logger.info('你好再次分发日志');4.debugDebug是一个模仿Node.js核心调试技术的小型JavaScript调试实用程序。constdebug=require('debug')('http'),http=require('http'),name='MyApp';debug('booting%o',name);http.createServer(function(req,res){debug(req.method+''+req.url);res.end('hello\n');}).listen(3000,function(){debug('listening');});5.eslintESLint是一种用于查找和修复JavaScript和TypeScript代码中的问题的工具。{"rules":{"semi":["error","always"],"quotes":["error","double"]}}6.nodemonNodemon是一个检测文件更改时自动重启节点应用程序以帮助开发基于node.js的应用程序的工具。nodemon./server.js7.dotenvdotenv是一个零依赖模块,可以将.env文件中的环境变量加载到process.env.env文件中:DB_HOST=localhostDB_USER=rootDB_PASS=s1mpl3require('dotenv').config();constdb=require('db');db.connect({host:process.env.DB_HOST,username:process.env.DB_USER,password:process.env.DB_PASS});8.cross-envCross-env使脚本能够跨平台设置和使用环境变量。{"scripts":{"start-prod":"cross-envNODE_ENV=productionnode./app.js"}}