node文档阅读笔记

node & server:

1.module还有些其他属性,简单说下吧。
module.id 模块id,往往是模块路径
module.children 子模块
module.filename 模块路径
module.loaded 是否加载完毕
module.parent 父模块
module.paths 各级 node_modules 目录路径

2.require.resolve 不会加载执行,只会返回模块的绝对路径。
require.cache 缓存所有已经加载的模块,如果你要更新模块就要删除这里的缓存。

1
2
3
var a = require('./a');
var p = require.resolve('./a'); // 得到模块路径
delete require.cache[p]; // 删除模块缓存

3.require.extensions 自定义模块后缀,可以手动设置模块的加载,比如说直接在测试的时候拒绝加载某些类型的文件只需:
运行如下语句时,css文件便不会读取(已过时)

1
2
3
require.extensions['.css'] = function noop() {
return null;
}

4.process模块用来与当前进程互动,可以通过全局变量process访问,不必使用require命令加载。它是一个EventEmitter对象的实例

5.console 函数默认情况下都是异步执行的,除非要将信息输出到文件中。硬盘已经很快了,操作系统通常使用高速缓存进行读写,但仍然不可避免发生进程阻塞的情况。

6.最简单的调用栈调试可以直接使用console.trace() 打印出调用处的调试信息

7.内存的指向和克隆(数组

1
2
3
4
5
6
const arr = new Uint16Array(2);
arr[0] = 5000;
arr[1] = 4000;

const buf1 = Buffer.from(arr); // copies the buffer
const buf2 = Buffer.from(arr.buffer); // shares the memory with arr;

8.for...in是ES5里的遍历键 for...of是ES6的遍历值

9.Buffer.byteLength(string[, encoding])返回字符串的实际字节长度。与 String.prototype.length 不同的是,该方法返回数值表示字符串占多少字节,而 String.prototype.length 返回的数值表示字符串有多少个字符。通过这个我们可以计算出一个字符串里有多少汉字符或其他字符(只包含一种其他字符

10.child_process.spawn() 方法用于异步创建子进程,不会阻塞 Node.js 的事件循环机制。
child_process.spawnSync() 方法与上一个方法提供了相同的功能,不同之处在于它是同步执行的,执行时会阻塞事件循环机制,知道子进程结束任务并退出。

11.疑惑??????每新创建一个EventEmmiter的实例接相当于新开了一个消息队列吗?????

12.当 EventEmitter 的实例出现错误时,就会触发 error 事件,这在 Node.js 中被视为一个特殊事件。
为了避免 Node.js 的进程崩溃,开发者可以使用 domain 模块(不过该模块已被抛弃)或者注册一个 process.on('uncaughtException') 来解决:

1
2
3
process.on('uncaughtException', (err) => {
console.log('whoops! there was an error');
});

13.默认情况下,任何事件可以注册 10 个监听器。EventEmitter 的实例可以通过 emitter.setMaxListeners(n) 方法修改这一限制值。如果要为所有的 EventEmitte 实例修改该属性,需要使用 EventEmitter.defaultMaxListeners 属性。

14.如果未对 response 事件设置处理函数,则响应信息就会被忽略。不过,如果添加了 response 事件的处理函数,则无论是使用 response.read(),或者添加 data 事件处理器,还是调用 .resume() 方法,都必须对响应对象的数据进行处理。只有数据经过处理之后,才会触发 end 事件。此外,除非读取数据,否则将会占用不必要的内容,直至触发 process out of memory 错误。

15.使用 response.setHeader() 配置头信息之后,这些头信息会被其他头信息合并并传递给 response.writeHead(),但是传递给 response.writeHead() 的头信息优先级较高,这就相当于你可以使用setHeader设置多个头信息不断叠加,但是要在响应发送过后再使用setHeader的话将会报错

16.在 HTTPS 中,使用 request.socket.getPeerCertificate() 方法可以获取客户端的验证资料。

17.require引入的模块实际上是通过在文件的外面包上一个:

1
2
3
(function(require,module,export....){
....{content}....
})()

做到的,所以不要再问require是哪里来的了

18.require.main既是主文件模块,并且如果没能够在自己的文件夹中找到需要的模块的话,会到NODE_PATH所指定的环境变量中去找有没有node_modules

19.os模块可以用来判断系统,并针对不同的系统进行相应的配置,比如在使用child_process创建子线程的过程中,我们就需要知道是window或者*nix,看是来使用bat还是shell;

20.path.join([path1][, path2][, ...])方法非常实用,可以拼接出一个路径,空字符会被视为.,即当前路径

1
2
path.join('/foo', 'bar', 'baz/asdf', 'quux', '..')
// returns '/foo/bar/baz/asdf'

21.当向进程发送SIGNUP信号的时候,将会关闭该进程;(应用:如果我们可以忽略SIGHUP信号,关掉窗口应该就不会影响程序的运行了。nohup命令可以达到这个目的,如果程序的标准输出/标准错误是终端,nohup默认将其重定向到nohup.out文件。值得注意的是nohup命令只是使得程序忽略SIGHUP信号,还需要使用标记&把它放在后台运行,这样在退出session后也可以保持程序运行了)