Node.js in Practice 读书笔记 (第二章)

    jwolf 
1027  0  0   2016-1-8 11:40


全局对象能在不同的module中调用,除了ECMAScript自带的全局对象之外,Node还提供了一些host objects方便开发者的调用。

安装第三方module:

npm search [third party name]
npm install [third party name]

使用:

var XXX = require('third party name')

值得注意的是,安装npm install 的命令可以加上-g的参数来表示全局的安装,也就是不限制于本项目。实际上使用全局安装的时候,如果是Unix系统,安装的目录一般式在/usr/local/lib/node_modules, Windows的话,会在node的安装目录。

 

创建和管理modules 

使用require引用的时候,require可以返回一个对象或者方法。当你的程序业务逻辑比较负责的时候,你当然会想到分开不同的模块来方便管理。使用require C语言中的include甚至 Ruby中的require是不一样的。主要的不同在于: Node返回一个对象或方法,而他们会把其他代码引到当前模块,甚至占用命名空间。

export对象是全局的,但是从它的使用方式而言,它更像在module的作用域内。

require能导入目录当作模块的,目录中带有一个package.json的话,使用require的时候就可以使用package.json里面的配置来引用,否则会指向 index.js

比如:

module.exports = {
  assets: require('./assets'),
  documents: require('./documents'),
  users: require('./users')
};

上面的assets,documents,users对应的是一个目录,目录下有相关的js文件。这就相当于,整个目录可以当作一个module

 

关于I/O

node yourjs.js 2>log.txt

 

以上命令会把stderr 的输出写到log.txt 命令中的“2”是对应stderr, stdin, stdout, stderr 分别对应012

 

计算效率

console.time('label')console.timeEnd('label') 

process绑定signal 监听器

   先上代码:

process.stdin.resume();
process.on('SIGHUP', function () {
  console.log('Reloading configuration...');
});
console.log('PID:', process.pid);

运行上面的Node代码,新建一个command窗口,通过kill –SIGHUP [pid]给该进程发送signal 值得注意的是kill在这里不是把程序杀掉,而是传送signal使用kill –l 可见linux下的signal

控制执行时间

 熟悉web前端的朋友们都知道,setTimeout是延时执行:

setTimeout(function(){},[])

另外一种比较清晰的写法,看例子:

function Bomb() {
  this.message = 'Boom!';

Bomb.prototype.explode = function() {
  console.log(this.message);
};
var bomb = new Bomb();
var timeoutId = setTimeout(bomb.explode.bind(bomb), 1000);
clearTimeout(timeoutId);

让一段代码有周期地循环执行,直到程序结束, 比如在程序运行的过程中观察进程内存使用情况:

function monitor() {
  console.log(process.memoryUsage());

var id = setInterval(monitor, 1000);
id.unref();
setTimeout(function() {
  console.log('Done!');
}, 5000);

如果没有使用unref方法,setInterval参数中的方法会一直被调用,并且阻止程序停止。

setImmediate , setInterval, process.nextTick在事件循环周期中的顺序如下: