NODE
常用指令
dir 列出当前目录下的所有文件
cd 目录名 进入到指定的目录
md 目录名 创建一个文件夹
rd 目录名 删除一个文件夹
目录
. 表示当前目录
.. 表示上一级目录
环境变量(window系统变量)
当我们在命令行窗口打开一个文件,或调用一个程序时,系统会首先在当前目录下寻找文件程序
如果找到了则直接打开
如果没有找到则会一次到环境变量path的路径中寻找,知道找到位置
如果没找到则报错
所以我们可以将一些经常需要访问得程序和文件的路径添加到path中
这样我们就可以在任意位置来访问这些文件和程序了
进程和线程
进程
- 进程负责为程序的运行提供必备的环境
- 进程就相当于工厂中的车间
线程
- 线程是计算机中最小的计算单位,线程负责执行进程中的程序
- 线程就相当于工厂中的工人
单线程
- JS是单线程
多线程
Node.js
- Node.js是一个能够在服务器端运行的JavaScript的开放源代码,跨平台JavaScript运行环境
- Node采用Google开发的V8引擎运行js代码,使用事件驱动 非阻塞和异步I/O模型等技术来提高性能,可优化应用程序的传输量和规模
- Node大部分基本模块都用JavaScript编写,在Node出现之前,JS通常作为客户端程序设计语言使用,以JS写出的程序常在用户的浏览器上运行
- 目前,Node已被IBM Microsoft Tahoo! Waalmart Groupon SAP LinkedIn Rakuten PayPal Voxer GoDaddy等企业采用
I/O
- I/O操作指的是对磁盘的读写操作
Node
- Node是对ES标准的一个实现,Node也是一个JS引擎
- 通过Node可以使js代码在服务器端执行
- Node仅仅对ES标准进行了实现,所以在Node中不包含DOM和BOM
- Node中可以使用所有的内建对象
- String number Boolean Math Date RegExp Function Object Array而BOM和DOM都不能使用
- 但是可以使用console也可以使用定时器(setTimeout() setInterval())
- Node可以在后台来编写服务器
- Node编写服务器都是单线程的服务器
- 进程
- 进程就是一个一个的工作计划
- 线程
- 线程是计算机最小的运算单位,线程是干活的
- 传统的服务器都是多线程的
- 每进来一个请求,就创建一个线程去处理请求
- Node的服务器单进程
- Node处理进程时是单线程,但是在后天拥有一个I/O线程池
模块化
- 在Node中,一个js文件就是一个模块
- 在Node中,每一个js文件中的js代码都是独立运行在一个函数中,而不是全局作用域,所以一个模块中的变量和函数在其他模块中无法访问
向外部暴露属性或方法
- 在js文件中 想要一个变量被其他模块所访问
- 我们可以通过exports来向外部暴露变量和方法
- 只需要将需要暴露给外部的变量或方法设置为exports属性即可
CommonJS规范
- CommonJS规范的提出,主要是为了弥补当前JavaScript没有标准的缺陷
- CommonJS规范为JS指定了一个美好的愿景,希望JS 能够在任何地方运行
- CommonJS对模块的定义十分简单
- 模块引用
- 模块定义
- 模块识别
定义一个模块math
- 在该模块中提供两个方法
add(a,b);//求两个数的和
mul(a,b);//求两个数的积
引入其他的模块
- 在node中,通过require()函数来引入外部的模块,require()可以传递一个文件的路径作为参数,node将会自动根据该路径来引入外部模块,这里路径,如果使用相对路径,必须以.或..开头
- 使用require()引入模块以后,该函数会返回一个对象,这个对象代表的是引入的模块
- 我们使用require()引入外部模块时,使用的就是模块表识,我么可以通过模块标识来找到指定的模块
实际上模块中的代码都是包装在一个函数中执行的,并且在函数执行时,同时传递进了5个实参
- exports
- 该对象用来将变量或函数暴露到外部
- require
- 函数,用来引入外部的模块
- module
- module代表的是当前模块本身
- exports就是module的属性
- 既可以使用exports导出,也可以使用module.exports导出
- _filename
- 当前文件的完整路径
- _dirname
- 当前文件所在文件夹的命令
NPM
- CommonJS包规范是理论,NPM是其中一种实践
- 对于Node而言,NPM帮助其完成了第三方模块的发布、安装和依赖等,借助NPM、Node与第三方模块之间形成了很好打的一个生态系统
NPM命令
- npm -v
- 查看版本
- npm
- 帮助说明
- npm search 包名
- 搜索模块包
- npm install/i 包名
- 在当前目录安装包
- npm install 包名 -g
- 全局模式安装包(全局安装的包一般都是一些工具)
- npm remove/r 包名
- 删除一个模块
- npm install 包名 --save
- 安装包并添加到依赖中 ***
- npm install
- 下载当前项目所依赖的包
- npm install 文件路径
- 从本地安装
- npm install 包名 -registry=地址
- 从镜像源安装
- npm config set registry 地址
- 设置镜像源
安装node npm
www.liaoxuefeng.com/wiki/102291…
通过npm下载的包都放到node_modules文件夹中,我们通过npm下载的包,直接通过包名引入即可
- node在使用模块名字来银日模块时,他会首先在当前目录的node_modules中寻找是否含有该模块
- 如果有则直接使用,如果没有则去上一级目录的node_modules中寻找
- 如果有则直接使用,如果没有则再去上一级目录寻找,回到找到为止
- 直到找到磁盘的根目录,如果依然没有,则报错
Buffer(缓冲区)
- Bufferde的结构和数组很像,操作的方法也和数组类似
- 数组中不能存储二进制的文件,而buffer就是专门用来存储二进制数据
- 使用buffer不需要引入模块,直接使用即可
- 在buffer中存储的都是二进制数据,但是显示时都是以16进制的形式显示
- buffer中每一个元素的范围是从00-ff
-
从结构上看Buffer非常像一个数组,它的元素为16进制的两位数
-
实际上一个元素就表示内存中的一个字节
-
实际上Buffer中的内存不是通过JavaScript分配的,而是在底层通过C++申请的
-
也就是我们可以直接通过Buffer来创建内存中的空间
-
创建一个指定大小的buffer
-
buffer构造函数都是不推荐使用的
输入0xaa 十六进制 直接输出aa
输入大于255的数字 变成2进制超过8位 只保留后8位
只要数字在控制台或页面中输出一定是10进制
- 如果不输出为指定10进制则无法分辨为什么进制的结果
强制输出16进制(数字做不到 其他字符可以)
遍历
遍历结果为十进制
Buffer.allocUnsafe(size) 创建一个指定大小的buffer,但是buffer中可能含有敏感数据
图片中后面也是有数据的
- allocUnsafe 性能比 alloc好
- 因为alloc在创建内存时候会清空数据 而allocUnsafe不会
总结Buffer
- Buffer.from(str) 将一个字符串转换为buffer
- Buffer.alloc(size) 创建一个指定大小的Buffer
- Buffer.allocUnsafe(size) 创建一个指定大小的Buffer,但是可能包含敏感数据
- buf.toString()将缓冲区中的数据转换为字符串
fs(文件系统)
- 在Node中,与文件系统的交互是非常重要的,服务器的本质就将本地的文件发送给远程的客户端
- Node通过fs模块来和文件系统进行交互
- 该模块提供了一些标准文件访问API来打开、读取、写入文件,以及与其交互
- 要使用过fs模块,首先需要对其进行加载 -const fs = require("fs");
- 文件系统(File System)
- 文件系统简单来说就是通过Node来操作系统中的文件
- 使用文件系统,需要先引入fs模块,fs是核心模块,直接引入不需要下载
同步和异步调用
-
fs模块中的所有的额操作都有两种形式课供选择同步和异步
-
同步文件系统会阻塞程序的执行,也就是除非操作完毕,否则不会向下执行代码.
-
异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回
-
同步文件的写入
- 手动操作的步骤
-
1.打开文件
- fs.openSync(path,flags[, mode])
- path 要打开文件的路径
- flags 打开文件要做的操作类型
- r 只读的
- w 可写的
- mode 设置文件的操作权限,一般不传
- 返回值:
- 该方法会返回一个文件的描述符作为结果,我们可以通过描述符来对文件进行各种操作
- fs.openSync(path,flags[, mode])
-
2.向文件中写入内容
- fs,writeSync(fd,string[,position[,encoding]])
- fd 文件的描述符,需要传递要写入的文件的描述符
- sring 要写入的内容
- position 写入起始位置 一般不传
- encoding 写入的编码 默认utf-8 一般不传
- fs,writeSync(fd,string[,position[,encoding]])
-
3.保存并关闭文件
- fs.closeSync(fd)
-
fd 要关闭的文件的描述符
-
- fs.closeSync(fd)
-
- 手动操作的步骤
- 异步文件的写入
- 1.打开文件
- fs.open(path,flags[,mode],callback)
- 用来打开一个文件
- 异步调用的方法,结果都是通过回调函数的参数返回的
- 回调函数有两个参数:
- err 错误对象,如果没有错误则为null
- fd 文件的描述符
- fs.open(path,flags[,mode],callback)
- 2.写入文件
- fs.write(fd,string[,position[,encoding]],callback)
- 用于异步来写入一个文件
- fs.write(fd,string[,position[,encoding]],callback)
- 3.关闭文件
- fs.close(fd,callback)
- 用来关闭文件
- fs.close(fd,callback)
- 1.打开文件
- 简单文件的写入
- fs.writeFile(file,data[,options],callback)
- fs.writeFileSync(file,data[,options])
-
file 要操作的文件的路径
-
data 要写入的数据
-
option 选项,可以对写入进行一些设置
-
callback 当写入完成以后执行的函数
-
1
异步文件没有返回值 只要有返回值一定是同步的
同步、异步、简单文件的写入都不适合大文件的写入,性能较差,容易导致内存溢出
- 流式文件写入
- fs.createWriteStream(path[,options])
- 创建一个可写流
- path 文件路径
- options 配置的参数
- fs.createWriteStream(path[,options])
文件读取
- 1.同步文件读取
- 2.异步文件读取
- 3.简单文件读取
- fs.readFile(path[,options],callback)
- fs.readFileSync(path[,options])
- path 要读取的文件的路径
- options 读取的选项
- callback 回调函数,通过回调函数将读取到内容返回
- err 错误对象
- data 读取到的数据,会返回一个Buffer
- 获取一个文件并在指定位置创建并写入
- 4.流入文件读取
- 流式文件读取也适用于一些比较大的文件,可以分多次将文件读取到内存中
简单写法: