【nodejs】node入门基础知识

目录

1.命令行窗口

2.node简介

3.模块化

4.exports和module.exports

5.包简介

6.npm简介

7.配置cnpm

8.node搜索包的流程

9.buffer缓冲区

10.同步文件写入

11.异步文件写入

12.简单文件写入

13.流式文件写入

14.简单文件读取

15.流式文件读取

16.fs模块的其他方法


 

 

1.命令行窗口

1.命令行窗口(小黑屏)、CMD窗口、终端、shell
	- 开始菜单 --> 运行 --> CMD --> 回车
	- 常用的指令:
		dir 列出当前目录下的所有文件
		cd 目录名 进入到指定的目录
		md 目录名 创建一个文件夹
		rd 目录名 删除一个文件夹	

	- 目录
		. 表示当前目录
		.. 表示上一级目录
		
	- 环境变量(windows系统中变量)	
		path
			C:\work\jdk\jdk1.7.0_75/bin;
			%CATALINA_HOME%/bin;
			C:\work\soft\tools\AppServ\Apache24\bin;
			C:\work\soft\tools\AppServ\php5;
			C:\Users\lilichao\AppData\Local\Programs\Fiddler;
			C:\work\environment\Egret\Egret Wing 3\bin;
			C:\Users\lilichao\AppData\Roaming\npm;
			C:\Program Files\MongoDB\Server\3.2\bin;
			C:\Users\lilichao\Desktop\hello
			
		- 当我们在命令行窗口打开一个文件,或调用一个程序时,
			系统会首先在当前目录下寻找文件程序,如果找到了则直接打开
			如果没有找到则会依次到环境变量path的路径中寻找,直到找到为止
			如果没找到则报错
			

		- 所以我们可以将一些经常需要访问的程序和文件的路径添加到path中,
			这样我们就可以在任意位置来访问这些文件和程序了
			

2.node简介

Node.js是一个能够在服务器端运行JavaScript的开放源代码、
跨平台 JavaScript运行环境
Node采用Google开发的V8引擎运行js代码,使用 事件驱动
非阻塞 异步I/O模型 等技术来提高性能,可优化应用程序的传
输量和规模。
Node大部分基本模块都用JavaScript编写。在Node出现之前,
JS通常作为客户端程序设计语言使用,以JS写出的程序常在用
户的浏览器上运行。
目前,Node已被IBM、Microsoft、Yahoo!、Walmart、
Groupon、SAP、 LinkedIn、Rakuten、PayPal、Voxer和
GoDaddy等企业采用。
Node的用途
Web服务API,比如REST
实时多人游戏
后端的Web服务,例如跨域、服务器端的请求
基于Web的应用
多客户端的通信,如即时通信

I/O (Input/Output)
	- 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线程池
	

3.模块化

 02.module.js

/*
	模块化
		- 在Node中,一个js文件就是一个模块
		- 在Node中,每一个js文件中的js代码都是独立运行在一个函数中
			而不是全局作用域,所以一个模块的中的变量和函数在其他模块中无法访问
 */

console.log("我是一个模块,我是02.module.js");


/*
我们可以通过 exports 来向外部暴露变量和方法
	只需要将需要暴露给外部的变量或方法设置为exports的属性即可

* */
//向外部暴露属性或方法

exports.x = "我是02.module.js中的x";
exports.y = "我是y";
exports.fn = function () {

};

03.module.js 

//引入其他的模块
/*
	在node中,通过require()函数来引入外部的模块
		require()可以传递一个文件的路径作为参数,node将会自动根据该路径来引入外部模块
		这里路径,如果使用相对路径,必须以.或..开头

	使用require()引入模块以后,该函数会返回一个对象,这个对象代表的是引入的模块

	我们使用require()引入外部模块时,使用的就是模块标识,我们可以通过模块标识来找到指定的模块
	- 模块分成两大类
		核心模块
			- 由node引擎提供的模块  (fs)
			- 核心模块的标识就是,模块的名字
		文件模块
			- 由用户自己创建的模块
			- 文件模块的标识就是文件的路径(绝对路径,相对路径)
				相对路径使用.或..开头

 */
//var md = require("./02.module");
var math = require("./math");
var fs = require("fs");

//console.log(md);
console.log(math.add(123,456));
//console.log(fs);

math.js 

/*
	定义一个模块 math
		- 在该模块中提供两个方法
			add(a , b); //求两个数的和
			mul(a , b); //求两个数的积
 */
