Node.js 基础知识 一

1,命令行窗口

1.1  打开命令窗口
----开始---》运行--》cmd--->回车。
或者
-----Win+R(快捷键打开查寻框)----》cmd----->回车。
1.2 常用简单命令
 - dir                              列出当前目录下的所有文件
 - cd  文件夹                 进入文件夹 (**快捷方法,输入文件夹的前几个字母,再按下tab键即可自动补全文件夹的名字**)
 - md  文件夹                 创建文件夹(make directory)
 - rd    文件夹                 删除文件夹 (remove directory)
 - 文件名                        打开文件(直接输入文件名,表示打开文件,如果在当前目录下存在相应文件的话,就会打开文件,如果不存在的话,就会去环境变量path所代表的目录下依次去找,如果还没打到,则报错。提示,某某不是命令)
 1.3 环境变量
         环境变量(window系统中的变量 )的意义,就是在任何一个目录下,都可以访问到环境变量所指定的目录下的文件(程序),所以,那些个npm命令,php ,java的命令才可以在任何一个目录下运行。(比如说,直接运行某个命令,或打开某个文件时,都会先在当前目录下寻找,没有的话,再去环境变量所配制的文件夹下寻找,还没有的话,就报错了)
	- 当我们在命令行窗口打开一个文件,或调用一个程序时,
	   系统会首先在当前目录下寻找文件程序,如果找到了则直接打开
		如果没有找到则会依次到环境变量path的路径中寻找,直到找到为止
		如果没找到则报错
	- 所以我们可以将一些经常需要访问的程序和文件的路径添加到path中,
	  这样我们就可以在任意位置来访问这些文件和程序了
	- 配制环境变量的位置
	   此电脑===》属性===》 高级系统设置===》高级===》环境变量
	- 配制方法
	   在path中直接加入你要加入的文件夹路径就行。注意,两两路径之间以英文的;来区分。   
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191217223335304.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpeXVlcWluZ2h1aQ==,size_16,color_FFFFFF,t_70)


win常用快捷键
win+tab 显示当前打开的页面
alt+tab 快速切换最近打开的两个页面
crt+tab 依次逐个打开浏览器中的页面。

2,进程和线程

进程
	- 进程负责为程序的运行提供必备的环境
	- 进程就相当于工厂中的车间
线程
	- 线程是计算机中最小的计算单位,线程负责执行进程中的程序
	- 线程就相当于工厂中的工人
单线程
	JS是单线程,在执行JS代码的时候网页是停止渲染的。
多线程
	主流的语言,如Java

3,Node.js简介

  • Node.js是一个能够在服务器端运行JavaScript的开放源代码、跨平台JavaScript运行环境

  • Node采用Google开发的V8引擎运行js代码,使用事件驱动、非阻塞和异步I/O模型等技术来提高性能,可优化应用程序的传输量和规模

  • Node大部分基本模块都用JavaScript编写。在Node出现之前,JS通常作为客户端程序设计语言使用,以JS写出的程序常在用户的浏览器上运行

  • Node主要用于编写像Web服务器一样的网络应用,这和PHP和Python是类似的。 但是Node与其他语言最大的不同之处在于,PHP等语言是阻塞的而Node是非阻塞的。

  • Node是事件驱动的。开发者可以在不使用线程的情况下开发出一个能够承载高并发的服务器。其他服务器端语言难以开发高并发应用,而且即使开发出来,性能也不尽人意。Node正是在这个前提下被创造出来。

  • Node.js允许通过JS和一系列模块来编写服务器端应用和网络相关的应用。

  • Node.js的核心模块 包括文件系统I/O、网络(HTTP、TCP、UDP、DNS、TLS/SSL等)、二进制数据流、加密算法、数据流*等等。Node模块的API形式简单,降低了编程的复杂度。

  • 使用框架可以加速开发。常用的框架Express.js、Socket.IOConnect等。Node.js的程序可以在Microsoft Windows、Linux、Unix、Mac OS X等服务器上运行

文件系统I/O,指的是对磁盘的读写操作

4,Node的用途

  • Web服务API,比如REST
  • 后端的Web服务,例如跨域、服务器端的请求 •
  • 基于Web的应用
  • 多客户端的通信,如即时通信

5, 使用COMMONJS规范来定义模块
5.1 ECMAScript标准的缺陷:
• 没有模块系统
• 标准库较少
• 没有标准接口
• 缺乏管理系统

  因此,如果程序设计的规模达到了一定程度,则必须对其进行模块化。 
  模块化可以有多种形式,但至少应该提供能够将代码分割为多个源文件的机制。
   CommonJS 的模块功能可以帮我们解决该问题。

