模块的节点模块有多个呼叫方向

时间:2014-07-16 16:24:48

标签: javascript node.js requirejs node-webkit node-modules

好吧,实际的最终原因是要有一个文件夹,模块(在这种情况下,功能)。 Folder结构应该是这样的:

  • /app.js
  • / node_modules /
    • /mainfunction.js
    • /功能/
      • /func1.js
      • /func2.js
      • /func3.js
      • /func4.js
      • / ...

mainfunction.js:

exports.func1 = require("./functions/func1");
exports.func2 = require("./functions/func2");
exports.func3 = require("./functions/func3");
exports.func4 = require("./functions/func4");

所以,从app.js或app的任何其他部分我可以使用这些函数来实现这样的mainfunction.js:

var f = require("mainfunction"); //And also require the others cores module 'path, fs,..."
//then you can call the module directly.
f.func1(input)
//Or store it in a variable
var area = (new) f.func3(width)  //sometimes **new** is needed when there is no input.

此信息可在Node.js API中找到。

问题现在就开始了。

有些模块要求其他人工作,有许多关系,例如:

  1. Func2需要Func1响应
  2. Func3需要Func2响应并且需要它的一部分Func1(所以Func1需要两次)
  3. Func4需要核心模块(fs,path,...)和其他功能。
  4. 我是否必须重新声明每个功能(独立模块)需要的所有变量?

    示例Func5.js:

    var answer;
    var func2 = require("./func2");            //redeclare modules needed
    var fs = require("fs");                    //redeclare core modules needed
    
    module.exports = function(input) {         //do some stuff
        fs.exist("x.html", function (exist) {
            if(exist){
                answer = func2(input);
            }
         }
         return answer;
    }
    

    我不想重新声明必要的模块我只想使用“f.funcX(输入)”在任何范围内使用函数,甚至在模块内部。这可能吗?

    任何建议都很受欢迎。感谢。

    另一个假设的选项(编辑)

    好的,模块自成功赢了,但是这个怎么样? (我甚至不知道这是否有效。)

    相同的文件夹和文件结构。但是mainfunction.js有:

    module.exports = {
        require("./functions/func1"),
        require("./functions/func2"),
        require("./functions/func3"),
        require("./functions/func4"),
        ...
    }
    

    每个Function文件都有相同但没有重新声明的模块,而是使用“exports.functX”,并调用其他模块,使用该函数的名称(模块)。

    这可能不起作用,这只是一个想法。

1 个答案:

答案 0 :(得分:2)

  

Func3需要Func2响应并且需要它的一部分Func1(所以Func1需要两次)

事实证明,在这种情况下,Node的模块加载系统需要两次Func1。该过程将cache Func1的导出,当需要第二次时,只返回Func1的原始瞬时。

  

我是否必须重新声明每个功能(独立模块)需要的所有变量?

你没必要,但这通常是一个好主意。这绝不是一件坏事,因为事实上,每个模块彼此独立;如果每个模块都做了不同的事情,那么无论如何都要在项目的每个模块中都有所有功能。

然而,通用装载在技术上是可行的。一种可能的配置是将每个模块加载到全局命名空间(process),但用Douglas Crockford的话说,“全局是邪恶的”。该模块将在Node过程中的任何位置可用,即使在与您无关的模块中也是如此。实质上,您在任何地方看到的require模式实际上是在节点中加载依赖项的最佳方式。

  

好的,模块自成功赢了,但是这个怎么样? (我甚至不知道这是否有效)。 [...]

我认为你的意思是这个?

module.exports = {
    func1: require("./functions/func1"),
    func2: require("./functions/func2"),
    func3: require("./functions/func3"),
    func4: require("./functions/func4"),
    ...
}

如果你有一个模块有很多独立的子模块可以暴露到任何需要的模式,这通常是一个很好的模式;但是,不可能使用这样的模式来允许项目级命名空间,因为Func1需要mainfunction.js需要Func1,依此类推。 (这称为循环依赖。)

简而言之,不要担心在需要模块时会重复。最后,标准模式不重复,因为每个模块具有不同的要求和依赖关系,也不会让模块运行多次,如上所述。

祝你的Node.js努力!