Node.js的全局对象
Node.js的全局对象概览
Node.js运行时环境中存在一些无需require即可直接使用的全局对象。这些对象在不同模块间共享,提供基础API功能。与浏览器中的window类似,但Node.js的全局对象专为服务端环境设计。
global对象
global是Node.js中最顶层的全局对象,所有全局变量(除了module本身)都是global对象的属性。在REPL环境直接输入global可查看所有属性:
console.log(global.process === process); // true
console.log(global.setTimeout === setTimeout); // true
需要注意的几点特性:
- 使用var定义的变量不会添加到global对象
- 使用let/const定义的变量不会出现在global对象
- 直接赋值未声明的变量会成为global的属性
var foo = 'var';
let bar = 'let';
baz = 'global';
console.log(global.foo); // undefined
console.log(global.bar); // undefined
console.log(global.baz); // 'global'
process对象
process对象提供与当前Node.js进程互动的接口,常用功能包括:
环境变量操作
// 获取环境变量
console.log(process.env.PATH);
// 设置环境变量
process.env.NODE_ENV = 'production';
进程控制
// 退出进程
process.exit(1);
// 监听退出事件
process.on('exit', (code) => {
console.log(`退出码: ${code}`);
});
标准输入输出
process.stdin.on('data', (data) => {
process.stdout.write(`接收到: ${data}`);
});
性能分析
// 内存使用情况
console.log(process.memoryUsage());
// CPU使用情况
console.log(process.cpuUsage());
console对象
Node.js的console与浏览器类似但有些扩展:
格式化输出
console.log('计数: %d', 10);
console.log('对象: %j', {key: 'value'});
计时功能
console.time('loop');
for(let i=0; i<1000000; i++){}
console.timeEnd('loop'); // loop: 2.123ms
堆栈跟踪
console.trace('当前位置');
定时器相关
Node.js提供了四类定时器函数:
// 一次性定时器
const timeout = setTimeout(() => {
console.log('1秒后执行');
}, 1000);
// 周期性定时器
const interval = setInterval(() => {
console.log('每秒执行');
}, 1000);
// 立即执行
const immediate = setImmediate(() => {
console.log('下一个事件循环执行');
});
// 清理定时器
clearTimeout(timeout);
clearInterval(interval);
clearImmediate(immediate);
Buffer类
Buffer是处理二进制数据的全局类:
// 创建Buffer
const buf1 = Buffer.alloc(10); // 初始化10字节
const buf2 = Buffer.from('hello');
// 写入数据
buf1.write('Node.js');
// 读取数据
console.log(buf2.toString('utf8', 0, 2)); // 'he'
// 转换格式
const buf3 = Buffer.from('74657374', 'hex');
console.log(buf3.toString()); // 'test'
__filename与__dirname
这两个变量提供当前模块的文件路径信息:
console.log(__filename); // 当前文件绝对路径
console.log(__dirname); // 当前目录绝对路径
// 路径拼接示例
const path = require('path');
const fullPath = path.join(__dirname, 'config.json');
module、exports与require
虽然看起来像全局变量,实际是每个模块的局部变量:
// module.exports的两种写法
module.exports = { key: 'value' };
exports.key = 'value';
// require的使用
const fs = require('fs');
const myModule = require('./my-module');
其他重要全局对象
URL类
const myURL = new URL('https://example.com/path?query=123');
console.log(myURL.searchParams.get('query')); // '123'
TextEncoder/TextDecoder
const encoder = new TextEncoder();
const decoder = new TextDecoder();
const uint8Array = encoder.encode('你好');
console.log(decoder.decode(uint8Array)); // '你好'
performance
const { performance } = require('perf_hooks');
performance.mark('start');
// 执行某些操作
performance.mark('end');
performance.measure('耗时', 'start', 'end');
console.log(performance.getEntriesByName('耗时'));
全局对象与模块系统
Node.js的模块系统会影响全局变量的可见性:
- 每个模块有自己的作用域,var定义的变量不会污染global
- 通过require加载的模块会缓存到require.cache对象
- 可通过globalThis访问真正的全局对象(ES2020标准)
// 跨模块共享数据
global.sharedData = { count: 0 };
// 检查模块缓存
console.log(require.cache);
本站部分内容来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn
下一篇:Node.js的REPL环境