node.js基础

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.png

timers:存放定时器回掉函数 检查每一个计时器,有没有达到计时时间,到达了就将会掉放入事件队列的,等待执行

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...')
})

你可能感兴趣的:(node.js基础)