Part5-1-1 Nodejs 基础
Posted 沿着路走到底
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Part5-1-1 Nodejs 基础相关的知识,希望对你有一定的参考价值。
Nodejs 架构
Natives modules
当前层内容由 JS 实现。
提供应用程序可直接调用库,例如 fs、path、http等。
JS 语言无法直接操作底层硬件设置。需要通过桥梁:Builtin modules "胶水层" (由C++编写)。
底层
V8:执行 JS 代码,提供桥梁接口。
Libuv: 事件循环、事件队列、异步IO
第三方模块:zlib、http、c-ares等。
Reactor模式
单线程完成多线程工作
实现异步IO、事件驱动
可以实现高并发处理
Nodejs 更适用于 IO 密集型高并发请求
Nodejs异步IO
nodejs异步 IO 是 异步非阻塞 IO
立即返回的并不是业务层期望得到的数据,而仅仅是当前调用的状态,操作系统为了获取数据,就会让程序重复调用IO操作,判断 IO 是否结束,这种技术称为轮询。
常见轮询技术:read、select、poll、kqueue、event ports
期望实现无需主动判断的非阻塞 IO
1
异步 IO 总结
IO 是异步程序的瓶颈所在
异步 IO 提高性能无须采用原地等待结果返回
IO 操作属于操作系统级别,平台都有对应实现
Nodejs 单线程配合事件驱动架构及libuv实现了异步 IO
Nodejs 事件驱动架构
事件驱动架构是软件开发中的通用模式
事件驱动、发布订阅、观察者
主体发布消息,其他实例接收消息
const EventEmitter = require('events')
const myEvent = new EventEmitter()
myEvent.on('事件1', () =>
console.log('事件1执行了')
)
myEvent.on('事件1', () =>
console.log('事件1-2执行了')
)
myEvent.emit('事件1')
输出:
Nodejs单线程
使用 JS 实现高效可伸缩的高性能 Web 服务
单线程如何实现高并发?
异步非阻塞 IO 配合事件回调通知
Nodejs 主线程是单线程
libuv 库会维护一个线程池
1
const http = require('http')
function sleepTime (time)
const sleep = Date.now() + time * 1000
while(Date.now() < sleep)
return
sleepTime(4)
const server = http.createServer((req, res) =>
res.end('server starting......')
)
server.listen(8080, () =>
console.log('服务启动了')
)
4秒后服务启动
Nodejs应用场景
IO 密集型高并发请求
Nodejs作为中间层
操作数据库提供 API 服务
实时聊天应用程序
Nodejs 更加适合 IO 密集型任务
Nodejs实现API服务
// 需求:希望有一个服务,可以依据请求的接口内容返回相应的数据
import express from 'express'
import DataStore from './data'
const app = express()
app.get('/', (req, res) =>
// res.end('1122')
res.json(DataStore.list)
)
app.listen(8081, () =>
console.log('服务已经开启了')
)
Nodejs全局对象
与浏览器平台的 window 不完全相同
Nodejs 全局对象上挂载许多属性
全局对象是 javascript 中的特殊对象
Node.js 中全局对象是 global
Global 的根本作用就是作为宿主
全局对象可以看做是全局变量的宿主
默认情况 this 是空对象,和 global 并不是一样的
Nodejs 常见全局变量
__filename:返回正在执行脚本文件的绝对路径
__dirname:返回正在执行脚本所在目录
timer类函数:执行顺序与事件循环间的关系
process:提供与当前进程互动的接口
require:实现模块的加载
module、exports:处理模块的导出
1
以上是关于Part5-1-1 Nodejs 基础的主要内容,如果未能解决你的问题,请参考以下文章