1. 什么是NodeJs?
NodeJs不是一门编程语言,是一个javascript的运行环境,NodeJs是采用C++语言编写而成的一个javascript的解释器
2.什么是运行环境?
通俗讲指一种语言想要实现相关的功能需要另外一种事物(可以使语言也可以是其他的东西)作为它的载体或这运行平台
在客户端,javascript想要实现某种功能是需要浏览器提供支持,如果没有浏览器提供支持是完成不了的
操作系统的运行环境,就是电脑硬件本身,如果连电脑都没有,那么操作系统无法运行
3. 为什么NodeJs是javascript的运行环境?
因为NodeJs采用的是Google Chrome浏览器的V8引擎,而V8引擎就是Javascript的运行环境
但是NodeJs是服务器端的运行环境
4. 服务器端语言有什么特点呢?
4.1 进行http通信 接受http请求,响应http请求
4.2 操作数据库 对数据库里面的内容可以进行增删改查
4.3 可以操作本地文件,对本地文件进行读写,创建和删除等
5. NodeJs 有什么特点?
5.1 以上4的特点都有
5.2 是javascript的运行环境
5.3 事件驱动
5.4 非阻塞I/O
5.5 单线程
6. 什么是事件驱动?
事件:在客户端js中有 点击按钮事件/鼠标事件/键盘事件等都叫做事件
事件驱动:有鼠标或者键盘引起一连串的操作动作叫做事件驱动
简单理解:通常事件驱动会伴随着相对应的程序处理或者函数的执行
7. Nodejs的有哪些事件驱动?
7.1 接受客户端的请求
7.2 对文件进行读写
7.3 操作数据库
8. 什么是非阻塞I/O
I/O : input/output 输入输出
通俗来讲
对于磁盘 I/O = 读写
对于网络 I/O = 收发请求
阻塞I/O
指在执行I/O的过程时候,会阻塞其他应用程序的进行,只有等待这个I/O完成后,才会进行其他的操作
非阻塞I/O
指在执行I/O的过程时候,不会等待其应用程序执行完成后在执行其他应用程序,当I/O结束后,在回头处理这个结果。 即异步
9. 单线程
单线程:程序按照逻辑顺序执行,前面的必须处理完成,后面的才会执行,即在同一个时间里面只能做一件事情
如:你在点击按钮出现弹窗的时候,就不可以对浏览器做出其他的相应操作
多线程:程序在一个时间里面可以做多个事情 能够提高效率
如 :迅雷同时下载多个小电影
javascript 是一门单线程语言,为什么javascript不能是多线程?
javascript作为单线程,由其内容所决定,在浏览器环境中,JavaScript的主要用操作DOM
如果JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这个时候没法搞?
10. 问题来了,既然javascript是单线程,那么为什么nodejs会有非阻塞I/O?
I/O操作都是比较耗时的,这个会阻塞其他的任务进行,javascript的设计者认为,没有必要等待I/O的完成,
在I/O任务完成之前javascript完全可以继续执行其他的任务,直到I/O任务完成后再回头执行该任务的返回就行。
所以javascript在设计之初中将这些耗时的I/O等操作封装为了异步的方法,等到这些任务完成后就将后续的处理操作封装为JavaScript任务放入执行任务队列中,等待JavaScript线程空闲的时候被执行
11.Nodejs端的javascript和浏览器端的javascript的相同点和不同点
相同点:
基本语法、数据类型相同
声明变量、函数
数值、字符串、对象、数组、函数、布尔、undefined
不同的数据类型的属性和方法
不同点:
全局对象不同
在浏览器端 # window
在NodeJs # global
因为js的运行环境不同,所以两者的全局对象下的属性和方法基本上都是不同的 (即window下的属性和方法在nodejs中没有,global中的属性和方法在浏览器端也是没有的)
12.NodeJs采用大量的es6简写方法,其中以箭头函数居多,箭头函数的简写有以下几种
1. 一般函数的写法函数
var fn1 = function(a,b,c){
......代码块......
console.log("fn1");
}
简写形式如下:
var fn1 = (a,b,c)=>{
......代码块......
console.log("fn1");
}
2. 当函数只有一个参数的时候
var fn2 = function(a){
......代码块......
console.log("fn1");
}
简写形式如下:
var fn2 = a =>{
......代码块......
console.log("fn1");
}
3. 当函数体只有一条语句,且为 return 语句
var fn3 = function(a,b)=>{
return a+b;
}
简写形式如下:
var fn3 = (a,b)=>a+b;
13.Module(模块)
一般情况下一个模块代表是一个功能的集合,能够完成某个特定的功能,模块一般为对象或者是一个函数
在nodejs中模块分为系统模块和自定义模块
系统模块
也叫内置模块,nodejs这个运行环境自己提供,不需要另外下载和安装
自定义模块
需要自己定义封装,然后引入才能够使用
nodejs中有大量的模块为什么不把这些模块融合在一起?
有一些程序只需要使用某些模块(如文件读取功能)来完成一个特定的事情,所以为了效率,完全没有必要引入其他的模块,你用啥,你就require啥。
14.NodeJs 内置模块 HTTP
1. 服务器的创建 03.js
如果想修改程序,必须中断当前运行的服务器,重新node一次,刷新,才行。
ctrl+c,就可以打断挂起的服务器程序。此时按上箭头,能够快速调用最近的node命令。
2. 思考,那么我们写的网页如何通过服务器被访问得到?
1. 总不能通过在js中不断的创建节点,添加节点来完成吧,需要结合fs模块来完成
3.如何通过访问nodejs服务器访问的是一个完整的html页面
通过引入fs模块来对html文件进行读取,然后把读取到的数据输出到html当中
见案例04.js
4. 回调函数参数req的讲解
req.method 请求方式
req.url 请求的路径
req.header 请求头
5.nodejs没有存储文件的web容器
nodejs不像传统的老牌服务器apache不能提供一个静态的web容器 一个url路径不代表有一个资源库
6. html中每一个img script 和link标签都会发起请求 都有路由路径
7. html中引入css和javascript
注意在html骨架中引入的css和javascropt可以不设置header头,建议加上
注意!!!!!!!
案例中使用的大量的相对路径 是相对于cmd命令命板中光标挂起的所在的文件夹,不是相对于 *.js 文件
eg: node C:\课件2\Server_13\NodeJs_01 这是错误的,会发现找不到文件
15.http 模块其他api
res.setHeader("name","value"); 设置请求头
res.statusCode 设置状态码
状态码为三位(否则报错),可以随便设置 ,但是一般情况下设置想对应的状态码
res.statusMessage 设置状态信息
res.write() 发送给浏览器的网页内容
注意:所有的write和end里面的参数必须为字符串或者buffer类