阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > Node.js的全局对象

Node.js的全局对象

作者:陈川 阅读数:30010人阅读 分类: 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

需要注意的几点特性:

  1. 使用var定义的变量不会添加到global对象
  2. 使用let/const定义的变量不会出现在global对象
  3. 直接赋值未声明的变量会成为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的模块系统会影响全局变量的可见性:

  1. 每个模块有自己的作用域,var定义的变量不会污染global
  2. 通过require加载的模块会缓存到require.cache对象
  3. 可通过globalThis访问真正的全局对象(ES2020标准)
// 跨模块共享数据
global.sharedData = { count: 0 };

// 检查模块缓存
console.log(require.cache);

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