Skip to content

全局变量

如何在 nodejs 定义全局变量

在 Node.js 中,可以通过 global 对象定义全局变量。定义的全局变量可以在所有引入的文件中访问到。为了确保代码执行顺序正确,并提高跨环境兼容性,可以使用 globalThis。

global

a.js

js
global.name = 'zhangsan';
require('./b');

b.js

js
console.log(global.name); //zhangsan

a.js 中定义了一个全局变量 name,并在引入 b.js 文件时能够访问该变量。

globalThis

a.js

js
globalThis.name = 'zhangsan'; // 使用 globalThis 定义全局变量
require('./b');

b.js

js
console.log(globalThis.name); // 输出: zhangsan

注意事项

  1. 代码执行顺序:确保在引用其他模块之前定义全局变量。例如,在 a.js 中定义 name 变量后才引入 b.js。
  2. 全局变量的作用域:通过 global 定义的变量在整个应用程序中都是全局可访问的,因此应谨慎使用,以避免命名冲突和不必要的复杂性。
  3. 跨环境兼容性:为了在浏览器和 Node.js 环境中都能方便地访问全局对象,ECMAScript 2020 引入了 globalThis。无论是在浏览器还是 Node.js 环境中,globalThis 都能自动指向正确的全局对象。
    • Node.js 环境:globalThis 指向 global。
    • 浏览器环境:globalThis 指向 window。

关于其他全局 API

由于 nodejs 中没有 DOM 和 BOM,除了这些 API,其他的 ECMAscriptAPI 基本都能用

这些 API 都是可以正常用的

js
setTimeout setInterval Promise Math  console  Date fetch(node v18) 等...

nodejs 内置全局 API

注意

__dirname __filename 只能在 cjs 使用 esm 规范没有这两个全局变量

要想在 esm 中使用,可以用以下方式

js
import.meta.url; // 模块的绝对 file: URL
import { fileURLToPath } from 'node:url';
import { dirname } from 'node:path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

// 在node 20.11.0后加入了以下变量,可以直接获取
const __filename = import.meta.filename;
const __dirname = import.meta.dirname;
js
__dirname;

它表示当前模块的所在目录的绝对路径

js
__filename;

它表示当前模块文件的绝对路径,包括文件名和文件扩展名

js
process;
  1. process.argv: 这是一个包含命令行参数的数组。第一个元素是 Node.js 的执行路径,第二个元素是当前执行的 JavaScript 文件的路径,之后的元素是传递给脚本的命令行参数。
  2. process.env: 这是一个包含当前环境变量的对象。您可以通过process.env访问并操作环境变量。
  3. process.cwd(): 这个方法返回当前工作目录的路径。
  4. process.on(event, listener): 用于注册事件监听器。您可以使用process.on监听诸如exituncaughtException等事件,并在事件发生时执行相应的回调函数。
  5. process.exit([code]): 用于退出当前的 Node.js 进程。您可以提供一个可选的退出码作为参数。
  6. process.pid: 这个属性返回当前进程的 PID(进程 ID)。

这些只是process对象的一些常用属性和方法,还有其他许多属性和方法可用于监控进程、设置信号处理、发送 IPC 消息等。

需要注意的是,process对象是一个全局对象,可以在任何模块中直接访问,无需导入或定义。

js
Buffer;
  1. 创建  Buffer  实例:

    • Buffer.alloc(size[, fill[, encoding]]): 创建一个指定大小的新的 Buffer 实例,初始内容为零。fill 参数可用于填充缓冲区,encoding 参数指定填充的字符编码。
    • Buffer.from(array): 创建一个包含给定数组的 Buffer 实例。
    • Buffer.from(string[, encoding]): 创建一个包含给定字符串的 Buffer 实例。
  2. 读取和写入数据:

    • buffer[index]: 通过索引读取或写入 Buffer 实例中的特定字节。
    • buffer.length: 获取 Buffer 实例的字节长度。
    • buffer.toString([encoding[, start[, end]]]): 将 Buffer 实例转换为字符串。
  3. 转换数据:

    • buffer.toJSON(): 将 Buffer 实例转换为 JSON 对象。
    • buffer.slice([start[, end]]): 返回一个新的 Buffer 实例,其中包含原始 Buffer 实例的部分内容。
  4. 其他方法:

    • Buffer.isBuffer(obj): 检查一个对象是否是 Buffer 实例。
    • Buffer.concat(list[, totalLength]): 将一组 Buffer 实例或字节数组连接起来形成一个新的 Buffer 实例。

从 Node.js 6.0 版本开始,Buffer 构造函数的使用已被弃用,推荐使用 Buffer.alloc()Buffer.from()等方法来创建 Buffer 实例。

Buffer 类在处理文件、网络通信、加密和解密等操作中非常有用,尤其是在需要处理二进制数据时

Keep Reading, Keep Writing, Keep Coding