ECMAScript是什么
JavaScript的创造者Netscape公司,将JavaScript提交给国际标准化组织ECMA,希望这种语言能够成为国际标准,后来ECMA发布标准文件的第一版(ECMA-262),规定了浏览器脚本语言的标准,并将这种语言称为ECMAScript
ECMAScript是JavaScript的规则,JavaScript是ECMAScript的一种实现。在日常场合,这两个词是可以互换的、
但事实上,JavaScript比ECMA-262的含义多得多,一个完整的JavaScript实现应该由以下三个部分组成:

  1. ECMAScript:核心
  2. DOM:文档对象模型
  3. BOM:浏览器对象模型

5.2 CommonJS规范
• CommonJS规范的提出,主要是为了弥补当前JavaScript没有模块化标准的缺陷。
• CommonJS规范为JS指定了一个美好的愿景,希望JS能够在任何地方运行。
• CommonJS对模块的定义十分简单:
– 模块引用
– 模块定义
– 模块标识

6,COMMONJS对模块的定义
6.1 模块定义

  • 在运行环境中,提供了exports对象用于导出当前模块的方法或者变量,并且它是唯一的导出的出口。

  • 在模块中还存在一个module对象,它代表模块自身,而exports是module的属性。

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

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

  • 在Node中一个文件就是一个模块。

	exports.xxx = function() {};
	module.exports = {};

6.2 模块引用

  • 在规范中,定义了require()方法,这个方法接手模块标识,以此将一个模块引入到当前运行环境中。
  • 模块分成两大类
    6.2.1 核心模块:
    node引擎提供的模块 , 核心模块的标识就是,模块的名字
    示例:var fs = require(“fs”);
    6.2.2 文件模块
    用户自己创建的模块 ,文件模块的标识就是文件的路径(绝对路径,相对路径),相对路径使用.或…开头
  • 模块引用的示例代码:
//使用require()引入模块以后,该函数会返回一个对象,这个对象代表的是引入的模块
  var math = require(‘math’);

6.3 模块标识
• 模块标识其实就是模块的名字,也就是传递给require()方法的参数,它必须是符合驼峰命名法的字符串,或者是以.、…开头的相对路径、或者绝对路径。
• 模块的定义十分简单,接口也十分简洁。每个模块具有独立的空间,它们互不干扰,在引用时也显得干净利落。

7,Node的模块实现
• Node中虽然使用的是CommonJS规范,但是其自身也对规范做了一些取舍。
• 在Node中引入模块,需要经历如下3个步骤:
– 路径分析
– 文件定位
– 编译执行
• 在Node中,模块分为三类:一类是底层由C++编写的内建模块,一类是Node提供的核心模块;还有一类是用户编写的模块,称为文件模块

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

• npm –v
– 查看版本
• npm
– 帮助说明
• npm search 包名
– 搜索模块包
• npm install
–下载当前项目所依赖的包
• npm install 包名
– 在当前目录安装包
• npm install 包名 –g
– 全局模式安装包(全局安装的包一般都是一些工具)
• npm remove 包名
– 删除一个模块
• npm install 包名 --save
– 安装包并添加到依赖中
• npm install 文件路径
– 从本地安装
• npm install 包名 –registry=地址
– 从镜像源安装
• npm config set registry 地址
– 设置镜像源

1,通过npm下载的包都放到node_modules文件夹中。
2,我们通过npm下载的包,直接通过包名引入即可。
3,node在使用模块名字来引入模块时,它会首先在当前目录的node_modules中寻找是否含有该模块, 如果有则直接使用,如果没有则去上一级目录的node_modules中寻找,如果有则直接使用,如果没有则再去上一级目录寻找,直到找到为止。如果找到磁盘的根目录,如果依然没有,则报错

9,fs(文件模块)
• 在Node中,与文件系统的交互是非常重要的,服务器的本质就将本地的文件发送给远程的客户端
• Node通过fs模块来和文件系统进行交互
• 该模块提供了一些标准文件访问API来打开、读取、写入文件,以及与其交互。
• 要使用fs模块,首先需要对其进行加载。 const fs = require(“fs”);
• fs模块中所有的操作都有两种形式可供选择同步和异步
同步文件系统会阻塞程序的执行,也就是除非操作完毕,否则不会向下执行代码。
异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回。

