node 你到底懂多少,等你,来~~
栏目: JavaScript · 发布时间: 7年前
内容简介:Node的首要目标是提供一种简单的,用于创建高性能服务器的开发工具 Web服务器的瓶颈在于并发的用户量,对比Java和Php的实现方式其实node 火爆最大的原因是前端的火爆,前端后重视后,在的大前端的大潮中推向顶峰,因为Web主要场景就是接收客户端的请求读取静态资源和渲染界面,所以Node非常适合Web应用的开发Node.js是一个基于 Chrome V8 引擎的JavaScript运行环境(runtime),Node
Node的首要目标是提供一种简单的,用于创建高性能服务器的开发工具 Web服务器的瓶颈在于并发的用户量,对比 Java 和 Php 的实现方式
Node在处理高并发,I/O密集场景有明显的性能优势
- 高并发,是指在同一时间并发访问服务器
- I/O密集指的是文件操作、网络操作、数据库,相对的有CPU密集,CPU密集指的是逻辑处理运算、压缩、解压、加密、解密
其实node 火爆最大的原因是前端的火爆,前端后重视后,在的大前端的大潮中推向顶峰,因为Web主要场景就是接收客户端的请求读取静态资源和渲染界面,所以Node非常适合Web应用的开发
Node是什么?
Node.js是一个基于 Chrome V8 引擎的JavaScript运行环境(runtime),Node 不是一门语言 是让js运行在后端的运行时,并且不包括javascript全集,因为在服务端中不包含DOM和BOM,Node也提供了一些新的模块例如http,fs模块等。Node.js 使用了事件驱动、非阻塞式 I/O 的模型,使其轻量又高效并且Node.js 的包管理器 npm,是全球最大的开源库生态系统。
我个人对node的事件轮询的理解是这样的,主线程分配任务下去,注册回调函数。主线程里在执行代码的时候io继续等待,主线程执行完毕后进行轮询,因为这个时候主线程是空闲状态,所以可以一直轮询,直到发现有某一个io操作给他发了信号告诉他我现在弄好了,你可以用这个数据,主线程的资源就拿来执行回调函数。也就是说从始至终都只有主线程在做事情,主线程要不然是在执行函数,要不然就是在进行事件的轮询,去寻找有哪个事件完成了需要执行他的回调函数。
大概就是所谓的单线程异步吧
当然很多童鞋可能会问,为什么js是单线程, javascript在最初设计时设计成了单线程,如果多个线程同时操作DOM那岂不会很混乱?这里所谓的单线程指的是主线程是单线程的,所以在Node中主线程依旧是单线程的。
顺便扯一下进程与线程
来一张图关于浏览器的
- 用户界面-包括地址栏、前进/后退按钮、书签菜单等
- 浏览器引擎-在用户界面和呈现引擎之间传送指令(浏览器的主进程)
- 渲染引擎,也被称为浏览器内核(浏览器渲染进程)
本人查了一些资料,其实渲染引擎内部是多线程的,内部包含两个最为重要的线程ui线程和js线程。这里要特别注意ui线程和js线程是互斥的,因为JS运行结果会影响到ui线程的结果。ui更新会被保存在队列中等到js线程空闲时立即被执行。
其他线程就是涉及事件循环(Event Loop),大家可以自行谷歌。
关于buffer
其实就是相当于我们js数组理解就可以了,那为什么node需要用buffer表示。 缓冲区Buffer是暂时存放输入输出数据的一段内存。 JS语言没有二进制数据类型,而在处理TCP和文件流的时候,必须要处理二进制数据 。 貌似es6也出了一个TypedArray,应该是差不多的。
node的可读流和可写流
之前写的,现在基本忘记了~~流相关-机票
let http = require('http');
//req 流对象 是可读流
//res 是一个可写流 write
let server = http.createServer();
let url = require('url');
//当客户端连接上服务器之后执行回调
server.on('connection', function () {
console.log('客户端连接 ');
});
//req代表客户端的连接,server服务器把客户端的请求信息进行解析,然后放在req上面
//res代表响应,如果希望向客户端回应消息,需要通过 res
server.on('request', function (req, res) {
console.log(req.method);//获取请求方法名
let { pathname, query } = url.parse(req.url, true);
console.log(pathname);
console.log(query);
console.log(req.url);//获取请求路径
console.log(req.headers);//请求头对象
let result = [];
req.on('data', function (data) {
result.push(data);
});
req.on('end', function () {
let r = Buffer.concat(result);//请求体
console.log(r.toString());
//如果进行响应
res.end(r);
})
});
server.on('close', function (req, res) {
console.log('服务器关闭 ');
});
server.on('error', function (err) {
console.log('服务器错误 ');
});
server.listen(8089, function () {
console.log('server started at http://localhost:8089');
});
复制代码
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
HTTP Essentials
Stephen A. Thomas、Stephen Thomas / Wiley / 2001-03-08 / USD 34.99
The first complete reference guide to the essential Web protocol As applications and services converge and Web technologies not only assume HTTP but require developers to manipulate it, it is be......一起来看看 《HTTP Essentials》 这本书的介绍吧!
图片转BASE64编码
在线图片转Base64编码工具
HEX CMYK 转换工具
HEX CMYK 互转工具