对Node.js中的基础知识进行讲解,包括全局变量、全局对象、全局函数以及用于实现模块化编程的exports和module对象等内容,这些知识是学习Node.js应用开发的基础。
全局,即程序中任何地方都可以使用,Node.js内置了多个全局变量、全局对象和全局函数,在开发Node.js程序时都可以使用,下面分别对它们进行讲解。
Node.js中的全局变量有两个,分别是__filename和__dirname,它们的说明如下:
例如,下面代码用来分别输出Node.js中两个全局变量的值:
console.log('当前文件名:',__filename);
console.log('当前目录:',__dirname);
全局对象可以在Node.js程序的任何地方进行访问,它可以为程序提供经常使用的特定功能。Node.js中的全局对象如下表所示:
接下来分别讲解console对象和process对象的使用。
console对象提供了Node.js控制台的标准输出,其常用方法及说明如下表所示:
(1)console.log()方法:在console.log()方法中,可以使用占位符输出变量(如数字变量、字符串变量和JSON变量等),常用的占位符如下表所示:
例如,下面代码使用%d占位符输出一个整数值:
console.log('变量的值是:%d',57);
上面代码中,在console.log()方法里添加了两个参数。第一个参数是字符串’变量的值是:%d’,第二个参数是数字57。其中,%d是占位符,会寻找后面位置的数字,因为第二个参数57,紧紧跟在后面,所以输出结果如下:
变量的值是:57
使用console.log()方法输出内容时,还可以有多个占位符,示例代码如下:
console.log('%d+%d=%d',273,52,273+52);
console.log('%d+%d=%d',273,52,273+52,52273);
console.log('%d+%d=%d & %d',273,52,273+52);
上面代码运行效果如下:
273+52=325
273+52=325 52273
273+52=325 & %d
观察代码可以发现,第1行代码中,占位符的个数是3个,后面的数字变量的个数也是3个,所以输出结果是“273+52=325”;第2行代码中,占位符的个数是3个,但是后面数字变量的个数是4个,输出结果“273+52=32552273”,说明多出的数字变量52273原样输出;第3行代码中,占位符的个数是4个,但是后面数字变量的个数是3个,输出结果“273+52=325 & %d”,说明多余的占位符没有找到匹配的数字变量,只能原样输出。
使用其他占位符的示例代码如下:
console.log('字符串 %s','hello world','和顺序无关');
console.log('JSON %j',{name:'Node.js'});
上面代码运行效果如下:
字符串 hello world 和顺序无关
JSON {"name":"Node.js"}
(2)console.time()方法和console.timeEnd()方法:console.time()方法和console.timeEnd()方法用来记录程序的执行时间段。console.time()方法用来开始计时,其参数只是起到标识的作用;console.timeEnd()方法用来结束计时,并输出程序运行所需的时间,它在显示结果时,会在标识参数后面自动添加以毫秒为单位的时间。例如,下面代码用来输出执行10的阶乘运算所需要的时间:
//开始计时
console.time('时间');
var output = 1;
for (var i = 1; i <= 10; i++) {
output *= i;
}
console.log('Result:', output);
//结束计时,并输出程序执行时间
console.timeEnd('时间');
Result: 3628800
时间: 11.027ms
说明
程序的执行时间不是固定时间,它与计算机配置有关。
process对象用于描述当前程序的状态,与console对象不同的是,process对象只在Node.js中存在,在JavaScript中并不存在该对象。process对象的常用属性及说明如下表所示:
process对象的常用方法及说明如下表所示:
输出process对象常用属性的值:
console.log('- process.env:', process.env);
console.log('- process.version:', process.version);
console.log('- process.versions:', process.versions);
console.log('- process.arch:', process.arch);
console.log('- process.platform:', process.platform);
console.log('- process.connected:', process.connected);
console.log('- process.execArgv:', process.execArgv);
console.log('- process.exitCode:', process.exitCode);
console.log('- process.mainModule:', process.mainModule);
console.log('- process.release:', process.release);
console.log('- process.memoryUsage():', process.memoryUsage());
console.log('- process.uptime():', process.uptime());
运行效果如下:
- process.env: {
USERDOMAIN_ROAMINGPROFILE: 'DESKTOP-05BA7LG',
LOCALAPPDATA: 'C:\\Users\\XIAOKE\\AppData\\Local',
PROCESSOR_LEVEL: '6',
……
}
- process.version: v19.0.1
- process.versions: {
node: '19.0.1',
v8: '10.7.193.13-node.16',
uv: '1.43.0',
zlib: '1.2.11',
brotli: '1.0.9',
ares: '1.18.1',
modules: '111',
nghttp2: '1.47.0',
napi: '8',
llhttp: '8.1.0',
openssl: '3.0.7+quic',
cldr: '41.0',
icu: '71.1',
tz: '2022b',
unicode: '14.0',
ngtcp2: '0.8.1',
nghttp3: '0.7.0'
}
- process.arch: x64
- process.platform: win32
- process.connected: undefined
- process.execArgv: []
- process.exitCode: undefined
- process.mainModule: Module {
id: '.',
path: 'K:\\nodepro',
exports: {},
filename: 'K:\\nodepro\\index.js',
loaded: false,
children: [],
paths: [ 'K:\\nodepro\\node_modules', 'K:\\node_modules' ]
}
- process.release: {
name: 'node',
sourceUrl: 'https://nodejs.org/download/release/v19.0.1/node-v19.0.1.tar.gz',
headersUrl: 'https://nodejs.org/download/release/v19.0.1/node-v19.0.1-headers.tar.gz',
libUrl: 'https://nodejs.org/download/release/v19.0.1/win-x64/node.lib'
}
- process.memoryUsage(): {
rss: 28078080,
heapTotal: 6639616,
heapUsed: 6031272,
external: 455122,
arrayBuffers: 17378
}
- process.uptime(): 0.095098
全局函数,即可以在程序的任何地方调用的函数,Node.js主要提供了6个全局函数,其说明如下表所示:
下面对Node.js中全局函数的使用进行讲解。
这两个全局函数分别用来设置和取消一个定时器,此处需要说明的是,setTimeout(cb,ms)设置的定时器仅调用一次指定的方法。示例代码如下:
var timer=setTimeout(function(){
console.log("您将在2秒后看到这句话")
},2000)
//clearTimeout(timer)
运行上面代码,2秒后将会显示如下内容:
您将在2秒后看到这句话
如果将上面代码中的最后一行取消注释,则运行程序时不会输出任何内容,因为虽然前3行代码添加了一个定时器,但是第4行又取消了该定时器,所以在控制台不会输出内容。
这两个全局函数分别用来添加和取消一个定时器。其中参数cb为要执行的函数;ms为调用cb函数前等待的时间;t表示要取消的setInterval()方法设置的定时器。使用setInterval()方法设置定时器与使用setTimeout()方法设置定时器的区别是,使用setInterval()方法设置的定时器可以多次调用指定的方法,而使用setTimeout()方法设置的定时器只能调用一次指定的方法。示例代码如下:
var i = 0 //记录执行程序的次数
var timer
timer = setInterval(function () {
i += 1
console.log("已执行" + i + "次")
if (i >= 5) {
clearInterval(timer) //执行5次后,取消定时器
console.log("执行完毕")
}
}, 2000)
运行上面的代码,每隔2秒会显示一次执行函数的次数,直到执行5次以后,取消定时器,最终输出结果如下:
已执行1次
已执行2次
已执行3次
已执行4次
已执行5次
执行完毕
这两个全局函数用来安排在I/O事件的回调之后立即执行的函数,以及取消setImmediate()创建的Immediate对象。其中,callback参数指的是要执行的函数,immediate参数表示使用setImmediate()创建的Immediate对象。
说明
I/O(input/output)即输入/输出,通常指数据在内部存储器与外部存储器或其他周边设备之间的输入和输出。
示例代码如下:
console.log("正常执行1");
var a = setImmediate(function () {
console.log("我被延迟执行了");
});
console.log("正常执行2")
//clearImmediate(a)
上面代码的运行结果如下:
正常执行1
正常执行2
我被延迟执行了
如果将最后一行代码取消注释,则运行结果如下:
正常执行1
正常执行2
Node.js主要使用模块系统进行编程,所谓模块,是指为了方便调用功能,预先将相关方法和属性封装在一起的集合体。模块和文件是一一对应的,即一个Node.js文件就是一个模块,这个文件可以是JavaScript代码、JSON或者编译过的C/C++扩展等。下面对Node.js模板化编程中用到的两个对象exports和module进行解析。
在Node.js中创建模块需要使用exports对象,该对象可以共享方法、变量、构造和类等,下面通过一个实例讲解如何使用exports创建一个模块。
使用exports对象实现模块化编程,步骤如下:
(1)在WebStorm中创建一个module.js文件,其中通过exports对象共享求绝对值和计算圆面积的方法,代码如下:
//求绝对值的方法abs
exports.abs = function (number) {
if (0 < number) {
return number;
} else {
return -number;
}
};
//求圆面积的方法circleArea
exports.circleArea = function (radius) {
return radius * radius * Math.PI;
};
(2)在WebStorm中创建一个main.js文件,用来调用前面创建的模块来计算指定值的绝对值及指定半径的圆面积,代码如下:
//加载module.js模块文件
var module = require('./module.js');
//使用模块方法
console.log('abs(-273) = %d', module.abs(-273));
console.log('circleArea(3) = %d', module.circleArea(3));
说明
上面代码中,通过使用require()导入了创建的module.js模块文件。
运行main.js文件,结果如下:
abs(-273) = 273
circleArea(3) = 28.274333882308138
在Node.js中,除了使用exports对象进行模块化编程,还可以使用module对象进行模块化编程。module对象的常用属性如下表所示:
使用module对象实现模块化编程,步骤如下:
(1)在WebStorm中创建一个module.js文件,其中定义一个输出方法,然后通过module对象的exports属性指定对外接口,代码如下:
function Hello() {
var name;
this.setName = function (thyName) {
name = thyName;
};
this.sayHello = function () {
console.log(name + ',你好');
};
};
module.exports = Hello;
(2)在WebStorm中创建一个main.js文件,用来调用创建的模块以输出内容,代码如下:
var Hello = require('./module.js');
hello = new Hello();
hello.setName('2023');
hello.sayHello();
运行main.js文件,结果如下:
2023,你好
注意
与使用exports对象相比,唯一的变化是使用module.exports = Hello代替了exports。在外部引用该模块时,其接口对象就是要输出的Hello对象本身,而不是原先的exports。