Node 科学知识
一、基本技能
1、配置文件询问处
又称为 cmd 询问处、终端产品、shell关上方式:win:win+R,输出 cmd,关上mac / linux: terminal后面表明的为现阶段所处的产品目录常见的命令dir 列举pkg下大部份文档cd 产品目录名步入到选定的产品目录产品目录.则表示pkg..则表示上二级产品目录md 产品目录名建立两个文档夹rd 产品目录名删掉两个文档夹输出pkg下的两个文档名(主要包括前缀)能关上那个文件配置文件 Windows 控制系统中的表达式path当他们在配置文件询问处关上两个文档,或初始化两个流程时,控制系统会具体来说在pkg下找寻文档流程,假如找出了则间接关上,假如没找出则会依序到配置文件path 的路径中找寻,晓得找出年末,假如没找出则收起因此他们能将许多时常须要出访的流程和文档的方向加进到paht中,这种他们就能在任一边线来出访那些文档和流程了
2、民主化和缓存
民主化
民主化负责管理为流程的运转提供更多必不可少的自然环境民主化就相等于厂房中的炼铁厂
缓存
缓存是排序机系统中的最轻的排序基层单位,缓存负责管理继续执行民主化中的流程缓存就相等于厂房中的建筑工人单缓存JS 是单缓存多缓存
二、Node.js概要
nodejs 是两个能在服务端运转js的对外开放源码、虚拟化的js运转自然环境node 选用 google 合作开发的 v8发动机运转 JS 标识符,选用
三、node 选用
node> var i =0> console.log(i)
node hello.js
四、COMMONJS 规范
1、ECMAScript 标准的缺陷
没模块控制系统标准库较少没标准接口缺乏管理控制系统
2、模块化 module.js
在 node 中,两个 JS 就是两个模块在 Node 中,每两个 js 文档中的 js 标识符都是独立运转在两个函数中,而不是全局作用域,因此两个模块中的表达式和函数在其他模块中无法出访他们能通过 exports 来向外部暴露表达式和方法,只须要将要暴露给外部的表达式或方法设置为 exports 的属性即可exports.x=”我是modeule.js中的x”exports.fn = function(){}在 Node 中有两个全局对象 global,它的作用和网页中 window 类似,在全局中建立的表达式都会作为 global 的属性保存,在全局中建立的函数都会作为 global 的方法保存var a =10;console.log(global.a);argumentsarguments.callee 那个属性保存的是当前继续执行的函数对象在 node 继续执行模块中的标识符时,它具体来说会在标识符的最顶部加进标识符 function(exports, require, module, filename, dirname){,在标识符的最底部,加进标识符}.实际上模块中的标识符都是包装在两个函数中继续执行的,并且在函数继续执行时,同时传递进了5个实参 arguments.length。exports 该对象用来将表达式或函数暴露到外部require 函数,用来引入外部的模块modulemodule 代表的是当前模块本身exports 就是 module 的属性既能选用 exports 导出,也能选用 modeule.exports 导出 module.exports==exports,module.exports.a exports.a通过 exports 只能选用.的方式来向外暴露内部表达式,而 modele.exports 既能通过.的形式,也能间接复制exports.xxx = xxxmodule.exports.xxx = xxxmodule.exports ={ name =”swk” age =15000 sayName = function{ console.log(name)}}filename 当前模块的完整方向dirname 当前模块所处文档夹的完整方向
在 node 中通过 require()函数来引入外部的模块,require()能传递两个文档的方向作为参数,node将会自动根据该方向来引入外部模块,这里的方向假如选用相对方向,必须以.或..开头。选用 require 引入模块后,该函数会返回两个对象,那个对象代表的是引入的模块
var md = require(“./modele.js”);console.log(md)
模块分为两大类
核心模块由 node 发动机提供更多的模块文档模块由用户自己建立的模块
3、CommonJS 规范
CommonJS 规范的提出,主要是为了弥补当前 JavaScript 没标准的缺陷。CommonJS 规范为js制定了两个美好的愿景,希望js能在任何地方运转。CommonJS 规范对模块的定义十分简单模块引用模块定义模块标识他们选用 require()引入外部模块时,选用的就是模块标识,他们能通过模块标识来找出选定的模块核心模块的标识就是模块的名字文档模块的标识就是文档的方向(绝对、相对),相对方向选用. 或..开头
五、包 Package
1、概要
CommonJS 的包规范允许我们将一组相关的模块组合到一起,形成一组完整的工具。CommonJS 的包规范由包结构和包描述文档两个部分组成包结构:用于组织包中的各种文档包描述文档:描述包的相关信息,以供外部读取分析
2、包结构
包实际上就是两个压缩文档,解压以后还原为产品目录。
符合规范的产品目录,应该包含如下文档:
package.json 描述文档
{“dependecies”:{},//依赖”description”:”描述”,”devDependencies”:{ //合作开发依赖…} …”version”:”v1.0.0″}
bin 可继续执行二进制文档
lib js标识符
doc 文档
test 单元测试
3、包描述文档
包描述文档用于表达非标识符相关的信息,它是两个 JSON 格式的文档——package.json,位于包的根产品目录下,是包的重要组成部分
package.json 中的字段(不能写注释)
namedescriptionversionkeywordsmaintainerscontributorsbugslicensesrepositoriesdependencieshomepageoscpuenginebuiltindirectoriesimplementsscriptsauthorbinmaindevDependencies
标识依赖运转/打包
通过 npm run
六、NPM(Node Package Manager)
1、简介
CommonJS 包规范是理论,NPM 是其中一种实践对于 Node 而言,NPM 帮助其完成了第三方模块的发布、安装和依赖等。借助 NPM,Node 与第三方模块之间形成了很好的两个生态控制系统。
2、NPM指示
npm -v 查看 npm 版本npm version 查看大部份模块版本npm 帮助说明npm init 在pkg下建立 package.json 文档,驼峰命名改为连接npm search 包名搜索包npm install/i 包名安装包,将会在pkg的 nodemodules 下,间接通过包名引入即可,var math = require(“math”)npm install 包名-g 全局安装包,一般都是许多工具npm remove/r 包名删掉两个模块npm install 包名–save安装包并将其加进到依赖中,一般不传nodemodules,太大、不能保证是最新的,有了依赖,传 package.json 间接 npm install 能下载当前项目所依赖的包npm uninstall 包名卸载包npm install 文档方向从本地安装npm install 包名-registry=地址从镜像源安装包npm config set registry 地址设置镜像源
淘宝镜像:https://npm.taobao.org
一般不间接设置官方原版 npm 替换为其他源,能选用 cnpm
npm install -g cnpm –registry=https://registry.npm.taobao.org
注:Node 在选用模块名字来引入模块时,它会具体来说在当前产品目录的 nodemodules 中找寻是否含有该模块,假如有则间接选用,假如没则去上二级产品目录的 nodemodules 中找寻,假如有则间接选用,假如没则再去上二级产品目录找寻,晓得找出年末,假如找到磁盘根产品目录仍没,则收起。
七、Buffer(缓冲区)
Buffer 的就结构和数组很像,操作的方法也和数组类似
数组中不能存储二进制的文档,而buffer就是专门用来存储二进制数据的
选用 buffer 不须要引入模块,间接选用即可
var str =”hello”//将两个字符串保存到buffer中var buf = Buffer.from(str)console.log(buf)console.log(buf.length,str.length)//占用内存的大小,字符串的长度
在 buffer 中存储的都是二进制数据,但是在表明的时候都是以16进制的形式表明的,buffer 中每两个元素的范围是从00到ff(0255)00000000111111118位(bit)= 1字节 byte,buffer 中的两个元素占用内存的两个字节 ps:两个汉字3字节,两个英文字母1字节
buffer 的大小一旦确定,则不能修改,Buffer实际上是对底层内存的间接操作
Buffer.from(str)将两个字符串转为bufferBuffer.alloc(size)建立两个选定大小的bufferBuffer.allocUnsafe(size)建立两个选定的大小的buffer,但是可能包含敏感数据buf.toString()将buffer里的数据转为字符串
//建立两个选定大小的buffervar buf = new Buffer(10)//10个字节的buffer// buffer构造函数都是不推荐选用的var buf2= Buffer.alloc(10)//全都是00buf2[0]= 88buf2[1]= 255buf2[2]= 0xaabuf2[3]= 556//1000101100截取后八位buf2[10]= 15//没改变//只要数字在控制台或页面中输出一定是10进制console.log(buf2[2])console.log(buf2[2].toString(16))//能这种转为16进制表明var buf3= Buffer.allocUnsafe(10)//建立两个选定大小的buffer,但是buffer中可能含有敏感数据,不全为00
https://nodejs.cn
八、文档控制系统(File System)
1、概要
文档控制系统简单来说就是通过 Nodejs 来操作控制系统中的文档
在 Node 中,与文档控制系统的交互是非常重要的,服务器的本质就是将本地的文档发送给远程的客户端
Node通过fs模块来和文档控制系统进行交互
fs 模块提供更多了许多标准文档出访API来关上、读取、写入文档,以及与其交互
要选用文档控制系统,须要先引入fs模块,fs 是核心模块,间接引入不须要下载;要选用fs模块,具体来说须要对其进行加载const fs = require(“fs”)
2、同步和异步初始化
fs 模块中大部份的操作都有两种形式可供选择,同步 fs.xxx 和异步 fs.xxxSync
同步文档控制系统会阻塞流程的继续执行,也就是除非操作完毕,否则不会向下继续执行标识符
异步文档控制系统不会阻塞流程的继续执行,而是在操作完成时,通过回调函数将结果返回
3、同步、异步文档写入
同步文档的写入
操作步骤
关上文档
fs.openSync(path, flags[, mode])path 要关上文档的方向flags 关上文档要做的操作的类型:r 只读的、w 可写的mode 设置文档的操作权限,一般不传返回值:返回两个文档的描述符,能通过该描述符来对文档进行各种操作var fs = require(“fs”);var fd = fs.openSync(“hello.txt”,”w”);// console.log(fd)
向文档中写入内容
fs.writeSync(fd, string[, position[, encoding]])fd 文档的描述符,须要传递要写入的文档的描述符string 要写入的内容position 写入的起始边线encoding 写入的编码,默认 utf-8fs.writeSync(fd,”这是写入的内容”)
保存并关闭文档
fs.closeSync(fd)fd 要关闭的文档的描述符
异步文档写入
fs.open(path, flags[, mode], callback)
用来关上两个文档异步方法没返回值,有返回值的都是同步方法。异步初始化的方法,结果都是通过回调函数参数返回的。callback 回调函数两个参数 arguements:err 错误对象,假如没错误则为nullfd 文档的描述符
var fs = require(“fs”)var ffs.open(“hello.txt”,”w”,function(err, fd){// console.log(回调函数中的标识符)// callback中的标识符会在读取完毕之后继续执行if(!err){f = fd}else{console.log(err)}})console.log(“open 下的标识符”)//能比上面的更早继续执行
fs.write(fd, string[, position[, encoding]], callback)
用来异步写入两个文档
fs.close(fd, callback)
用来关闭文档
var fs = require(“fs”)fs.open(“hello.txt”,”w”,function(err, fd){if(!err){fs.write(fd,”这是异步写入的内容”,function(err){if(!err){console.log(写入成功)}fs.close(fd, function(err){if(!err){console.log(文档已关闭)}})})}else{console.log(err)}})
4、简单文档写入
fs.writeFile(file, data[, options], callback)
file 要操作的文档的方向
data 要写入的数据
options 选项,能对写入进行许多设置,是两个对象{encoding, mode, flag}
encoding:utf8mode:0o666flag:w一般用 r 只读、w 可写、a 追加
callback 当写入完成以后继续执行的函数
var fs = require(fs)//方向也能C:/Users/Shinlo/Desktop/hello.txtfs.writeFile(“C:\\Users\\Shinlon\\Desktop\\hello.txt”,”这是通过writeFile写入的内容”,{flag:”a”}, function(err){if(!err){console.log(写入成功)}else{console.log(err)}})
fs.writeFileSync(file, data[, options])
同步简单写入
5、流式文档写入
同步、异步、简单文档的写入都不适合大文档的写入,性能较差,容易导致内存溢出
流式文档写入
fs.createWriteStream(path[, options])
能用来建立两个可写流path 文档方向options 配置的参数
var fs = require(“fs”)var ws = fs.createWriteStream(“hello.txt”)//能通过监听流的open和close事件来监听流的关上和关闭// ws.on(“open”, function{// on绑定一个长期有效的事件ws.once(“open”, function{// once绑定一次性的事件,在触发一次之后事件自动失效console.log(“流关上了”)})ws.once(“close”, function{console.log(“流关闭了”)})//通过ws向文档中输出内容ws.write(“通过可写流写入文档的内容1”)ws.write(“通过可写流写入文档的内容2”)ws.write(“通过可写流写入文档的内容3”)//只要流还存在就能接着写入//关闭流// ws.close()//那个在传入的方向断开流,文档没到管子里ws.end()//在传出的这一方断开流,数据已经在管子里了
6、文档的读取
同步文档读取
异步文档读取
简单文档读取
fs.readFile(path[, options], callback)fs.readFileSync(path[, options])path 要读取的文档的方向options 读取的选项callback 回调函数,通过回调函数将读取到的内容返回err 错误对象data 读取到的数据,会返回两个 Buffervar fs = require(“fs”)var path=”C:/Users/Shinlon/a.mp3″fs.readFile(“hello.txt”, function(err, data){if(!err){console.log(data)// buffer通用性更高// console.log(data.toString())文本能,其他不行fswriteFile(“hello.mp3”, data, function(err){if(!err){console.log(“文档写入成功”)}})}})
流式文档读取
流式文档读取也适用于许多比较大的文档,能分多次将文档读取到内存中fs.createReadStream(path[, options])
var fs = require(“fs”)//建立两个可读流var rs = fs.createReadStream(“an.jpg”)//监听流的开启和关闭rs.once(“open”, function(){console.log(“可读流关上了”)})rs.once(“close”, function(){console.log(“可读流关闭了”)})//读取两个可读流中的数据,必须要为可读流绑定两个data事件,data事件绑定完毕,它会自动开始读取数据rs.on(“data”, function(data){console.log(data)//参数就是数据 data.length最大65536字节})
可读流、可写流复制两个大文档
var fs = require(“fs”)var rs = fs.createReadStream(“an.jpg”)var ws = fs.createWriteStream(“an.jpg”)rs.once(“open”, function(){console.log(“可读流关上了”)})rs.once(“close”, function(){console.log(“可读流关闭了”)//数据读取完毕,关闭可写流ws.end()})ws.once(“open”, function(){console.log(“可写流关上了”)})ws.once(“close”, function(){console.log(“可写流关闭了”)})rs.on(“data”, function(data){ws.write(data)})
简单的方式
var fs = require(“fs”)var rs = fs.createReadStream(“an.jpg”)var ws = fs.createWriteStream(“an.jpg”)rs.once(“open”, function(){console.log(“可读流关上了”)})rs.once(“close”, function(){console.log(“可读流关闭了”)})ws.once(“open”, function(){console.log(“可写流关上了”)})ws.once(“close”, function(){console.log(“可写流关闭了”)})// pipe()能将可读流中的内容间接输出到可写流中rs.pipe(ws)
7、fs 的其他方法
验证方向是否存在
fs.exists(path, callback)fs.exitsSync(path)
var fs = require(“fs”)var isExists = fs.exitsSync(“a.mp3”)// console.log(isExists)
fs.stat(“a.mp3”, function(err, stat){console.log(stat)})
stat参数的许多属性、方法size 大小
删掉文档
fs.unlink(path, callback)fs.unlinkSync(path)
fs.unlinkSync(“hello.txt”)
列举文档
fs.readdir(path[, options], callback)读取两个产品目录的产品目录结构fs.readdirSync(path[, options])files是两个字符串数组,每两个元素就是两个文档夹或文档的名字
fs.readdir(“.”, function(err, files){if(!err){console.log(files)}})
截断文档
fs.truncate(path, len, callback)将文档修改为选定的大小fs.truncateSync(path, len)
fs.truncateSync(“hello.txt”,3)
建立产品目录
fs.mkdir(path[,mode], callback)fs.mkdirSync(path[, mode])
fs.mkdirSync(“hello”)
删掉产品目录
fs.rmdir(path, callback)fs.rmdirSync(path)
fs.rmdirSync(“hello”)
重命名文档和产品目录
fs.rename(oldPath, newPath, callback)fs.renameSync(oldPath, newPath)oldPath 旧的方向newPath 新的方向callback 回调函数
fs.rename(“a.mp3″,”new.mp3”, function(err){if(!err){console.log(“succece”)}})
监视文档更改写入
fs.watchFile(filename[, options], listener)filename 要监视的文档的名字options 配置选项listener 回调函数,当文档发生变化时,回调函数会继续执行curr 当前文档的状态prev 修改前文档的状态这两个对象都是stats对象
fs.watchFile(“hello.txt”, function{console.log(prev.size)console.log(curr.size)})
时间间隔,配置选项中
fs.watchFile(“hello.txt”,{interval:1000}, function{console.log(prev.size)console.log(curr.size)})