Node.js 核心模块学习

Posted 一个XXX的分享

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node.js 核心模块学习相关的知识,希望对你有一定的参考价值。

核心模块(Core-Modules) 是 Node.js 中比较基础的内容,为 Node.js 提供了一些必要的模块。例如: fs 文件系统、path 路径、http 网络、assert 断言等等。

Node.js 出现很大程度的简化了后端开发,让前端攻城狮可以很容易的介入的后端的开发中。由于语言选择使用 javascript ,也因此你会发现作为一个前端开发人员非常容易上手 Node.js 。

核心模块

核心模块中除去3个http附属模块,一共大约30个js文件,此文章只讲解其中一些较为容易理解的部分。如有其他模块疑问,请读者参看 API 。 ps: 以下内容也是本人参考 API 进行了一些自己的理解和总结

  • console(控制台)

  • global(全局变量)

  • path(路径)

  • url

  • timer(定时器)

  • querystring(查询字符串)

  • util(实用工具)

  • assert

console

控制台输出是平时我们接触最多的部分,因为只要涉及到调试、查看信息等都会需要到控制台命令。 查看console的API文档不难发现,它的内部函数只有以下简单几个

  • log

  • info

  • warn

  • error

  • dir

  • time/timeEnd

  • trace

  • assert

log

控制台输出命令,基于 util.format 进行封装。 第一参数为主要输出信息,其他参数类似于 C 语言中 printf 的代替值。

// 控制台会输出: 这是一条输出信息
console.log('这是一条输出信息')
// 控制台会输出: 这是 1 条输出信息
console.log('这是 %d 条输出信息', 1) 
info

如果查看官方文档给出的结论是,info 为 log 的别名 笔者在查看源代码时,获取了如下信息

// 将信息输输出到标准输出流 (stdout) 中
Console.prototype.log = function(...args) {
  this._stdout.write(`${util.format.apply(null, args)}\n`);
};
// info函数等同于log函数
Console.prototype.info = Console.prototype.log;

结论, info 与 log 的使用方式相同

warn

控制台输出错误命令,基于 util.format 进行封装。 主要打印在 stderr 中

console.warn('warning')
error

如果查看官方文档给出的结论是,error 为 warn 的别名

console.error(new Error('错误信息'));

笔者在查看源代码时,获取了如下信息

// 将信息输输出到标准错误流 (stderr) 中
Console.prototype.warn = function(...args) {
  this._stderr.write(`${util.format.apply(null, args)}\n`);
};
// warn函数等同于error函数
Console.prototype.error = Console.prototype.warn;

结论, error 与 warn 的使用方式相同

dir

dir 用于打印 Object 对象, 在 obj 上使用 util.inspect() 并打印结果字符串到控制台 该方法包含 2 个参数

  • obj 要输出的对象

  • options 该选项为 JSON 对象

    • showHidden 如果为 true,则该对象中的不可枚举属性和 symbol 属性也会显示。默认为 false

    • depth 告诉 inspect 需要递归几层。对于检查大对象有很大帮助。默认为 2,如果想无线递归则使用 null

    • colors 如果为true,则输出会带有 ANSI 颜色代码。 默认为 false。 以下为 console.dir 的测试数据

var pro = [
    {
        "name": "北京",
        "sub": [
            {"name": "东城区"},
            {"name": "西城区"},
            {"name": "崇文区"},
            {"name": "宣武区"},
            {"name": "朝阳区"},
            {"name": "海淀区"},
            {"name": "丰台区"},
            {"name": "石景山区"},
            {"name": "房山区"},
            {"name": "通州区"},
            {"name": "顺义区"},
            {"name": "昌平区"},
            {"name": "大兴区"},
            {"name": "怀柔区"},
            {"name": "平谷区"},
            {"name": "门头沟区"},
            {"name": "密云县"},
            {"name": "延庆县"},
            {"name": "其他"}
            ],
        "type": 0
    }
]
console.dir(pro)

使用 node 执行该文件,得出以下结果 由上图可知, 默认情况下 Object 对象只能递归到 2 层。因此,可以修改如下参数。

var options = {
    depth: null, // 使其无限递归
    colors: true // 加上控制台颜色(默认)
}
console.dir(pro, options)

将代码修改为如上效果,重新执行 node 命令,效果如下图 Node.js 核心模块学习结论,该方法用于打印复杂对象时效果显著

time/timeEnd

time 以及 timeEnd 是成对使用的方法。 原理: 当调用 time 时, 赋予 time 函数一个标识 label,便会启动一个计时器,用于记录 time - timeEnd 之间所消耗的时间;当调用 timeEnd 时,将会结束计时器,并将计时器的结果输出在控制台中。 作用: 用于查看代码的执行时间,便于对代码进行优化 注意: label 部分所填入的值,需要一致 使用方式如下:

console.time('time')
for (var i = 0; i < 1000000; i++) {  }
console.timeEnd('time')

执行结果如下图: Node.js 核心模块学习

trace

作用: 用于打印当前调用栈信息,Trace:被输出到 stderr 中 堆栈跟踪会根据被调用的跟踪的位置变化而变化

console.trace('当前栈信息')

执行后,如下图 

assert

断言, 将 Core-Modules 中的 assert 封装后,可以便于开发者快速使用断言。 具体代码实现如下:

Console.prototype.assert = function(expression, ...args) {
  if (!expression) {
    // 引入 assert 模块,并使用 ok 函数
    require('assert').ok(false, util.format.apply(null, args));
  }
};

断言在很多编程语言中都有,因此,如果有其他语言的基础上手非常快。 此处的断言与浏览器中的断言不同,浏览器中不会终止后续操作,但 Node.js 中的断言,会终止后续所有操作。 参数:

  • expression 类型为 boolean,为 true 时,执行后续操作; 为 false 时,终止后续操作,并抛出 AssertionError

  • message Error的说明信息

console.assert(false, '此处有异常')
console.log('这个log不会执行')

执行结果如下: 

global

global 即为 Node.js 的全局对象,类似于浏览器中的 window 对象。global内部包含以下几个内容

  • __dirname

  • __filename

  • module

  • require

  • exports

  • Buffer 类

  • console

  • process

  • setImmediate/clearInterval

  • setInterval/clearInterval

  • setTimeout/clearTimeout


以上是关于Node.js 核心模块学习的主要内容,如果未能解决你的问题,请参考以下文章

Node.js之Web学习笔记

Node.js核心入门

node.js入门学习--Demo模块化改造

深入浅出Node.js 模块机制

「Node学习笔记」Node.js的模块实现及编译

视频分享尚硅谷前端HTML5视频_NodeJS核心技术视频