常用文件操作

//打开文件
– fs.open(path, flags[, mode], callback)
– fs.openSync(path, flags[, mode])

//关闭文件
– fs.close(fd, callback)
– fs.closeSync(fd)

//写入文件, fs中提供了四种不同的方式将数据写入文件
1, 简单文件写入
- fs.writeFile(file, data[, options], callback)
- fs.writeFileSync(file, data[, options])
• 参数:
 file 文件路径
 data 被写入的内容,可以是String或Buffer
 options 对象,包含属性(encoding、mode、flag)
 callback 回调函数

2,同步文件写入
• fs.writeSync(fd, buffer, offset, length[, position])
• fs.writeSync(fd, data[, position[, encoding]])
• 要完成同步写入文件,先需要通过openSync()打开文件来获取一个文件描述符,然后在通过writeSync()写入文件。
• 参数
fd 文件描述符,通过openSync()获取
data 要写入的数据(String 或 Buffer)
offset buffer写入的偏移量
length 写入的长度
position 写入的起始位置
encoding 写入编码

3, 异步文件写入
• fs.write(fd, buffer, offset, length[, position], callback)
• fs.write(fd, data[, position[, encoding]], callback)
• 要使用异步写入文件,先需要通过open()打开文件,然后在回调函数中通过write()写入。
• 参数:
fd 文件描述符
data 要写入的数据(String 或 Buffer)
offset buffer写入的偏移量
length 写入的长度
position 写入的起始位置
encoding 写入编码

4, 流式文件写入
• 往一个文件中写入大量数据时,最好的方法之一是使用流。
• 若要将数据异步传送到文件,首需要使用以下语法创建一个Writable对象:
– fs.createWriteStream(path[, options])
• 一旦你打开了Writable文件流,就可以使用write()方法来写入它,写入完成后,在调用end()方法来关闭流。
• 参数
 path 文件路径
 options {encoding:"",mode:"",flag:""}


//读取文件,•fs中提供了四种读取文件的方式
1, 简单文件读取
• fs.readFile(file[, options], callback)
• fs.readFileSync(file[, options])
• 参数: file 文件路径或文件描述符

2,同步文件读取
• fs.readSync(fd, buffer, offset, length, position)
• 参数:
fd 文件描述符
buffer 读取文件的缓冲区
offset buffer的开始写入的位置
length 要读取的字节数
position 开始读取文件的位置

3,异步文件读取
• fs.read(fd, buffer, offset, length, position, callback)

4,流式文件读取
• 从一个文件中读取大量的数据时,最好的方法之一就是流式读取,这样将把一个文件作为Readable流的形式打开。
• 要从异步从文件传输数据,首先需要通过以下语法创建一个Readable流对象:
• fs.createReadStream(path[, options])
• 参数:path 文件路径   options {encoding:"",mode:"",flag:""}
• 当你打开Readable文件流以后,可以通过readable事件和read()请求,或通过data事件处理程序轻松地从它读出。


//文件系统的其它操作
• 验证路径是否存在
– 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)

示例代码如下
demo1 同步写入文件

//引入文件模块
var fs = require("fs");
//打开文件
var fd = fs.openSync("hello.txt" , "w");
//向文件中写入内容
fs.writeSync(fd , "今天天气真不错~~~", 2);
//关闭文件
fs.closeSync(fd);

demo2 异步写入文件

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);
	}
});

demo3 简单文件写入

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

demo4 流式文件写入

//创建一个可写流
/*
	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();

demo5 简单文件读取

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

demo6 流式文件读取

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);
});

demo7 分批次读取和写入

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

var fs = require("fs");

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

//pipe()可以将可读流中的内容,直接输出到可写流中
rs.pipe(ws);
node
	- 包(package)
		- 将多个模块组合为一个完整的功能,就是一个包
		- 包结构
			bin
				- 二进制的可执行文件,一般都是一些工具包中才有
			lib
				- js文件
			doc
				- 文档
			test
				- 测试代码
			package.json
				- 包的描述文件
				
		- package.json	
			- 它是一个json格式的文件,在它里面保存了包各种相关的信息
				name 包名
				version 版本
				dependencies 依赖
				main 包的主要的文件
				bin 可执行文件

在这里插入图片描述

参考文档 https://blog.csdn.net/canxuezhang/article/details/88176839

发布了88 篇原创文章 · 获赞 13 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/yiyueqinghui/article/details/103536352
今日推荐