module.exports.add = function (a , b) {
	return a+b;
};

module.exports.mul = function (a , b) {
	return a*b;
};

var a = 10;

/*
	在node中有一个全局对象 global,它的作用和网页中window类似
		在全局中创建的变量都会作为global的属性保存
		在全局中创建的函数都会作为global的方法保存

	当node在执行模块中的代码时,它会首先在代码的最顶部,添加如下代码
 			function (exports, require, module, __filename, __dirname) {

 	在代码的最底部,添加如下代码
 			}

 	实际上模块中的代码都是包装在一个函数中执行的,并且在函数执行时,同时传递进了5个实参
		 exports
		 	- 该对象用来将变量或函数暴露到外部

		 require
		 	- 函数,用来引入外部的模块

		 module
		 	- module代表的是当前模块本身
		 	- exports就是module的属性
		 	- 既可以使用 exports 导出,也可以使用module.exports导出

		 __filename
 			C:\Users\lilichao\WebstormProjects\class0705\01.node\04.module.js
 			- 当前模块的完整路径

	  	 __dirname
 			C:\Users\lilichao\WebstormProjects\class0705\01.node
 			- 当前模块所在文件夹的完整路径

* */
//console.log(global.a);

/*
	arguments.callee
		- 这个属性保存的是当前执行的函数对象
* */
//console.log(arguments.callee + "");
//console.log(arguments.length);

//console.log(exports);
//console.log(module.exports == exports);

console.log(__dirname);

 

 

4.exports和module.exports

var hello = require("./helloModule");

/*
	exports 和 module.exports
		- 通过exports只能使用.的方式来向外暴露内部变量
			exports.xxx = xxx

		- 而module.exports既可以通过.的形式,也可以直接赋值
			module.exports.xxx = xxxx
			module.exports = {}
 */

console.log(hello.name);
console.log(hello.age);
hello.sayName();

 

/*
module.exports.name = "孙悟空";
module.exports.age = 18;
module.exports.sayName = function () {
	console.log("我是孙悟空~~~");
};*/

//exports = module.exports

/*exports  = {
	name:"猪八戒",
	age:28,
	sayName:function () {
		console.log("我是猪八戒");
	}
};*/ //报错,exports = {}等于直接更改了变量,而module.exports={}只是更改了对象的属性

/*var a = 10;
var b = a;
a++;*/

// console.log("a = "+a); //11
// console.log("b = "+b);  //b

/*var obj = new Object();
obj.name = "孙悟空";
var obj2 = obj;
obj2.name = "猪八戒";

obj2 = null;

console.log("obj = "+obj.name); //猪八戒
console.log("obj2 = "+obj2);*/  //null

 

 

 

5.包简介

- 包(package)包实际上就是一个压缩文件,解压以后还原为目录。
		- 将多个模块组合为一个完整的功能,就是一个包
		- 包结构
			bin
				- 二进制的可执行文件,一般都是一些工具包中才有
			lib
				- js文件
			doc
				- 文档
			test
				- 测试代码
			package.json
				- 包的描述文件 (必需的)
				
		- package.json	(json文件不能写注释)
			- 用于表达非代码相关的信息,它是一个json格式的文件,在它里面保存了包各种相关的信息
				name 包名
				version 版本
				dependencies 依赖
				main 包的主要的文件
				bin 可执行文件
				...

 

 

 

6.npm简介

NPM(Node Package Manager)
CommonJS包规范是理论,NPM是其中一
种实践。
对于Node而言,NPM帮助其完成了第三
方模块的发布、安装和依赖等。借助NPM,
Node与第三方模块之间形成了很好的一个
生态系统。

 

	- npm(Node Package Manager node的包管理器)
		- 通过npm可以对node中的包进行上传、下载、搜索等操作
		- npm会在安装完node以后,自动安装
		- npm的常用指令
			npm -v 查看npm的版本
			npm version 查看所有模块的版本
			npm init 初始化项目(创建package.json)
			npm i/install 包名 安装指定的包
			npm i/install 包名 --save 安装指定的包并添加依赖
			npm i/install 包名 -g 全局安装(一般都是一些工具)
			npm i/install 安装当前项目所依赖的包
			npm s/search 包名 搜索包	
			npm r/remove 包名 删除一个包

 

 

 

7.配置cnpm

npm install cnpm -g --registry=https://registry.npm.taobao.org

 cnpm可以解决用npm下载速度慢的问题,配置好淘宝镜像后可以使用npm所有的指令,用法只是把npm换成cnpm

 

 

 

