处理Node JS中的循环导入

时间:2018-04-20 13:53:48

标签: javascript node.js

// x.js

const {function1}=require('./y');    
const function2=()=>{
 console.log('from function 2 ');
 function1()
}
function2();

module.exports={function2}

// y.js

const {function2}=require('./x');


const function1=()=>{
 console.log('hello from function1');
 function2();
}

module.exports={function1};

当我运行x.js文件时,y.js中的function2不会执行,并且抛出一个类型错误,表示function2不是函数。

node testing/x.js 
from function 2 
hello from function1
/media/xyz/9A2A71AB2A718553/abc/ghf/testing/y.js:6
 function2();
 ^

TypeError: function2 is not a function
   at function1 (/media/xyz/9A2A71AB2A718553/abc/ghf/testing/y.js:6:3)
   at function2 (/media/xyz/9A2A71AB2A718553/abc/ghf/testing/x.js:5:3)
   at Object.<anonymous> (/media/xyz/9A2A71AB2A718553/abc/ghf/testing/x.js:7:1)
   at Module._compile (module.js:649:30)
   at Object.Module._extensions..js (module.js:660:10)
   at Module.load (module.js:561:32)
   at tryModuleLoad (module.js:501:12)
   at Function.Module._load (module.js:493:3)
   at Function.Module.runMain (module.js:690:10)
   at startup (bootstrap_node.js:194:16)

1 个答案:

答案 0 :(得分:2)

我不确定您对模块有多了解,但您可能会发现this answer of mine on SoftwareEngineering.SE helpful。当您在require('./x')y.js时,您会从exports模块中获取正在进行的,部分构建的 x对象。在x需要y时,x尚未向其导出对象添加function2,并且在调用{{1}之前不会这样做完成后,它可以执行require('./y')中的最后一行。

换句话说,重复调用x.js不会重新运行模块require('foo')中的代码。相反,它们会生成已为foo创建的唯一module.exports。即使foo尚未运行完成,模块也会在第一次foo d时创建一个不完整的module.exports对象。

这里的技巧不是覆盖require对象,而只是添加方法。

x.js

module.exports

y.js

const {function1}=require('./y');    
const function2=()=>{
 console.log('from function 2 ');
 function1()
}

module.exports.function2 = function2;

function2();

通过在const xModule = require('./x'); const function1=()=>{ console.log('hello from function1'); xModule.function2(); } module.exports={function1}; 中执行xModule = require('./x')xModule.function2(),我们允许y.js等到function1模块已定义x并添加它到function2对象。

我们还必须将module.exports内的function2()调用移至x.js创建的下方,因为拨打module.exports.function2会调用{{1} }},期望function2模块已在function1上使用x方法。