Node.js

what

Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js’ package ecosystem, npm, is the largest ecosystem of open source libraries in the world.

  • Node是JavaScript运行环境
  • 事件驱动,非阻塞IO模型
  • 使用npm管理包

基本原理

  • Chrome V8 是 Google 发布的开源 JavaScript 引擎,采用 C/C++ 编写,在 Google 的 Chrome 浏览器中被使用。Chrome V8 引擎可以独立运行,也可以用来嵌入到 C/C++ 应用程序中执行。
  • Event Loop 事件循环(由 libuv 提供)
  • Thread Pool 线程池(由 libuv 提供)

带来的好处

  • 用户体验
  • 资源分配

异步编程

Buffer

The Buffer class was introduced as part of the Node.js API to enable interaction with octet streams in TCP streams, file system operations, and other contexts.

原因:应用需要

  • 处理网络协议
  • 操作数据库
  • 处理图片
  • 接受上传文件等

处理大量二进制数据,JavaScript自由的字符串不能满足这些要求

结构

与C++结合:node_buffer–>Buffer/SlowBuffer

也就是JavaScript的Buffer或者SlowBuffer依赖于C++的内建模块,buffer内存不归v8管理,是堆外内存

声明

1
2
3
4
5
6
const str="helloworld"
const buf=new Buffer(str,'utf-8')
console.log(buf)
//=><Buffer xx xx xx>16进制数字
buf[22]=10
//只能赋值0-255的数值,否则会取余256

内存分配

Node的C++层面实现内存申请,在JavaScript中分配内存的策略,Node采用slab的动态内存管理机制,slab的3种状态

  • full:完全分配
  • partial:部分分配
  • empty:没有分配

Buffer.poolSize=8*1024,即以8kb为大小Buffer的分界,小于8Kb拼单,大于8kb分配大的slab被大buffer独占

转换

可以转换的类型

  • asc2
  • utf-8
  • utf-16LE/UCS-2
  • Base64
  • Binary
  • Hex

采用new Buffer(str,[encoding]),默认utf-8

buf.write(string,[offset],[length],[encoding])默认utf-8

buf.toString([encoding],[start],[end])默认utf-8

拼接

性能

性能大概是字符串的一倍