手记
下载APP

Nodejs提炼与升华(四) Nodejs核心模块 PART1

第四章 Nodejs核心模块

核心模块时Nodejs的心脏,它由一部分精简而高效的库组成,为Nodejs提供了基本的API。

4.1 全局对象

JS中有一个特殊的对象,成为全局对象,它及其所有的属性可以在程序的任何地方进行访问,即全局变量。在浏览器JS中,window是全局对象。而Nodejs中的全局对象则是global,所有的全局变量都是gobal对象的属性。也就是说,在Nodejs中能直接访问到的对象通常都是global的属性,如console(这个我们再熟悉不过了),process等。

在Nodejs中,你永远也不可能在最外层定义变量,因为所有的用户代码都是属于当前模块的,而模块本身不属于最外层上下文。换句话说,Nodejs的模块机制不会让你有机会污染全局命名空间。

4.1.1 filename和dirname

__filename表示当前正在执行的脚本文件名,它将输出文件所在位置的绝对路径,且和命令行参数所指定的文件名不一定相同。 如果在模块中,返回的值是模块文件的路径。

__dirname则表示当前执行脚本所在的目录。

运行下列代码

   console.log(__filename);console.log(__dirname);

输出结果:

D:\WebStorm 2016.2\WSPro\Node\NodejsCoreModule\globalObject__filename.js

D:\WebStorm 2016.2\WSPro\Node\NodejsCoreModule\globalObject

注意它输出的是文件的绝对路径。

4.1.2 console对象

console 用于提供控制台标准输出,它是由 Internet Explorer 的 JScript 引擎提供的调试工具,后来逐渐成为浏览器的事实标准。Node.js 沿用了这个标准,提供与习惯行为一致的 console 对象,用于向标准输出流(stdout)或标准错误流(stderr)输出字符。

我们在hello world案例中介绍过console的最常见用法:console.log()。下面是console对象的所有方法,我们将选择几个常见的进行重点讲解:

4.1.2.1 console.log()

让我们更深入的了解一下这个方法:console.log()接收若干个参数:如果没有参数,则打印一个换行;若只有一个参数,则输出这个参数的字符串格式;如果有多个参数,则成类似于C语言printf的形式,例如:

console.log("%s:%d","hello",25)

输出的结果是hello:25。

4.1.2.2 console.info()/console.error()/console.warn()

用法与console.log类似,输出信息、错误、警告消息,在控制台输出的字符串的颜色会发生变化或者其前会出现特别标志,不同的终端执行的效果不一样。

4.1.2.3 console.time()和console.timeEnd()

这两个是一对计时器组合,从console.time()开始计时,直到console.timeEnd()计时结束。它们都接收一个参数label,用于相互匹配。最后console.timeEnd()会输出 label:时间(以毫秒为单位)。 下面的代码会让你对它们的作用一目了然:

console.time("hello");
for(var i = 0;i<10086;i++){

}
console.timeEnd("hello");

输出:

hello:1ms(注:时间会因机器及其状态不同而不同)

4.1.2.4 console.trace()

向标准错误流输出当前调用栈,console.trace("I am tracing")。运行结果:

这个大概是比较高级的程序设计师才会用到的。

4.1.3 process

process用于描述当前Nodejs进程的状态,提供了一个与操作系统的简单接口,通常你在写本地命令行程序的时候少不了要和它打交道。

4.1.3.1 process进程事件

通过process在进程上注册相应的事件(更像是复写nodejs为我们注册好了的事件),在进程执行到的某一个时间点(比如进程将要结束、发生异常时等)将自动触发这些事件。下面的代码将帮助您理解process进程事件:

process.on("exit",function (code) {
    console.log("程序已经执行完毕,退出码"+code);
    throw new Error("系统错误")
});

process.on("uncaughtException", function () {
    console.log("错误已处理");
});

console.log("程序执行完毕");

运行结果:

程序执行完毕
程序已执行完毕,退出码:0    
错误已处理

从结果可以看出我们的程序会在执行完process绑定的事件的所有内容后结束。为process绑定uncaughtException可以有效的防治遇到未处理错误时打印堆栈跟踪信息并退出程序的默认行为出现。但注意,这种事件只在process.on的监听器的回调函数里其作用;在全局发生的错误不会被它处理

括展:
错误状态码。上面的代码中我们输出了code,如果程序正常执行或者异常被捕获,则code为0,否则code则为一个数字(1—12)。下面是错误状态码及其对应的错误的表格:

4.1.3.2 process的属性

process提供了很多有用的属性,方便我们更好的与系统交互:


(1)标准输入流和标准输出流

// 从控制台输入信息
process.stdin.resume();

// 获得控制台的信息
process.stdin.on('data', function (data) {
    process.stdout.write('read from console: ' + data.toString());
});

这段代码的作用就是从控制台输入一句话,然后程序会将你的之句话打印出来。这里要注意,获得的data默认是以二进制的形式读取,值是一个Buffer对象:<Buffer e5 a4 a7 e5 ae b6 e5 a5 bd>所以要用toString将其转化为字符串。

(2)其他常用属性

// 通过参数读取
process.argv.forEach(function(val, index, array) {
    console.log(index + ': ' + val);
});
// 获取执行路局(即node.exe的路径)
console.log(process.execPath);
// 平台信息
console.log(process.platform);

输出:

0: D:\node\node.exe
1: D:\WebStorm 2016.2\WSPro\Node\NodejsCoreModule\globalObject\process\processCharactor.js
D:\node\node.exe
win32
4.1.3.3 process成员方法

成员方法汇总表如下所示,按照老规矩,还是挑选几个重点的说:


(1)process.nextTick(callback)

这个方法为事件循环设置一项任务,Nodejs会在下次事件循环响应时调用callback。我们之前讨论过,Nodejs适合做IO密集型的应用,而不是计算密集型的应用,因为Nodejs只有一个线程,在任意时刻只有一个事件在执行。如果某个事件占用大量的CPU时间,执行时间循环的下一个事件就需要等待很久,因此Nodejs的一个原则就是尽量缩短每个事件的执行时间。process.nextTick()可以把复杂的工作拆散,变成一个个较小的事件。

function doSomething() {
    console.log("world");
    process.nextTick(function () {
        for(var i = 0; i<999999; i++){

        }
        console.log("end")
    });
}

doSomething();
console.log("hello");

如上代码,我们把循环放到了事件队列的最后面,所以输出:

hello
world
end

(2)其他重要方法

// 输出当前目录
console.log('当前目录: ' + process.cwd());

// 输出内存使用情况
console.log(process.memoryUsage());

// 以指定的状态码结束进程
process.exit(4);

运行结果:

当前目录: d:\WebStorm 2016.2\WSPro\Node\NodejsCoreModule\globalObject\process
{ rss: 17637376, heapTotal: 7409232, heapUsed: 3881296 }
[ 448465, 577789534 ]

这里注意,与__filename不同,process.cwd()是指的运行node的工作目录,可以使用 cd /d 对工作目录进行修改。

打开App,阅读手记
2人推荐
随时随地看视频慕课网APP