2016-09-23 98 views
0

我有一个/libs文件夹多的NodeJS文件,例如:避免的NodeJS模块“需要”复制

math.jsrestapi.jsauth.jspush.js

math.js是提供基本的数学功能和所有类restapi.js,auth.js,push.js需要math.js

的问题是,我在所有其他类这么多require './math.js,例如:

// In auth.js 
    var Auth = new function __Auth(){ 
     function A(){ 
      var math = require "./math.js"; 
      return math.fooA(); 
     } 

     function B(){ 
      var math = require "./math.js"; 
      return math.fooB(); 
     } 
    } 

    exports = module.exports = Auth; 

app.js(主应用程序)

var math= require('./math.js'); 
math.getConfig('config.json'); 

var auth= require('./auth.js'); 
console.log(auth.fooA()); 

app.js,基类math.js绝首先调用getConfig()来从配置文件初始化必要的变量和常量。 (因此,我想只保留math.js的一个实例,因为它是默认的NodeJS行为,所以它可以)。

(注意,这只是一个简化实际代码库的例子)。

我知道NodeJS有一个require缓存机制,但这是否意味着每个函数调用有一个require math.js是唯一的方法?我认为这是非常昂贵和非最佳的。

在其他语言(例如PHP)中,顶部可能有一个require,并且没有require用于每个函数引用同一个类。

任何建议更好& 更高效代码设计?

PS。我刚刚编辑了一些问题来澄清情况。

+0

似乎像循环依赖问题或类似的东西。我们需要看到'math.js'来给出一个很好的答案。 – tcooc

回答

1

auth.js

var math = require ('./math.js'); 

function A(){ 
    return math.fooA(); 
} 

function B(){ 
    return math.fooB(); 
} 

function C(){ 
    return math.fooC(); 
} 
+0

我编辑了问题以正确描述结果。问题在于,在主应用程序中,'math.js'必须调用'getConfig()',并在类的开头按照require math.js''的方法,它会返回一个错误。 – hiro

+0

@hiro我怀疑它只是说“一个错误”。 – str

+0

'var Auth = new function __Auth(){ var math = require('./ math.js'); this.A = function(){return math.fooA();}; //错误,数学未定义 } exports = module.exports = Auth;' – hiro

0

您可以在文件的顶部导入模块。没有必要将它包含在每个函数中。并且不要害怕,这种方法并不代表糟糕的代码风格。 此外,将当前模块使用的文件顶部的所有库导入也是一种很好的做法。

0

在app.js上启动您的数学计算,并要求包含数学参数的auth。

// In auth.js 
function __Auth(math){ 
    function A(){ 
     return math.fooA(); 
    } 

    function B(){ 
     return math.fooB(); 
    } 
} 

exports = module.exports = function (math) { 
    return new __Auth(math); 
}; 

您auth.js将使用例如数学从app.js发起

// In app.js 
var math= require('./math.js'); 
math.getConfig('config.json'); 

var auth= require('./auth.js')(math); 
console.log(auth.fooA()); 

请让我知道,如果它工作或失败。