8.node搜索包的流程

/*
	通过npm下载的包都放到node_modules文件夹中
		我们通过npm下载的包,直接通过包名引入即可

	node在使用模块名字来引入模块时,它会首先在当前目录的node_modules中寻找是否含有该模块
		如果有则直接使用,如果没有则去上一级目录的node_modules中寻找
		如果有则直接使用,如果没有则再去上一级目录寻找,直到找到为止
		直到找到磁盘的根目录,如果依然没有,则报错

 */
var math = require("math");

console.log(math.add(123,456));

 

 

 

9.Buffer缓冲区

Buffer(缓冲区)
从结构上看Buffer非常像一个数组,它的元
素为16进制的两位数。
实际上一个元素就表示内存中的一个字节。
实际上Buffer中的内存不是通过JavaScript
分配的,而是在底层通过C++申请的。
也就是我们可以直接通过Buffer来创建内存
中的空间。

 

/*
	Buffer(缓冲区)
		- Buffer的结构和数组很像,操作的方法也和数组类似
		- 数组中不能存储二进制的文件,而buffer就是专门用来存储二进制数据
		- 使用buffer不需要引入模块,直接使用即可
		- 在buffer中存储的都是二进制数据,但是在显示时都是以16进制的形式显示
			buffer中每一个元素的范围是从00 - ff   0 - 255
			00000000 - 11111111

			计算机 一个0 或一个1 我们称为1位(bit)

			8bit = 1byte(字节)
			1024byte = 1kb
			1024kb = 1mb
			1024mb = 1gb
			1024gb = 1tb

			buffer中的一个元素,占用内存的一个字节

		- Buffer的大小一旦确定,则不能修改,Buffer实际上是对底层内存的直接操作

 */

var str = "Hello 尚硅谷";

//将一个字符串保存到buffer中
var buf = Buffer.from(str);

//console.log(buf.length); //占用内存的大小
//console.log(str.length);//字符串的长度
//console.log(buf);

//创建一个指定大小的buffer
//buffer构造函数都是不推荐使用的
//var buf2 = new Buffer(10);//10个字节的buffer
//console.log(buf2.length);

//创建一个10个字节的buffer
var buf2 = Buffer.alloc(10);
//通过索引,来操作buf中的元素
buf2[0] = 88;
buf2[1] = 255;
buf2[2] = 0xaa;
buf2[3] = 255;

//只要数字在控制台或页面中输出一定是10进制
//console.log(buf2[2].toString(16));

/*for(var i=0 ; i<buf2.length ; i++){
	console.log(buf2[i]);
}*/

//Buffer.allocUnsafe(size) 创建一个指定大小的buffer,但是buffer中可能含有敏感数据
/*var buf3 = Buffer.allocUnsafe(10);
console.log(buf3);*/

/*
	Buffer.from(str) 将一个字符串转换为buffer
	Buffer.alloc(size) 创建一个指定大小的Buffer
	Buffer.alloUnsafe(size) 创建一个指定大小的Buffer,但是可能包含敏感数据
 	buf.toString() 将缓冲区中的数据转换为字符串
 */

var buf4 = Buffer.from("我是一段文本数据");

console.log(buf4.toString());

 

 

 

10.同步文件写入

同步文件系统会 阻塞 程序的执行,也就是除非操作完毕,否则不会向下执行代码。

/*
	文件系统(File System)
		- 文件系统简单来说就是通过Node来操作系统中的文件
		- 使用文件系统,需要先引入fs模块,fs是核心模块,直接引入不需要下载

	同步文件的写入
		- 手动操作的步骤
			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 要关闭的文件的描述符



 */
var fs = require("fs");

//打开文件
var fd = fs.openSync("hello.txt" , "w");

//向文件中写入内容
fs.writeSync(fd , "今天天气真不错~~~", 2);

//关闭文件
fs.closeSync(fd);

console.log("程序向下执行~~~");

 

 

 

11.异步文件写入

异步文件系统 不会阻塞 程序的执行,而是在操作完成时,通过回调函数将结果返回。

 

/**
	异步文件写入
 fs.open(path, flags[, mode], callback)
 	- 用来打开一个文件
    - 异步调用的方法,结果都是通过回调函数的参数返回的
 	- 回调函数两个参数:
 		err 错误对象,如果没有错误则为null
 		fd  文件的描述符
 fs.write(fd, string[, position[, encoding]], callback)
 	- 用来异步写入一个文件

 fs.close(fd, callback)
 	- 用来关闭文件

 */

