node.js是什么
Node.js不是代码库、不是框架,node是一个js运行的环境:简单点来讲就是node.js可以解析和执行JavaScript代码(v8引擎:v8负责编译js代码、处理调用栈、内存分配、垃圾回收等操作)。
node.js应用
- 开发服务器应用程序
-
结构一
image2021-5-31 11_38_36.png
-
这种结构通常应用在微型站点(个人博客,公司官网):node服务器完成站点请求的处理、响应、和数据
-
结构二
这种结构应用很广泛
image2021-5-31 11_40_26.png
node服务器当一个中间层,只是简单的把请求转发给后端服务器(减轻服务器压力),数据存在后端服务器上(大量数据:产品数据,物流数据,用户数据信息...)。
node服务器不做任何与业务逻辑有关的事情,绝大部分时候,只做简单的转发请求,但可能会有一些额外的功能
-
简单的信息记录:请求日志、用户偏好,广告信息......
-
静态资源托管:js,css,img......
-
缓存:访问量量高的页面,做缓存
node数据库存放轻量级数据。
node强项:大量吞吐量、异步,没有线程切换开销
node全局对象global
setTimeout
setInterval
setImmediate : setTimeout 0 异步
console
__dirname : 获取当前模块所在的目录,不是global属性
__filename:获取当前模块的文件路径,不是global属性
process:
-
cwd():放回当前nodejs进程的工作目录,绝对路径
-
exit():强制退出当前node进程
-
platform:获取当前的操作系统
-
kill(pid):杀死进程 pid:进程id
-
env:获取环境变量对象
-
nextTick(): 微任务
node事件循环
image2021-5-31 11_42_33.pngtimers:存放定时器回掉函数 检查每一个计时器,有没有达到计时时间,到达了就将会掉放入事件队列的,等待执行
poll:轮训等待队列
-
除了timers、check,绝大部分会掉函数都放入该队列,比如文件读取,监听用户请求
-
运作方式:
- 如果poll中有回掉,依次执行回掉,直到队列清空,进入下一阶段。
- 如果poll中没有回掉,如果其他队列中将会出现回掉,则等待其他队列中出现回掉,结束该阶段,进入下一阶段。
- 如果没有任何要等待执行的回掉,就立即结束。
check 检查阶段:使用setImmediate的回掉会直接进入这个队列,事件循环到这就会执行
setImmediate(function () {
console.log('setImmediate延迟执行');
});
setTimeout(function () {
console.log('setTimeout延迟执行');
},0);
// 执行结果
koolearn@koolearndeMBP ~/workfile/node node ./src/d
setImmediate延迟执行
setTimeout延迟执行
koolearn@koolearndeMBP ~/workfile/node node ./src/d
setImmediate延迟执行
setTimeout延迟执行
koolearn@koolearndeMBP ~/workfile/node node ./src/d
setImmediate延迟执行
setTimeout延迟执行
koolearn@koolearndeMBP ~/workfile/node node ./src/d
setImmediate延迟执行
setTimeout延迟执行
koolearn@koolearndeMBP ~/workfile/node node ./src/d
setTimeout延迟执行
setImmediate延迟执行
koolearn@koolearndeMBP ~/workfile/node
// 事件循环,进入timers,什么也没有,进入poll,没有回掉,等待计时器,5秒过后回掉放入timers队列,往后执行
setTimeout(function f1(){
console.log('setTimeout');
},5000)
var http = require('http')
var server = http.createServer()
server.on('request', function (request,response) {
console.log('收到客户端的请求了')
})
server.listen(3000)
// 事件循环,进入timers,什么也没有,进入poll,没有回掉,等待文件读取结束,开一个计时器,0秒过后放入timers队列,同时往check里放setImmediate回掉,poll阶段结束,进入check执行。
fs.readFile('./index.json', () => {
setTimeout(() => {
console.log('fs =》1');
},0);
setImmediate(() => {
console.log('fs =》2');
});
});
事件循环中,每次打算执行一个回掉之前,都会先清空nextTick和promise队列,nextTick队列优先级最高
// e.js
setImmediate(() => {
console.log(1);
})
process.nextTick(() => {
console.log(2);
process.nextTick(() => {
console.log(3);
})
})
console.log(4)
Promise.resolve().then(() => {
console.log(5)
process.nextTick(() => {
console.log(6);
})
})
node模块化细节
require函数
当执行一个模块或使用require时,会将模块放置在一个函数环境中
模块的查找
-
绝对路径
-
相对路径 ./或../ 相对于当前模块,转换为绝对路径,去加载模块
-
相对路径: require('abc')
-
优先从缓存加载
-
检查是否是内置模块,如,http、fs
-
检查当前路径的node_modules
-
检查上级目录的node_modules,
-
转换为绝对路径,加载模块
-
-
后缀名 如果不提供后缀名,自动补全,js、json、node、mjs
-
文件名
-
如果仅提供目录,不提供文件名,则自动寻找该目录中的index.js
-
package.json中的main字段
-
表示包的默认入口,导入或执行包时,若仅提供目录,则使用main补全入口,默认值是index.js
-
module对象
记录当前模块信息
// a.js
exports.a = 1;
this.b = 2
module.exports = {
b: 3,
c: 4,
};
/* module.exports.c = 3;
module.exports.d = 4; */
this.e = 5;
最开始:this == exports == module.exports 他们指向同一个引用,改变引用就会出错
不能给this赋值, 会报错
最终返回的是module.exports
简单http服务
// 1. 加载http核心模块
var http = require('http')
// 2. 使用 http.createServer() 方法创建一个 Web 服务器 ,返回一个 Server 实例
var server = http.createServer()
// 3. 服务器要干嘛?
// 提供服务:对数据的服务
// 对发出的请求进行接受,处理请求
// 发送响应
// 注册 request 请求事件
// 当客户端请求过来,就会自动触发服务器的 request 请求事件,然后执行第二个参数:回调处理函数
// request请求对象,response对象
server.on('request', function (request,response) {
console.log('收到客户端的请求了')
})
// 4. 绑定端口号,启动服务器
server.listen(3000, function () {
console.log('服务器启动成功了,可以通过 http://127.0.0.1:3000/ 来进行访问')
})
//server简写方式
var http = require('http')
http
.createServer(function (req, res) {
// 简写方式,该函数会直接被注册为 server 的 request 请求事件处理函数
})
.listen(3000, function () {
console.log('running...')
})
网友评论