You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js v20中如何创建全局作用域变量或模块?

在Node.js 20中创建全局作用域变量的方法

首先要明确:Node.js的每个模块(不管是CommonJS还是ES模块)都有独立的模块作用域,直接在模块内部赋值global或globalThis后其他模块无法访问,通常是因为模块加载顺序问题,或是对模块作用域的误解。

以下是几种可行的实现方式:

1. 利用globalThis在入口模块挂载全局变量

在项目的入口文件(比如index.js)中,先通过globalThis挂载变量,再加载其他需要访问该全局变量的模块:

// index.js(入口文件)
globalThis.appConfig = {
  apiUrl: "https://example.com/api",
  timeout: 5000
};

// 之后加载其他模块
const userModule = require('./userModule.js');

在其他模块中直接访问:

// userModule.js
console.log(appConfig.apiUrl); // 输出 "https://example.com/api"

如果是ES模块(使用import/export),同样在入口模块用globalThis挂载,其他ES模块直接访问即可:

// main.mjs(ES模块入口)
globalThis.appConfig = { apiUrl: "https://example.com/api" };

import './userModule.mjs';
// userModule.mjs
console.log(globalThis.appConfig.apiUrl); // 输出对应值

2. 用共享模块替代全局变量(推荐)

全局变量容易造成作用域污染,更推荐创建一个专门的共享模块,通过导出/导入的方式实现变量共享:

// sharedConfig.js
const config = {
  apiUrl: "https://example.com/api",
  timeout: 5000
};

module.exports = config;

在其他模块中引入使用:

// userModule.js
const config = require('./sharedConfig.js');
console.log(config.apiUrl);

如果是ES模块:

// sharedConfig.mjs
export const config = {
  apiUrl: "https://example.com/api",
  timeout: 5000
};
// userModule.mjs
import { config } from './sharedConfig.mjs';
console.log(config.apiUrl);

为什么你之前用globalThis不生效?

  • 如果是在子模块中先赋值globalThis,但入口模块还没加载该子模块就尝试访问变量,会导致变量未定义;
  • ES模块的顶层this是undefined,必须直接使用globalThis而非this来挂载变量;
  • 若在模块内部用let/const声明变量后再赋值给globalThis,要确保变量挂载完成后其他模块才会访问。

内容的提问来源于stack exchange,提问作者Harsh Hingu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:12:35