1.命令行窗口 window+r—>cmd打开命令行窗口 常用指令: dir 列出当前目录下的所有文件 cd 后面跟目录名,进入指定的目录下 再追加dir,就会显示该目录下所有目录 f: 转到F盘 md 后面跟目录名,创建一个文件夹 rd 后面跟目录名,删除一个文件夹 node 后跟文件名,打开js文件 直接输入文件名–打开文件 -目录: . 表示当前目录 … 表示上一级目录 盘符:切换磁盘的根目录 环境变量(windows系统中的变量):计算机–右键–属性–高级系统设置–环境变量–一般改用户变量 path -当我们在命令行窗口打开一个文件,或调用一个程序时,系统会首先在当前目录下寻找文件程序,如果找到了则直接打开, 如果没有找到则会依次到环境变量path的路径中寻找,直到找到为止,如果没找到会报错。 跟函数的作用域链类似,从内往外找。 所以我们可以将一些经常需要访问的程序和文件路径添加到path中, 这样我们就可以在任意位置来访问这些文件和程序了(不用进入指定文件夹目录下就能调用)。 :文件目录—追加在path路径后,即给该文件配置环境变量
2.进程和线程 进程:负责为程序的运行提供必备的环境 (桌面底部,右键–任务管理器–进程) 进程相当于工厂中的车间 线程:计算机中的最小的计算单位,负责执行保存到进程中的程序 线程相当于工厂中的工人 单线程:js是单线程 多线程:
3.Node简介 (node本意“节点”) 定义:Node.js是一个能够在服务器端运行JavaScript的开放源代码,跨平台的JavaScript运行环境。 浏览器(客户端)运行:之前的js是在浏览器(客户端)运行 服务器端(后端/系统)运行: Node采用Google开发的V8引擎运行js代码,使用 事件驱动、非阻塞 和 异步I/O模型等技术来提供性能,可优化应用程序的传输量和规模。 瑞安.达尔—Node.js之父 I/O阻塞程序运行 Node的用途:1、Web服务API,比如REST 2、实时多人游戏 3、后端的web服务,例如跨域、服务器端的请求 4、基于web的应用 5、多客户端的通信,如即时通信 node最大特点—单线程,Node处理请求时是单线程,但是在后台拥有一个I/0线程池 node可以执行js文件:进入文件目录下 node 文件名
4、Node整合webstorm
5、模块化: 01.如果程序设计的规模达到了一定程度,则必须对其进行模块化 02.模块化可以有多种形式,但至少应该提供能够将代码分割为多个源文件的机制 03.CommonJS的模块功能可以帮我们解决该问题
ECMAScript标准的缺陷: 没有模块系统 标准库较少 没有标准接口 缺乏管理系统 CommonJS规范: 01.CommonJS规范的提出,主要是为了弥补当前JavaScript没有标准的缺陷。 02.CommonJS规范为JS指定了一个美好的愿景,希望js能够在任何地方运行。 03.CommonJS对模块的定义十分简单: 模块引用 模块定义 模块标识 模块:01.在Node中,一个js就是一个模块 在Node中,通过require()函数来引入外部的模块。 require()可以传递一个文件的路径作为参数,node将会自动根据该路径来引入外部模块, 这里的路径,如果使用相对路径,必须以.或…开头 require("./02.modul") 使用require()引入模块以后,该函数会返回一个对象,这个对象代表的是引入的模块 02.在Node中,每一个js文件中的js代码都是独立运行在一个函数中, 而不是全局作用域,所以一个模块中的变量和函数在其他模块中无法访问 我们可以通过 exports() 来向外部暴露变量和方法 只需要将需要暴露给外部的变量或方法设置为exports的属性即可 例如: exports.x=“我是。。。” 直接在全局中var一个变量,污染全局作用域(环境); 模块的标识:01.模块标识其实就是模块的名字,也就是传递给require()方法的参数, 它必须是符合驼峰命名法的字符串,或者是以. …开头的相对路径,或者绝对路径 02.模块的定义十分简单,接口也十分简洁。每个模块具有独立的空间,他们互不干扰,在引用时也显得干净利落。 模块分成两大类: 核心模块:由node引擎提供的模块。 核心模块的标识就是,模块的名字 文件模块:用户自己创建的模块 文件模块的标识就是文件的路径(绝对路径、相对路径) 相对路径要使用.或…开头
6.global:在node中有一个全局对象,global,它的作用和网页中window类似 在全局中创建的变量都会作为global的属性保存; 在全局中创建的函数都会作为global的方法保存; arguments.callee 这个属性保存的是当前执行的函数对象 function (exports, require, module, __filename, __dirname) { var a=10; console.log(arguments.callee+ “”) }
实际上模块中的代码都是包装在一个函数中执行的,并且在函数执行时,
同时传递进了5个实参(exports, require, module, __filename, __dirname)
exports 该对象用来将变量或函数暴露到外部
require 函数,用来引入外部的模块
module 代表的是当前模块本身,exports就是module的属性
console.log(module.exports==exports) //true
既可以使用exports导出,也可以使用module.exports
__filename 当前模块的完整路径
__dirname 当前模块所在文件夹的完整路径
7.exports 和 module.exports
- 通过exports只能使用.的方式来向外暴露内部变量
exports.xxx = xxx - module.exports 既可以通过.的形式,也可以直接赋值
module.exports.xxx = xxx module.exports = {}
8.包(package) 简介: 01.CommonJS的包规范允许我们将一组相关的模块组合到一起,形成一组完整的工具; 02.CommonJS的包规范由 包结构 和 包描述文件 两个部分组成; 包结构:用于组织包中的各种文件 包描述文件:描述包的相关信息,以供外部读取分析 包结构:包实际上就是一个压缩文件,解压以后还原为目录。符合规范的目录,应该包含如下文件: package.json 描述文件(必须有) json文件内不能写注释 bin 可执行二进制文件 lib(库) js代码 doc 文档 test 单元测试 dependencies 依赖 devDependences 开发依赖
9.npm 简介 npm (Node Package Manager) node包管理器 CommonJS包规范是理论,NPM是其中一种实践。 对于Node而言,NPM帮助其完成了第三方模块的发布,安装和依赖等。借助NPM,Node与第三方模块之间形成了很好的一个生态系统。 NPM命令: npm -v -----查看版本 npm version ----查看所有模块的版本 npm ------帮助说明 npm search 包名 ----搜索包模块 npm install 包名 ----在当前目录安装包 (install可简写成i) npm install 包名 -g ----全局模式安装包 (此处的g就是global)(注意:全局安装的包一般都是一些工具) IDEA里建包,左下方Terminal—进入要建包的目录下—输入npm install 包名—建成,在node_modules library root目录下 npm remove 包名 ----删除一个模块 (remove可简写成r) npm install 文件路径 ----从本地安装 npm install 包名 -registry=地址 —从镜像源安装 (npm install cnpm -g --registry=https://registry.npm.taobao.org 淘宝镜像) npm config set registry 地址 —设置镜像源 npm install 包名 --save ----安装包并添加到依赖中 npm install 下载当前项目所依赖的包(从网上下载下载项目时,需先下载包才能运行) npm install nodemon -g —安装此插件可以实现前台、后台、命令行同步修改(全局安装) (调用文件— nodemon 文件名) npm install bootstrap@4.6.0 bootstrap降版本 npm install -g @vue/cli 全局安装vue脚手架
10.配置 cnpm (其中的c表示China) http://r.npm.taobao.org/ 淘宝镜像网址
11.Node搜索包的流程 通过npm下载的包都放到node_modules文件夹中, 通过npm下载的包,直接通过包名引入即可。例如:var math=require(“math”); var express=require(“require”); node在使用模块的标识(名字)来引入模块时,它会首先在当前目录的node_modules中寻找是否含有该模块; 如果有则直接用,如果没有则去上一级目录的node_modules中寻找; 如果有则直接用,如果没有则再去上一级目录的node_modules中寻找,直到找到为止; 直到找到磁盘的根目录,如果依然没有,则报错。
12.Buffer缓冲区 01.从结构上看,Buffer非常像一个数组,它的元素为16进制的两位数。 数组中不能存储二进制文件,而Buffer就是专门用来存储二进制数据的。 02.实际上,一个元素就表示内存中的一个字节。 03.实际上,Buffer中的内存不是通过JavaScript分配的,而是在底层通过c++申请的。 04.也就是我们可以直接通过Buffer来创建内存中的空间。 使用Buffer不需要引入模块,直接使用即可。 在Buffer中存储的都是二进制数据,但是都以16进制的形式来显示的。 var str =“Hello Atryighj”; //将一个字符串保存到Buffer中 var buf=Buffer.from(str); ------将一个字符串转换为Buffer console.log(buf); Buffer中每一个元素的范围是从00 - ff (换成十进制:0 - 255) 00000000 - 11111111 计算机 一个0 或 一个1 我们称为1位(bit) 8bit = 1byte(字节) 1024byte = 1kb 1024kb = 1mb 1024mb = 1gb 1024gb = 1tb Buffer中的一个元素,占用内存的一个字节
Buffer的大小一旦确定,则不能修改。Buffer实际上,是对底层内存的直接将操作。
创建Buffer:
- Buffer.alloc(size) 相比较于allocUnsafe(size),alloc使用的更多,避免数据泄露
alloc(原意:分配) 创建一个10个字节的buffer var buf2 = Buffer.alloc(10); - Buffer.allocUnsafe(size) 创建一个指定大小的buffer,但是buffer中可能含有敏感数据。
var buf3 = Buffer.allocUnsafe(10); buf.toString();----将缓冲区的数据转换成字符串,括号内可以写进制数
13.同步文件写入 fs 文件系统(File System): 文件系统简单来说就是,通过Node来操作系统中的文件。 01.在Node中,与文件系统的交互是非常重要的,服务器的本质就是将本地的文件发送给远程的客户端; 02.Node通过fs模块来和文件系统进行交互; 03.该模块提供了一些标准文件访问API来打开、读取、写入文件,以及与其交互; 04.要使用fs模块,首先需要对其进行引入;fs是核心模块,直接引入,不需要下载。 -const fs = require(“fs”);
同步 和 异步 调用: 01.fs模块中所有的操作都有两种形式可供选择,同步(带Sync) 和 异步(不带Sync); 02.同步文件系统会阻塞程序的执行,也就是除非操作完毕,否则不会向下执行代码; 03.异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数(callback)将结果返回。
同步文件的写入: 01.打开文件: 引入: fs.openSync(path[, flags[, mode]]) 参数: path 要打开文件的路径(相对路径) flags 打开文件要做的操作的类型 (r—只读的 w—可写的) mode 设置文件的操作权限,一般不传 返回值:该方法会返回一个文件的描述符作为结果,我们可以通过该描述符来对文件进行各种操作。 var fd=fs.openSync (“hello.txt”,“w”); console.log(fd); 02.写入内容: fs.writeSync(fd, string[, position[, encoding]]) 参数: fd 文件的描述符,需要传递要写入的文件的描述符 string 要写入的内容 position 写入的起始位置 encoding 写入的编码,默认utf-8 position 和 encoding 两个参数一般都不用传 向文件中写入内容 fs.writeSync(fd,“今天天气真不错”)
03.保存并关闭: 关闭文件(节省内存空间) fs.closeSync(fd) fd要关闭的文件的描述符
14.异步文件写入:
- 打开文件
引入fs模块,打开文件 fs.open(path[, flags[, mode]], callback) 注意:异步调用的方法,结果都是通过回调函数的参数返回的。 // 引入fs模块 var fs = require(“fs”);
//打开文件 fs.open(“hello2.txt”,“w”, function(err,fd){ //判断是否出错 if(!err){ 02.如果没有出错,则对文件进行写入操作 fs.write(fd, “这是异步写入的内容”, function(err){ if (!err){ console.log(“写入成功”) } }) 03.关闭文件 fs.close(fd,function(){ if(!err){ console.log(“文件已关闭”) } }) }else{ console.log(err) } });
15.简单文件写入: 异步: fs.writeFile(file, data[, options], callback) file 要操作的文件的路径 data 要写入的数据 options 选项,可以对写入进行一些设置 options一般都是以对象作为参数的,对象{} encoding 默认utf-8 mode 默认0o666 flag 默认 w 打开文件用于写操作,如果不存在则创建,如果存在则截断 r 读取文件,文件不存在则出现异常 a 打开文件用于追加,如果不存在则创建 callback 当写入完成以后,执行的函数 同步:fs.writeFileSync(file, data[, options]) file data options 异步写入案例: //引入fs模块 var fs = require(“fs”); path可以是绝对路径也可以是相对路径 fs.writeFile(“hello3.txt”,“这是通过writeFile写入的内容”,{ flag:“w”},function (err) { if (!err){ console.log(“写入成功”) }else{ console.log(err); } })
//往桌面文件写入内容 C:\Users\13099\Desktop //路径写法:C:\Users\13099\Desktop\hello.txt 或 C:/Users/13099/Desktop/hello.txt fs.writeFile(“C:\Users\13099\Desktop\hello.txt”,“这是通过writeFile写入的内容”,{flag:“w”},function(){ if(!err){ console.log(“写入成功”) }else{ console.log(err) } })
16.流式文件写入 同步、异步、简单文件写入都不适合大文件的写入,性能较差,容易导致内存溢出。
流式文件写入: var fs = require(“fs”); 创建一个可写流: fs.createWriteStream(path[, options]) 可以用来创建一个可写流 path 文件路径 options 配置的参数(一般可省略不写)
var ws=fs.createWriteStream(“hello4.txt”); 可以通过监听流的open 和 close 事件,来监听流的打开和关闭
绑定事件: on 和 once on(事件字符串,回调函数) 可以为对象绑定一个长期有效的事件 once /one(事件字符串,回调函数) 可以为对象绑定一个一次性事件,该事件将会在触发一次以后自动失效
ws.once(“open”,function(){ console.log(“流打开了”); }) ws.once(“close”,function(){ console.log(“流关闭了”); })
//通过ws向文件中输出内容 ws.write(“通过可写流写入文件内容”); ws.write(“134343”); ws.write(“taoxinglong”); ws.write(“rytyteut”);
//关闭流 ws.end();
17.简单文件读取
tcp 和 http 都是网络传输协议: tcp位于传输层,http 位于应用层,应用层高于传输层; tcp仅仅用来传输数据,不会对数据进行包装和处理,数据传输安全性很好 http对数据进行包装 tcp可以生成客户端和服务端,可以进行双向通信,可以是客户端向服务端发送请求,但是服务端不理它; 也可以是客户端发送请求,服务端回复了100次;也可以反向操作 http必须客户端发送请求,然后服务端只要接收到客户端的请求,必须响应并且返回。 net模块基于TCP协议,是一个底层的传输协议,我们只能用它实现基于命令行工具的客户端和服务器 http模块,基于http协议,实现基于BS构架的应用(浏览器和server)
socket 传输层,socket,应用层 socket 长连接,服务器和客户端的连接,只要没有人退出,就会一直保持 短连接,ajax,客户端发送一次请求,服务端做一次响应 socket的实现:net模块 websocket(第三方插件,使用时需要安装)
websocket实现的具体步骤: npm install nodejs-websocket 加载websocket插件 01.前后端建立连接: -搭建socket服务器 createServer() -前端进行连接, new Websocket(‘ws://localhost:8080’) ws.onopen 连接成功触发
02.前后端进行数据交互: -前端往后端主动发数据 ws.send() -后端往前端发数据 ws.onmessage = function(data){}
03.前后端断开连接 ws.on(“close”)
跨域解决方案: -cors 跨域资源共享,由一系列http头组成,http头决定浏览器是否阻止前端获取跨域请求的响应 cors提供了web接口,给服务器权限去决定是否允许这种跨域访问 兼容性不好,ie10以下不支持 cors既支持get请求,也支持post请求 express内置了cors中间件,通过安装和配置cors中间件,来很方便的解决跨域问题 01.npm install cors 02.const cos = request(“cors”) 03.在路由之前调用app.use(cors()) 配置中间件 -jsonp 利用了script标签没有跨域限制的漏洞,来达到和后端通讯的目的, 当通讯的时候,会创建一个script元素,地址指向第三方api,类似于 <script src="http://127.0.0.1:4000/api/et?id=123&name=“张三”> 并提供了一个回调函数来接收数据,只支持get,不支持post delete等等 jsonp实现步骤:01.获取客户端发过来的回调函数的名字; 02.得到通过jsonp形式发给客户端的数据 ; 03.根据前两步所得到的数据,拼接出一个函数调用的字符串; 04.把第三步拼出来的字符串,响应给客户端进行解析 连接mysql数据库: 01.安装操作mysql数据库的第三方模块(mysql) npm install mysql 02.通过mysql模块连接到mysql数据库 03.通过mysql模块执行sql语句
|