//引入fs模块
var fs = require("fs");


//打开文件
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);
	}
});

console.log("程序向下执行~~~");

 

 

 

12.简单文件写入

/*
	简单文件写入
	 fs.writeFile(file, data[, options], callback)
	 fs.writeFileSync(file, data[, options])
		- file 要操作的文件的路径
		- data 要写入的数据
		- options 选项,可以对写入进行一些设置
		- callback 当写入完成以后执行的函数

		- flag
			r 只读
			w 可写
			a 追加
 */
//引入fs模块
var fs = require("fs");

/*fs.writeFile("hello3.txt","这是通过writeFile写入的内容",{flag:"r+"} , function (err) {
	if(!err){
		console.log("写入成功~~~");
	}else{
		console.log(err);
	}
});*/


//C:\Users\lilichao\Desktop\hello.txt
//C:\\Users\\lilichao\\Desktop\\hello.txt

fs.writeFile("C:/Users/lilichao/Desktop/hello.txt","这是通过writeFile写入的内容",{flag:"w"} , function (err) {
	if(!err){
		console.log("写入成功~~~");
	}else{
		console.log(err);
	}
});

 

 

 

13.流式文件写入

/*
	同步、异步、简单文件的写入都不适合大文件的写入,性能较差,容易导致内存溢出
 */
var fs = require("fs");

//流式文件写入
//创建一个可写流
/*
	fs.createWriteStream(path[, options])
		- 可以用来创建一个可写流
		- path,文件路径
		- options 配置的参数
 */
var ws = fs.createWriteStream("hello3.txt");

//可以通过监听流的open和close事件来监听流的打开和关闭
/*
	on(事件字符串,回调函数)
		- 可以为对象绑定一个事件

	once(事件字符串,回调函数)
		- 可以为对象绑定一个一次性的事件,该事件将会在触发一次以后自动失效

* */
ws.once("open",function () {
	console.log("流打开了~~~");
});

ws.once("close",function () {
	console.log("流关闭了~~~");
});

//通过ws向文件中输出内容
ws.write("通过可写流写入文件的内容");
ws.write("今天天气真不错");
ws.write("锄禾日当午");
ws.write("红掌拨清清");
ws.write("清清真漂亮");

//关闭流
ws.end();

 

 

 

14.简单文件读取

/*
	1.同步文件读取
	2.异步文件读取
	3.简单文件读取
	 fs.readFile(path[, options], callback)
	 fs.readFileSync(path[, options])
	 	- path 要读取的文件的路径
	 	- options 读取的选项
	 	- callback回调函数,通过回调函数将读取到内容返回(err , data)
	 		err 错误对象
	 		data 读取到的数据,会返回一个Buffer

	4.流式文件读取
 */

var fs = require("fs");

var path = "C:/Users/lilichao/Desktop/笔记.mp3";

fs.readFile("an.jpg" , function (err , data) {
	if(!err){
		//console.log(data);
		//将data写入到文件中
		fs.writeFile("C:/Users/lilichao/Desktop/hello.jpg",data,function(err){
			if(!err){
				console.log("文件写入成功");
			}
		} );
	}
});

 

 

 

15.流式文件读取

/*
	流式文件读取也适用于一些比较大的文件,可以分多次将文件读取到内存中
 */

var fs = require("fs");

//创建一个可读流
var rs = fs.createReadStream("C:/Users/lilichao/Desktop/笔记.mp3");
//创建一个可写流
var ws = fs.createWriteStream("a.mp3");

//监听流的开启和关闭
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("可写流关闭了~~");
});

//如果要读取一个可读流中的数据,必须要为可读流绑定一个data事件,data事件绑定完毕,它会自动开始读取数据
rs.on("data", function (data) {
	//console.log(data);
	//将读取到的数据写入到可写流中
	ws.write(data);
});
/*
	流式文件读取也适用于一些比较大的文件,可以分多次将文件读取到内存中
 */

var fs = require("fs");

//创建一个可读流
var rs = fs.createReadStream("C:/Users/lilichao/Desktop/笔记.mp3");
//创建一个可写流
var ws = fs.createWriteStream("b.mp3");

//pipe()可以将可读流中的内容,直接输出到可写流中
rs.pipe(ws);

 

 

 

 

16.fs模块的其他方法

验证路径是否存在
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)
监视文件更改写入
fs.watchFile(filename[, options], listener)

 

 


版权声明:本文为weixin_58214412原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。