Node.js初识
1.命令行窗口(小黑屏),CMD窗口,终端,shell
-
开始菜单---->运行---->CMD---->回车
-
常用命令:
dir列出当前目录下的所有文件
cd 目录名 进入指定的目录
md 目录名 创建一个文件夹
rd 目录名 删除一个文件夹 -
目录
.表示当前目录
…(两个点) 表示上一级目录 -
环境变量(windows系统中变量)----path
-
当我们在命令窗口中打开一个文件,或者调用一个程序时,系统会首先在当前目录下寻找文件程序,如果找到则直接打开,如果没有找到则依次到环境变量path路径中寻找,直到找到为止,找不到则报错。
-
可以将一些常用的文件或者程序路径添加到path下,这样我们可以在任意位置访问这些文件了。
2.线程和进程 -
进程:进程负责为程序的运行提供必备环境(相当于工厂中的车间)
-
线程:它是计算机中的最小计算单位,它负责执行进程中的程序(相当于工厂中的工人)
3.node中的模块引入
在node中,通过require()函数来引入外部模块,require()可以传递一个文件的路径作为参数,node将会自动根据路径来引入外部模块,使用require()引入模块以后,该函数返回一个对象,这个对象代表的是引入的模块。
4.模块化
- 在Node中,一个JS文件就是一个模块
- 在Node中,每一个JS文件中的JS代码都是独立运行在一个函数中,而不是全局作用域,所以一个模块中的变量和函数在其他的模块中无法访问
- 可以通过exports来向外部暴露变量和方法(只需要将暴露给外部的变量或者方法设置为exports属性即可。)
- 模块分为两大类:(1)核心模块:由node引擎提供的模块,核心模块的标识就是模块的名字 (2)文件模块:由用户自己创建的模块 ,文件模块的标识就是文件的路径(相对路径,绝对路径)
- 模块的标识:模块的标识就是模块的名字或者路径,node通过模块的标识寻找模块,对于核心模块(npm中下载的模块),直接使用模块的名字对其引入,
var fs=require("fs")
,对于自定义的文件模块,需要通过文件的路径将其引入var router=require("./router")
。
5.Node中的全局变量
在node中有一个全局对象global,它的作用类似于javascript中的windows类似,在全局中创建的变量或者方法都会作为global的属性或者方法保存。
6.Node中的隐形函数
- 当node在执行模块中的代码时,它会首先添加如下代码,即将所有的代码放在这个函数中:
function(exports,require,module,_filename,_dirname){
}
-
传入的5个参数即:
(1)exports:该对象用来将变量或者函数暴露到外部
(2)require:用来引入外部的模块
(3)module:代表当前模块本身,exports就是module的属性(既可以用exports导出,友可以用module.exports导出)
(4)_filename:当前模块的完整路径
(5)_dirname:当前模块所在文件夹的完整路径 -
exports和module.exports的区别
通过exports只能使用.的方式来向外部暴露内部变量(exports.&&&=&&&),而module.exports既可以通过.的形式,也可以直接赋值(module.exports.&&&=&&&,module.exports={}).
7.包结构
-
包实际上就是一个压缩文件,解压以后还原为目录。符合规范的目录,应该包含如下的文件:
(1)package.json 描述文件 (必须要有的文件)
(2)bin 可执行二进制文件
(3)lib js代码
(4)doc 文档
(5)test 单元测试 -
npm常用命令
(1) npm -v 查看npm的版本
(2) npm version 查看所有模块的版本
(3) npm search 包名 搜索包
(4) npm install / i 包名 安装包
(5) npm remove / r包名 删除包
(6) npm install 包名 --save 安装包并添加到依赖中
(7) npm install 下载当前项目所依赖的包
(8) npm install 包名 -g 全局安装包(全局安装的包一般是一些工具)
通过npm下载的包都放到node_modules文件夹中(我们直接通过包名引入即可),node在使用模块名引入模块时,它会首先在当前目录的node_modules中寻找是否含有该模块,如果有,则直接使用,如果没有,则去上一级的node_modules中寻找,如果有则直接使用,如果没有,则再去上一级目录中寻找,直到找到磁盘的根目录,如果依然没有,则报错。
8.Buffer(缓冲区)
Buffer的结构和数组很像,操作方法也和数组类似,但数组中不能存储二进制的文件,而Buffer就是专门用来存储二进制数据,使用Buffer不需要引入模块,直接使用即可,在Buffer中存储的都是二进制数据,但在显示时都以十六进制的形式显示。
- Buffer的创建及使用
var buf=Bufer.alloc(size);//创建一个指定大小的Buffer
var buf3=Buffer.allocUnsafe(10);//创建一个指定大小的Buffer,但Buffer中可能含有敏感的数据
Buffer.from(str);//将一个字符串转化为一个Buffer
Buffer.tostring();//将缓冲区中的数据转换为字符串
9.fs (文件系统)
1.在node中,与文件系统的交互是非常重要的,服务器的本质就是将本地的文件发送给远程的客户端。
2.node通过fs模块来将文件系统进行交互
3.该模块读入了一些标准的文件访问API来打开,读取,写入文件,以及与其交互
4.要使用fs模块,首先要对其进行加载const fs=require("fs");
5.fs模块中所有的操作都有两种形式可供选择------同步,异步。
6.同步文件系统会阻塞程序的执行,也就是除非操作完毕,否则不会向下执行代码。
7.异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回。
- 同步文件的写入(操作步骤)
1.打开文件
fs.opensync(path,flags,mode)
@ path:要打开文件的路径
@flags:打开文件要做的操作类型(r–只读的 w–可写的)
@mode:设置文件的操作权限,一般不传
–>返回值:该方法返回一个文件的描述做为结果,我们可以通过该描述对文件进行各种操作。
2.向文件中写入内容
fs.writesync(fd,string,position,encoding)
@fd 文件的描述符,需要传递要写入的文件的描述符
@string 要写入的内容
@position 写入的起始位置
@encoding 写入的编码,默认UTF-8
3.保存并关闭文件
fs.closeSync(fd)
@fd 要关闭的文件的描述符
- 异 步文件写入
1.操作跟同步文件一样,但异步调用的方法,结果都是通过回调函数的参数返回的
//打开文件
fs.open("hello2.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);
}
});
- 简单文件写入
fs.writeFile(file,data,options,callback)
fs.writeFilesync(file,data,options)
@file 要操做文件的路径
@data 要写入的数据
@options 可选项,可以对写入进行一些设置
@callback 当写入完成以后执行函数
var fs=require("fs");
fs.writeFile("hello3.tex","这是通过writeFile写入的内容",function(err){
if(!err){
console.log("写入成功~~");
}
});
- 流式文件写入(适用于较大文件)
同步,异步,简单文件的写入都不适合大文件的写入,性能较差,容易导致内存溢出
var fs=require("fs");
//文件流写入,首先创建一个可写流
//fs.creatWriteSteam(path,options)-----@path 文件路径 @options 配置的参数
var ws=fs.creatWriteSteam("hello3.tex");
//可以通过监听流的open和close事件来监听流的打开和关闭
ws.once("open",function(){
console.log("流打开了~~");
});
ws.once("close",function(){
console.log("流关闭了~~");
});
//通过ws向文件中输出内容
ws.write("通过可写流写入文件的内容");
ws.write("今天天气好晴朗");
//关闭流
ws.end();