nodeJS

Nginx 比 Apache 高并发的原因

Nginx 负载均衡调度算法 负载均衡之轮询算法

Apache 多进程(多线程)

Nginx 单进程(单线程)

new promise(console.log(3)) // 这一轮最后执行
setTimeout(console.log(2)) // 下一轮执行
console.log(1)
// 1 3 2

path.resolve()指向根目录

export const App
// import { App } from app.js

export default App
// import App from app.js

Module.exports = {}
// import * as Moment from "moment"

Module.exports = {
  _default: this
}
// import * as React from 'react';
// import React from 'react';

buffer 缓冲器

new ArrayBuffer([1, 2, 3])

TypedArray 有类型的数组

  • Uint8Array
  • Uint16Array
  • Uint32Array

如果要把 blob 文件转化为二进制的数据的话,要先把 blob 转化为 arraybuffer,然后再使用 typedArray 就可以直接编辑二进制数据了

var ab = new ArrayBuffer(32)
var iA = new Int8Array(ab)
iA[0] = 97
var blob = new Blob([iA], { type: 'application/octet-binary' })
var fr = new FileReader()
fr.addEventListener('load', function (ev) {
  var abb = ev.target.result
  var iAA = new Int8Array(abb)
  console.log(iAA)
})
//把blob文件转化为arraybuffer;
fr.readAsArrayBuffer(blob)
const { Buffer } = require('Buffer');
const buf = Buffer.from('abcd', 'utf8'); // <Buffer 61 62 63 64>
const buf = Buffer.from([1, 2, 3, 4]); // <Buffer 01 02 03 04>
const buf = Buffer.from([1, 2, 3, 257]); // <Buffer 01 02 03 01> 257 % 256
const buf = Buffer.from([1, 2, 3, 257, 23]); // <Buffer 01 02 03 01 17> 16进制
const buf = Buffer.from([1, 2, 3, 257, 0xff]); // <Buffer 01 02 03 01 ff> 16进制

buf.buffer // ArrayBuffer {[uint8Contents]: <63 6f 6e ...>, byteLength: 8192}
buf.byteOffset // 152 从第152位开始为实际数据
buf.byteLength // 5

const buf1 = Buffer.from(buf)
buf[0] = 9 // buf1[0] = 1 复制
const buf2 = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength)
buf[0] = 9 // buf2[0] = 9 引用
buf2.compare(buf) // 0 相同 1 大于 -1 小于
const buf = Buffer.alloc(2) // <Buffer 00 00>
buf.fill('a') // <Buffer 61 61>
buf.writeUInt16BE(2) // <Buffer 00 02> 大端字节序
buf.writeUInt16LE(2) // <Buffer 02 00> 小端字节序

Event Loop 事件循环

tick(phase):

timers (setTimeout, setInterval)

-> pending callbacks (错误事件)

-> idle, prepare

-> poll (绝大多数的callback在这个阶段执行,到队列里把callback找出来执行,socket事件,文件IO)

-> check (setImmediate)

-> close callbacks (close事件)

每个阶段都有一个事件队列,队列里有多个等待执行的事件,有个可以执行的数量上限

var fs = require('fs');
// 在poll阶段的回调,下一个阶段是check,所以永远是setImmediate先执行
fs.readFile(path.join(_dirname, './project.csv'), () => {
  setTimeout(() => {
    console.log('setTimeout');
  }, 0);
  setImmediate(() => {
    console.log('setImmediate');
  });
});

process.nextTick() 当前阶段的队列尾部,无限递归的话会永远停留在这个阶段,上限1000次

function MyEmitter() {
  EventEmitter.call(this);
  this.emit('event');

  // use nextTick to emit the event once a handler is assigned
  process.nextTick(() => {
    this.emit('event');
  });
}
util.inherits(MyEmitter, EventEmitter);

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
  console.log('an event occurred!');
});
// 可能会错过这一次发出的事件
Article
Tagcloud
DVA Java Express Architecture Azure CI/CD database ML AWS ETL nest sql AntV Next Deep Learning Flutter TypeScript Angular DevTools Microsoft egg Tableau SAP Token Regexp Unit test Nginx nodeJS sails wechat Jmeter HTML2Canvas Swift Jenkins JS event GTM Algorithm Echarts React-Admin Rest React hook Flux Redux ES6 Route Component Ref AJAX Form JSX Virtual Dom Javascript CSS design pattern