ECMAScript标准缺陷无模块系统标准库少无标准接口缺乏管理系统模块化程序设计规模达到一定程度,就必须进行模块化。模块化可以有多种形式,但至少它应该提供一种将代码拆分为多个源文件的机制。CommonJS的模块功能可以帮助我们解决这个问题。CommonJS规范CommonJS规范的提出主要是为了弥补JavaScript没有模块化标准的缺陷。CommonJS规范为JS指定了一个美好的愿景,希望JS可以在任何地方运行。CommonJS中一个模块的定义非常简单:-模块引用-模块定义-模块标识模块引用在规范中定义了require()方法,它接管了模块标识,从而将一个模块引入到当前的运行环境中.模块参考示例代码:–varmath=require('math');模块定义在运行环境中,提供exports对象,用于导出当前模块的方法或变量,是唯一导出的export。模块中还有一个模块对象,代表模块本身,exports是模块的一个属性。文件是Node中的一个模块。模块定义导出。xxx=函数(){};模块。出口={};模块ID模块ID其实就是模块的名称,是传递给require()方法的参数。必须是符合驼峰式大小写的字符串,或者以.,.开头的相对或绝对路径。模块的定义很简单,接口也很简洁。每个模块都有独立的空间,互不干扰,引用时显得干净整洁。Node的模块实现虽然Node使用了CommonJS规范,但是它也为规范做了一些取舍。在Node中引入一个模块,需要经过以下三个步骤:–路径分析–文件定位–编译执行Node中模块分为三类:一类是底层用C++编写的内置模块层,另一个由Node.js提供。核心模块;还有一类用户编写的模块,称为文件模块。packageCommonJS的封装规范允许我们将一组相关的模块组合在一起,形成一套完整的工具。CommonJS的包规范由两部分组成:包结构和包描述文件。包结构——用于组织包中的各种文件。包描述文件——描述包的相关信息,供外部阅读和分析包结构。压缩包实际上是一个压缩文件,解压后会还原到一个目录下。一个符合规范的目录应该包含以下文件:–package.json描述文件–bin可执行二进制文件–libjs代码–doc文档–测试单元测试包描述文件包描述文件用于表示非代码相关信息,是一个JSON格式的文件——package.json,位于包的根目录下,是包的重要组成部分。package.json中的字段——名称、描述、版本、关键字、维护者、贡献者、错误、许可证、存储库、依赖项、主页、操作系统、cpu、引擎、内置、目录、实现、脚本、作者、bin、mainendc、devies。NPM(NodePackageManager)CommonJS包规范是理论,NPM是一种实践。对于Node来说,NPM帮助它完成第三方模块的发布、安装和依赖。有了NPM,Node和第三方模块之间形成了良好的生态。npm命令npm-v-查看版本npm-帮助说明npmsearch包名-搜索模块包npminstall包名-在当前目录下安装包npminstall包名-g-以全局方式安装包npmremove包名-删除一个模块npminstall文件路径–安装npminstall包名–registry=地址–从镜像源安装npmconfigsetregistryaddress–设置镜像源Buffer(缓冲区)从结构上看,Buffer很像一个数组,它的元素是16位两位数。实际上,一个元素代表内存中的一个字节。Buffer中的内存其实并不是通过JavaScript分配的,而是在底层通过C++申请的。即我们可以直接通过Buffer在内存中创建空间。Buffer操作使用Buffer保存字符串创建指定大小的Buffer对象letstr="Helloatguigu";letbuf=Buffer.from(str,"utf-8");letbuf3=Buffer.alloc(1024*8)Buffer转换Buffer和字符串之间的转换——支持的编码:ASCII、UTF-8、UTF-16LE/UCS-2、Base64、Binary、Hex——字符串到BufferBuffer.from(str,[encoding]);——Buffer到字符串buf。toString([编码],[开始],[结束]);write操作向缓冲区写入一个字符串——buf.write(string[,offset[,length]][,encoding])替换指定索引位置的数据——buf[index]将指定值填充到指定索引位置buffer–buf.fill(value[,offset[,end]][,encoding])读取缓冲区中的数据内容,转换为字符串返回–buf.toString([encoding[,start[,end]]])读取缓冲区中指定索引的内容–buf[index]其他操作复制缓冲区–buf.copy(target[,targetStart[,sourceStart[,sourceEnd]]])slicebuffer–buf.slice([start[,end]])concatenatebuffer–Buffer.concat(list[,totalLength])Node中的fs(文件系统)其中,与文件系统的交互非常重要。服务器的本质是将本地文件发送给远程客户端。Node通过fs模块与文件系统交互。该模块提供了一些标准的文件访问API来打开和读取、写入文件以及与文件交互。要使用fs模块,首先需要加载它–constfs=require("fs");同步和异步调用fs模块中的所有操作都有两种形式可供选择:同步和异步。同步文件系统会阻塞程序的执行,即直到操作完成才会向下执行代码。异步文件系统不会阻塞程序的执行,而是在运行完成时通过回调函数返回结果。打开和关闭文件打开文件–fs.open(path,flags[,mode],callback)–fs.openSync(path,flags[,mode])关闭文件–fs.close(fd,callback)–fs.closeSync(fd)Openstatewritefilefs提供了四种不同的数据写入文件方式-简单文件写入-同步文件写入-异步文件写入-流式文件写入简单文件写入fs.writeFile(file,data[,options],callback)fs.writeFileSync(file,data[,options])参数:–file文件路径–待写入的数据,可以是String或Buffer–options对象,包含属性(encoding,mode,flag)–callback回调函数同步写入文件,首先需要通过openSync()打开文件得到一个文件描述符,然后通过writeSync()写入文件。参数-fd文件描述符,通过openSync()获取-data待写入数据(String或Buffer)-offsetbufferwriteoffset-lengthwritelength-position写入起始位置-encodingwrite编码异步文件写入fs.write(fd,buffer,offset,length[,position],callback)fs.write(fd,data[,position[,encoding]],callback)要使用异步写入文件,首先需要通过open()打开文件,以及然后在回调函数中通过write()写入。参数:–fd文件描述符–data待写入数据(String或Buffer)–offsetbufferwriteoffset–lengthwritelength–position写入起始位置–encoding写入编码流文件将大量数据写入a的最佳方式之一文件是使用流。要将数据异步传输到文件,首先需要使用以下语法创建一个Writable对象:–fs.createWriteStream(path[,options])pathfilepathoptions{encoding:"",mode:"",flag:""}打开Writable文件流后,可以使用write()方法对其进行写入,写入完成后,调用end()方法关闭流。读取文件fs提供了四种读取文件的方式–简单文件读取–同步文件读取–异步文件读取–流式文件读取简单文件读取fs.readFile(file[,options],callback)fs.readFileSync(file[,options])–参数:文件文件路径或文件描述符选项|–编码|default=null–flagdefault='r'callback回调函数,有两个参数err,数据同步文件读取取fs.readSync(fd,buffer,offset,length,position)–参数:fd文件描述符buffer读取文件缓冲区偏移量bufferstartwritingpositionlength读取字节数wordstoreadsectionnumberpositionstartreadingfilepositioncallback回调函数参数err,bytesRead,buffer流式文件读取当从文件中读取大量数据时,最好的方法之一是流式读取,它将转换为一个文件被打开作为可读流。要从文件异步传输数据,首先需要使用以下语法创建一个可读流对象:–fs.createReadStream(path[,options])pathfilepathoptions{encoding:"",mode:"",flag:""}打开可读文件流后,您可以通过可读事件和read()请求或通过数据事件处理程序轻松地从中读取数据。其他操作验证路径是否存在–fs.exists(path,callback)–fs.existsSync(path)获取文件信息–fs.stat(path,callback)–fs.statSync(path)删除文件–fs.unlink(path,callback)–fs.unlinkSync(path)其他操作列表文件–fs.readdir(path[,options],callback)–fs.readdirSync(path[,options])截断文件–fs.truncate(path,len,callback)–fs.truncateSync(path,len)创建目录–fs.mkdir(path[,mode],callback)–fs.mkdirSync(path[,mode])其他操作删除目录–fs.rmdir(path,callback)–fs.rmdirSync(path)重命名文件和目录–fs.rename(oldPath,newPath,callback)–fs.renameSync(oldPath,newPath)watchforfilechangeswrite–fs.watchFile(filename[,options],listener)关键字:前端培训
