1. NodeJs的事件模型被称为非阻塞式IO或者事件驱动IO
2. Node.js 几乎每一个 API 都是支持回调函数的。
3. Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
4. Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。
5. 在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。
6.
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。
但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。
每当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库。原始数据存储在 Buffer 类的实例中。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。
7. 一个NodeJS文件就是一个模块。
8. NodeJS提供了exports和require两个对象。
9.
有时候我们只是想把一个对象封装到模块中,格式如下:
module.exports = function() {
// ...
}
例如:
//hello.js
function Hello() {
var name;
this.setName = function(thyName) {
name = thyName;
};
this.sayHello = function() {
console.log('Hello ' + name);
};
};
module.exports = Hello;
这样就可以直接获得这个对象了:
//main.js
var Hello = require('./hello');
hello = new Hello();
hello.setName('BYVoid');
hello.sayHello();
10.
由于 Node.js 中存在 4 类模块(原生模块和3种文件模块),尽管 require 方法极其简单,但是内部的加载却是十分复杂的,其加载优先级也各自不同。如下图所示:
11. 在浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局对象是 global。
12. 常见的客户端存储有几种:第一种,Web存储,其中包含localStorage对象和sessionStorage对象;第二种,Cookie,其作为一种被服务端脚本使用的客户端存储机制。
13. NodeJS虽然是单线程的,但是这里的单线程仅仅是JavaScript执行在单线程中罢了,其内部完成I/O任务的是线程池。
14. 异步I/O的实现主要包含两个阶段:提交请求和处理结果。这两个阶段中间有事件循环的调度,两者彼此不关联。
15. NodeJS在处理异常上形成了一种约定,将异常做为回调函数的第一个实参传回,如果为空值,则表明异步调用没有异常抛出。
async(function (err, results) { // TODO });
16. 异步编程的难点:
- 异常处理
- 函数嵌套过深
- 阻塞代码
- 多线程编程,child_process是其基础API,cluster模块是更深层次的应用。借助Web Workers的模式,开发人员要更多的去面临跨线程的编程。
- 异步转同步
17. 异步编程的主要解决方案有如下3种:
- 事件发布/订阅模式
- Promise/Defered模式
- 流程控制库
18. mocha默认的模式是Behavior Driven Develop (BDD),要想执行TDD的test的时候需要加上参数,如:
mocha -u tdd test.js
对于TDD,我们用suite, test, setup, teardown。
对于BDD,我们用describe, it, before, after