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

nodejs交互工具库——fs-extra、Acorn和zlib

时间:2023-04-03 11:13:56 Node.js

nodejs交互工具库系列库角色chalk-pipe使用更简单的样式字符串创建chalk样式解决方案chalk正确处理终端字符串样式Commander.jscompletenode.js命令行解决方案Inquirer.js一组通用的交互式命令行用户界面。斜杠系统路径字符处理minimist解析参数选项dotenv从加载环境变量。或多个对象的可枚举属性。yaml-front-matter解析yaml或jsonresolve实现node的require.resolve()算法,这样require.resolve()可以异步和同步的方式代表semvernpm的semanticversionerleven测量两个字符串的差异
最快的JS实现之一lru缓存删除最近最少使用的项目缓存对象portfinder自动查找从8000到65535的可用端口号或优雅的终端运行器envinfo生成用于解决软件问题(例如操作系统、二进制版本、浏览器、已安装的语言等)memfs内存文件系统与Node的fsAPI实现相同execa用于人工进程执行webpack-merge用于连接数组和合并对象创建新对象webpack-chain使用chainAPI生成简化的webpack版本配置修改strip-ansi删除ANSIescapecodeaddress从字符串中获取当前机器的IP、MAC和DNS服务器。default-gateway通过对OS路由接口的exec调用获得机器的默认网关。joiJavaScript最强大的模式描述语言和数据验证器。fs-extra添加了本机fs模块中未包含的文件系统方法,并为fs方法添加了promise支持。Acorn是一个小巧而快速的JavaScript解析器,完全用JavaScript编写。zlib.jsZLIB.js是ZLIB(RFC1950)、DEFLATE(RFC1951)、GZIP(RFC1952)和PKZIP的JavaScript实现。nodejs交互工具库——chalk-pipe和chalknodejs交互工具库——commander和Inquirer交互工具库--resolve和semvernodejs交互工具库--leven、lrucache和portfindernodejs交互工具库--ora和envinfonodejs交互工具库--memfs和execanodejs交互工具库--webpack-merge和webpack-chainnodejs交互工具库--strip-ansi、address、default-gateway和joinodejs交互工具库--fs-extra、Acorn和zlibfs-extrafs-extra添加了原生fs模块中不包含的文件系统方法,并添加了对fs方法的promise支持。它还使用graceful-fs来防止EMFILE错误。替换fs应该是一个dropinreplacement。为什么?我厌倦了在我的大多数项目中包含mkdirp、rimraf和ncp。安装npminstallfs-extra使用fs-extra是原生fs的降级。fs中的所有方法都附加到fs-extra。如果没有传入回调,所有fs方法都会返回promises。您不再需要包含原始的fs模块:constfs=require('fs')//这不再是必需的您现在可以这样做:constfs=require('fs-extra')或者,如果您愿意明确表示您使用的是fs-extra而不是fs,您可能希望将fs变量命名为fse,如下所示:constfse=require('fs-extra')您也可以同时保留两者,但这是多余的:constfs=require('fs')constfse=require('fs-extra')SyncvsAsyncvsAsync/Await大多数方法默认都是异步的。如果没有传入回调,所有异步方法都会返回一个承诺。另一方面,如果发生错误,同步方法将抛出异常。此外,Async/Await在发生时会抛出错误。示例:constfs=require('fs-extra')//异步promises:fs.copy('/tmp/myfile','/tmp/mynewfile').then(()=>console.log('success!')).catch(err=>console.error(err))//异常回调:fs.copy('/tmp/myfile','/tmp/mynewfile',err=>{if(err)returnconsole.error(err)console.log('success!')})//Sync:try{fs.copySync('/tmp/myfile','/tmp/mynewfile')console.log('success!')}catch(err){console.error(err)}//Async/Await:asyncfunctioncopyFiles(){try{awaitfs.copy('/tmp/myfile','/tmp/mynewfile')console.log('成功!')}catch(err){console.error(err)}}copyFiles()MethodsAsynccopyemptyDirensureFileensureDirensureLinkensureSymlinkmkdirpmkdirsmoveoutputFileoutputJsonpathExistsreadJsonremovewriteJsonSynccopySyncemptyDirSyncensureFileSyncensureDirSyncensureLinkSyncensureSymlinkSyncmkdirpSyncmkdirsSyncmoveSyncoutputFileSyncoutputJsonSyncpathExistsSyncreadJsonSyncremoveSyncwriteJsonSyncNOTE:您仍然可以使用原生的Node.js方法。他们被承诺并复制到fs-extra。请参阅有关fs.read()、fs.write()和fs.writev()的注释walk()和walkSync()发生了什么?从v2.0.0中的fs-extra中删除了它们。如果您需要该功能,walk和walkSync可以作为单独的包使用,即klaw和klaw-sync。参考基本常用的方法和场景。更完整的用法可以直接参考文档node-fs-extraAcorn一个小巧快速的JavaScript解析器,完全用JavaScript编写。CommunityAcorn是在MIT许可证下发布的开源软件。欢迎报告错误或在github上创建拉取请求。对于问题和讨论,请使用Tern论坛。包这个存储库包含三个包:acorn:主解析器acorn-loose:容错解析器acorn-walk:语法树解析器要构建存储库的内容,请运行npminstall.gitclonehttps://github。com/acornjs/acorn.gitcdacornnpminstallPlugin开发Acorn旨在支持在合理范围内重新定义解析器工作方式的插件。插件可以添加新的标记类型和新的标记生成器上下文(如果需要),并扩展解析器对象中的方法。它不是一个干净、优雅的api——使用它需要了解Acorn的内部结构,当这些内部结构发生重大变化时,插件很可能会崩溃。然而,这种方式可以为JavaScript方言创建解析器,而无需创建Acorn的所有分支。原则上,甚至可以组合这些插件,例如,如果您有一个解析类型的插件和一个解析JSX样式XML文本的插件,您可以同时加载它们并使用JSX标记和类型解析代码。插件是解析器类中用于扩展解析器类的函数。插件可以通过简单地将它们应用到解析器类(或已被其他插件扩展的解析器类的版本)来使用。但从语法上讲,当您使用多个插件时,静态方法解析器可能会变得有点笨拙。可以使用任意数量的插件值作为参数调用extend,创建一个由所有这些插件扩展的解析器类。您通常只需要创建一次这样的扩展类并重复调用它的解析,以避免不必要地混淆JavaScript引擎的优化器。const{Parser}=require("acorn")constMyParser=Parser.extend(require("acorn-jsx")(),require("acorn-bigint"))console.log(MyParser.parse("//一些bigint+JSX代码"))插件覆盖其新解析器类中的方法以获得附加功能。建议插件包将插件函数导出为默认值,或者,如果它接受配置参数,则导出一个创建插件函数的构造函数。这是一个简单的插件,它向readToken方法添加了一些代码,它可能看起来像这样:super.readToken(code)}}}参考基本常用方法和场景。更完整的用法可以直接参考文档acornzlib.jsZLIB.js是用JavaScript实现的ZLIB(RFC1950)、DEFLATE(RFC1951)、GZIP(RFC1952)和PKZIP。用法在“bin”目录中使用一个。zlib_and_gzip.min.js:ZLIB+GZIP(Raw)rawdeflate.js:RawDeflaterawinflate.js:RawInflatatezlib.min.js:ZLIBInflate+Deflateinflate.min.js:ZLIBInflatedeflate.min.js:ZLIBDeflateinflate_stream.min.js:ZLIBInflate(streammode)(GZIP)gzip.min.js:GZIPgunzip.min.js:GUNZIP(PKZIP)zip.min.jsZIPunzip.min.jsUNZIPnode-zlib.js:(ZLIB+GZIPfornode.js)CompressionRawDeflate//plain=Array.或Uint8Arrayvardeflate=newZlib.RawDeflate(plain);varcompressed=deflate.compress();RawDeflate选项见ZLIB选项。ZLIB//plain=Array.或Uint8Arrayvardeflate=newZlib.Deflate(plain);varcompressed=deflate.compress();ZLIBOptionZlib.Deflate第二个参数结构体{compressionType:Zlib.Deflate.CompressionType,//压缩类型lazy:number//惰性匹配参数}Zlib.Deflate.CompressionType是可枚举的,NONE(存储),FIXED(固定哈夫曼)任选其一编码),DYNAMIC(动态哈夫曼编码)。默认是动态的。lazy是惰性匹配长度。不建议使用此参数。GZIPGZIP实现不完整。不过日常使用是没有问题的。//plain=Array.或Uint8Arrayvargzip=newZlib.Gzip(plain);varcompressed=gzip.compress();GZIPOption{deflateOptions:Object,//参见:deflate选项(ZLIB选项)flags:{fname:boolean,//使用文件名?comment:boolean,//使用注释?fhcrc:boolean//使用文件校验和?},filename:string,//filenamecomment:string//comment}PKZIPvarzip=newZlib.Zip();//plainData1zip.addFile(plainData1,{filename:stringToByteArray('foo.txt')});zip。addFile(plainData2,{filename:stringToByteArray('bar.txt')});zip.addFile(plainData3,{filename:stringToByteArray('baz.txt')});varcompressed=zip.compress();functionstringToByteArray(str){vararray=new(window.Uint8Array!==void0?Uint8Array:Array)(str.length);变量我;变种;对于(i=0,il=str.length;i|Uint8Array),//文件名comment:(Array.|Uint8Array),//commentextraField:(Array.|Uint8Array),//extrafieldcompress:boolean,//在调用“addFile”方法时进行压缩。compressionMethod:Zlib.Zip.CompressionMethod,//存储或放气Uint8Arrayvarinflate=newZlib.RawInflate(compressed);varplain=inflate.decompress();RawDeflateOptionSeeZLIBOption.ZLIB//compressed=Array.或Uint8Arrayvarinflate=newZlib.Inflate(compressed);varplain=inflate.decompress();ZLIBOptionZlib.Inflate第二参数据结构{'index':number,//输入缓冲区中的起始位置'bufferSize':number,//初始输出缓冲区大小'bufferType':Zlib.Inflate.BufferType,//缓冲区扩展类型'resize':boolean,//解压结束时调整buffer(ArrayBuffer)大小(默认:false)'verify':boolean//验证解压结果(默认:false)}Zlib.Inflate.BufferTypeenumerableADAPTIVE(默认)和BLOCK选择one.ADAPTIVE:BufferexpansionbasedoncompressionratiooffilledbufferBLOCK:BufferexpansionbasedonBufferSize.GZIP//compressed=Array.orUint8Arrayvargunzip=newZlib.Gunzip(compressed);varplain=gunzip.decompress复制代码();PKZIP//compressed=Array.orUint8Arrayvarunzip=newZlib.Unzip(compressed);varfilenames=unzip.getFilenames();varplain=unzip.decompress(filenames[0]);节点。js请参阅单元测试。https://github.com/imaya/zlib...DebugSourceMaps和PrettyPrint如果您想在编译前了解代码,则可用。SourceMap如果你想使用sourcemaps,使用dev版本。例如,你想使用sourcemapinflation。-inflate.min.js//发布版本-inflate.dev.min.js//开发版本<-使用thisPrettyPrintzlib.pretty.js没有重命名符号。如何使用Grunt和闭包编译器构建构建。RequirementGruntPythonBuild使用“grunt”命令。$grunt[target]Buildtargettargetgeneratefileimplementationdepsdeps.js(dependency:deps.js)deflateddeflate.min.jsZLIBDeflateinflate.min.jsZLIBInflateinflate_streaminflate_stream.min。jsZLIBInflate(stream)zlibzlib.min.jsZLIBDeflate+Inflategzipgzip.min.jsGZIPCompressiongunzipgunzip.min.jsGZIPDecompressionzlib_and_gzipzlib_and_gzip.min.jsZLIB+GZIPnode-zlibpress.jsZLIB+GZIPfornode.jszipZipPmin.jsPKZIPcompression*使用默认目标Karma和测试单元摩卡咖啡。$npmtestBrowseronly$npmruntest-karmaNode.jsonly$npmruntest-mochaReference基本常用方法场景就这些,更完整的用法可以直接参考文档zlib.js