2019-08 上旬 ✅
- 创建于:2019-08-01
- 更新于:2023-03-16

# 2019-08-10: css flex 相关的所有属性,并说明作用 ✅✅
好好想想先 😌
- 参考链接
- 一句话
- 容器属性
display: flexdisplay: inline-flexflex-directionflex-wrapflex-flowjustify-contentjustify-itemsalign-itemsalign-content
- 项目属性
flexflex-basisflex-shrinkflex-growjustify-selfalign-self
- 容器属性
# 2019-08-09: react router 5 新特性 ✅✅
好好想想先 😌
参考链接
一句话
- One of the main new features in this release is the ability to use an array in
Route path, so if you want to render the same component at 2 different route paths, you no longer have to create 2 routes. - 因为写错版本号导致的大版本升级
- One of the main new features in this release is the ability to use an array in
# 2019-08-08: react router 4 中 Switch 的作用 ✅✅
好好想想先 😌
- 参考链接
- 一句话
- Switch 是唯一的因为它仅仅只会渲染一个路径。相比之下(不使用 Switch 包裹的情况下),每一个被 location 匹配到的 Route 将都会被渲染。
# 2019-08-07: Node 中的 setImmediate 和 process.nextTick ✅✅
好好想想先 😌
参考链接
一句话
- Node 的异步语法比浏览器更复杂,因为它可以跟内核对话
// test.js setTimeout(() => console.log(1)) setImmediate(() => console.log(2)) process.nextTick(() => console.log(3)) Promise.resolve().then(() => console.log(4)) ;(() => console.log(5))() // 5 3 4 1 2- 异步任务分为两种
- 追加在本轮循环的异步任务
- 追加在次轮循环的异步任务
- 微任务
- 根据语言规格,Promise 对象的回调函数,会进入异步任务里面的"微任务"(microtask)队列。
- 微任务队列追加在 process.nextTick 队列的后面,也属于本轮循环。
- 宏任务
- setImmediate, setTimeout
- 追加在次轮循环
- 事件循环分为六个阶段
# 2019-08-07: Node 中的 Error 有哪些类型?对 throw 关键字的理解。 ✅✅
好好想想先 😌
- 参考链接
- 一句话
- Node.js 应用程序一般会遇到以下四类错误:
- 标准的 JavaScript 错误,例如
EvalError、SyntaxError、RangeError、ReferenceError、TypeError 或 URIError。 - 由底层操作系触发的系统错误,例如试图打开不存在的文件、或试图使用已关闭的 socket 发送数据。
- 由应用程序代码触发的用户自定义的错误。
- AssertionError 错误,当 Node.js 检测到不应该发生的异常逻辑时触发。这类错误通常来自 assert 模块。
- 所有由 Node.js 引起的 JavaScript 错误与系统错误都继承自或实例化自标准的 JavaScript
Error类,且保证至少提供类中的属性。
- 标准的 JavaScript 错误,例如
- throw 语句允许您创建自定义错误。从技术上讲您能够抛出异常(抛出错误)。异常可以是 JavaScript 字符串、数字、布尔或对象:
- Node.js 应用程序一般会遇到以下四类错误:
# 2019-08-06: Node cluster(集群) 作用及原理 ✅✅
好好想想先 😌
- 参考链接
- 一句话
- 单个 Node.js 实例运行在单个线程中。 为了充分利用多核系统,有时需要启用一组 Node.js 进程去处理负载任务。
- cluster 模块可以创建共享服务器端口的子进程。
- 工作进程由 child_process.fork() 方法创建,因此它们可以使用 IPC 和父进程通信,从而使各进程交替处理连接服务。
- cluster 模块允许设立一个主进程和若干个 worker 进程,由主进程监控和协调 worker 进程的运行。worker 之间采用进程间通信交换消息,cluster 模块内置一个负载均衡器,采用 Round-robin 算法协调各个 worker 进程之间的负载。运行时,所有新建立的链接都由主进程完成,然后主进程再把 TCP 连接分配给指定的 worker 进程。
# 2019-08-05: preventDefault(), stopPropagation(), stopImmediatePropagation() 区别 ✅✅
好好想想先 😌
- 参考链接
- 一句话
- preventDefault: 如果当前 event.cancelable 属性为 true,则取消的当前事件的默认动作,但不阻止当前事件的进一步传播
- stopPropagation: 阻止当前冒泡或捕获阶段的进一步传播
- stopImmediatePropagation: 阻止调用相同事件的其他监听器
# 2019-08-04: child_process exec, spawn, fork, send 作用和区别 ✅✅
好好想想先 😌
参考链接
一句话
- exec 方法执行一个命令,返回一个流对象,也可以用回调函数的方式
var exec = require('child_process').exec var child = exec('ls -l') child.stdout.on('data', function (data) { console.log('stdout: ' + data) }) child.stderr.on('data', function (data) { console.log('stdout: ' + data) }) child.on('close', function (code) { console.log('closing code: ' + code) })- spawn 没有回调函数,需拆分参数,返回一个流对象
var ls = child_process.spawn('/bin/ls', ['-l', '.'])- child_process.exec 返回整个子进程处理时产生的 buffer,这个 buffer 默认大小是 200K。 当子进程返回的数据超过默认大小时,程序就会产生”Error: maxBuffer exceeded”异常
- spawn 没有 maxBuffer 限制
- fork 方法直接创建一个子进程,执行 Node 脚本
// main.js var n = child_process.fork('./child.js') n.on('message', function (m) { console.log('PARENT got message:', m) }) n.send({ hello: 'world' }) // child.js process.on('message', function (m) { console.log('CHILD got message:', m) }) process.send({ foo: 'bar' })- send 用于 fork 进程间的通信
# 2019-08-03: child_process 原理 ?如何和主进程通信 ? ✅✅
好好想想先 😌
- 参考链接
- 一句话
- Nodejs 运行时刻的主进程既是 Event Loop 进程,通过该进程可以创建出任意多个子进程( Child Process ),并且子进程和父进程维护了三个特殊的管道,分别是 stdin、stdout 以及 stderr 这样的三个管道,父进程和子进程可以通过这些管道实现无阻塞( non-blocking) 的通讯方式
- 通过标准输入输出和主进程通信
child.stdout.on('data', (data) => { console.log(`child stdout: ${data}`) }) child.stderr.on('data', (data) => { console.error(`stderror ${data}`) })
# 2019-08-02: 如何理解 NodeJS 中的 Buffer ?有哪些方法 ? 有何应用 ? ✅✅
好好想想先 😌
- 参考链接
- 一句话
- Buffer 是在内存中开辟的一片区域,用于存放二进制数据。Buffer 所开辟的是堆外内存。
- 主要应用于流和存储需要占用大量内存的数据
Buffer.from(array | string | object | bufferArray)- 创建一个 bufferBuffer.alloc(size)- 分配内存空间
# 2019-08-01: 解释线程、进程,并行、并发,同步、异步,阻塞、非阻塞 ✅✅
好好想想先 😌
- 参考链接
- 一句话
- 线程和进程
- 一个程序至少有一个进程,一个进程至少有一个线程
- 进程(英语:process),是指计算机中已运行的程序。进程为曾经是分时系统的基本运作单位。在面向进程设计的系统(如早期的 UNIX,Linux 2.4 及更早的版本)中,进程是程序的基本执行实体;在面向线程设计的系统(如当代多数操作系统、Linux 2.6 及更新的版本)中,进程本身不是基本运行单位,而是线程的容器。
- 线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在 Unix System V 及 SunOS 中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。
- 并行和并发
- 并发:一个处理器同时处理多个任务。
- 并行:多个处理器或者是多核的处理器同时处理多个不同的任务.
- 前者是逻辑上的同时发生(simultaneous),而后者是物理上的同时发生。
- 同步和异步
- 同步是阻塞模式,异步是非阻塞模式。
- 同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,知道收到返回信息才继续执行下去;
- 异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回式系统会通知进程进行处理,这样可以提高执行的效率。
- 线程和进程