一、如何运行
有两种方式
- 一种是输入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('你好');