NodeJs学习笔记 01 -- 入门之模块、全局对象

一、如何运行

有两种方式
- 一种是输入node后进入命令交互模式,然后输入一条代码语句后立即执行;
- 另一种是常用方式,即进入文件目录,node +文件名执行文件。

二、模块

在编写每个模块时,都有require,exports,module三个预先定义好的变量供使用。

  • require

    require用于在当前模块中加载和使用别的模块。
    模块名可使用相对路径(以./开头),或者是绝对路径(以/或C:之类的盘符开头)。
    另外,模块名中的.js扩展名可以省略。
    查找顺序:文件名称 -> .js -> .json -> .node

var foo1 = require('./foo'); 
var foo2 = require('./foo.js');  
var foo3 = require('/home/user/foo'); 
var foo4 = require('/home/user/foo.js');
  • exports

    exports对象是当前模块的导出对象,用于导出模块公有方法和属性。
    别的模块通过require函数使用当前模块时得到的就是当前模块的exports对象。以下例子中导出了一个公有方法。

exports.hello = function () {     
    console.log('Hello World!'); 
};
  • module

    通过module对象可以访问到当前模块的一些相关信息,但最多的用途是替换当前模块的导出对象。例如模块导出对象默认是一个普通对象,如果想改成一个函数的话,可以使用以下方式。

module.exports = function () {     
    console.log('Hello World!'); 
}; 

以上代码中,模块默认导出对象被替换为一个函数。

三、模块初始化

一个模块中的JS代码仅在模块第一次被使用时执行一次,并在执行过程中初始化模块的导出对象。之后,缓存起来的导出对象被重复利用。

假如有counter.js内容如下:

var i = 0;  
function count() {     
    return ++i; 
}  
exports.count = count;

主模块main.js内容如下:

var counter1 = require('./counter'); 
var counter2 = require('./counter');   
console.log(counter1.count()); 
console.log(counter2.count()); 
console.log(counter2.count()); 

运行该程序的结果如下:

$ node main.js 
1 
2
3 

可以看到,counter.js并没有因为被require了两次而初始化两次。

四、全局对象-global

在一个模块中通过var定义的变量,其作用域范围是当前模块,外部不能够直接的访问
如果我们想一个模块能够访问另外一个模块中定义的变量,可以:
1.把变量作为global对象的一个属性,但是这样的做法是推荐
2.使用模块对象 module

global.a = 100;
var a = 100;
module.exports.a = a;

module : 保存提供和当前模块有关的一些信息

在这个module对象,有一个子对象:exports 对象
我们可以通过这个对象把一个模块中的局部变量对象进行提供访问

五、全局对象-filename、dirname

  • __filename
    返回当前模块文件解析后的绝对路径。
    该属性其实并非全局的,而是模块作用域下的。

  • __dirname
    返回当前模块文件所在目录解析后的绝对路径。
    该属性也不是全局的,而是模块作用域下的。

六、全局对象-process

通过这个对象的属性和方法,我们可以对当前运行的程序进程进行控制。

process.argv:
第一个元素会是 ‘node’, 第二个元素将是 .Js 文件的名称。接下来的元素依次是命令行传入的参数。

process.pid:
当前进程的 PID

process.version:
一个暴露编译时存储版本信息的内置变量 NODE_VERSION 的属性。

process.versions:
一个暴露存储 node 以及其依赖包 版本信息的属性。

process.title:
获取/设置 (Getter/setter) ‘ps’ 中显示的进程名。

process.exit:
当进程将要退出时触发。这是一个在固定时间检查模块状态(如单元测试)的好时机。需要注意的是 ‘exit’ 的回调结束后,主事件循环将不再运行,所以计时器也会失效。

process.stdin:
一个指向 标准输入流(stdin) 的可读流(Readable Stream)。标准输入流默认是暂停 (pause) 的,所以必须要调用 process.stdin.resume() 来恢复 (resume) 接收。

process.stdout:
一个指向标准输出流(stdout)的 可写的流(Writable Stream)。

function Log(data) {
    process.stdout.write(data);
}
Log('你好');

你可能感兴趣的:(NodeJs,Node)