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

如何规避NodeJS中main与utils文件间的循环依赖问题

解决Node.js循环依赖问题

当前代码出现循环依赖警告且test()返回undefined的核心原因是:Node.js的require是同步加载机制,当main.js加载utils.js时,utils.js立即尝试导入main.js的user实例,但此时main.js还未执行到module.exports = { user }这一步,导致utils.js拿到的user是undefined。

以下是几种可行的解决方法:

方案1:将user实例作为参数传递给test函数

彻底消除循环依赖,让utils.js不再依赖main.js,而是在调用test时直接传入所需的user实例。

修改后的代码:

main.js

const { test } = require("./utils");

class User {
  constructor(name) {
    this.name = name;
  }
}

const user = new User({
  name: "Oscar",
});

console.log("Your name is: %s!", user.name);

test(user); // 直接传入user实例

module.exports = {
  user,
};

utils.js

// 移除对main.js的导入
const test = (user) => {
  console.log("Hello there %s!", user.name);
};

module.exports = {
  test,
};

方案2:重构模块,拆分独立的User模块

把User类单独抽离到一个独立文件,让main.js和utils.js都从这个文件导入,避免互相依赖。

user.js

class User {
  constructor(name) {
    this.name = name;
  }
}

module.exports = User;

main.js

const { test } = require("./utils");
const User = require("./user");

const user = new User({
  name: "Oscar",
});

console.log("Your name is: %s!", user.name);

test(user); // 依然通过参数传递user实例

module.exports = {
  user,
};

utils.js

const User = require("./user");

// 保持test函数的参数传递方式,确保灵活性
const test = (user) => {
  console.log("Hello there %s!", user.name);
};

module.exports = {
  test,
};

如果业务中user是全局单例,也可以在user.js中直接初始化实例并导出,让main.js和utils.js直接导入这个单例,避免参数传递。

方案3:延迟导入(仅适合特殊场景)

如果必须保留当前模块结构,可以在utils.js的函数内部延迟导入main.js,等到函数执行时,main.js已经完成导出。

utils.js

const test = () => {
  // 延迟到函数执行时才导入,此时main.js已完成导出
  const { user } = require("./main");
  console.log("Hello there %s!", user.name);
};

module.exports = {
  test,
};

这种方法虽然能解决问题,但会让模块依赖关系变得不清晰,增加后期维护成本,不推荐作为常规解决方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 08:10:28