自动方式导出每个function作为主要的方法

我只是创build一个包含许多函数的单个文件的节点模块,例如:

function alpha () { return 'alpha' } function beta () { return 'beta' } function main () { return alpha() + beta() + 'gamma' } module.exports = main 

这个问题是,我真正想要的是所有声明的函数(其他main )是main方法,如main.alpha (注意在这种情况下main不会是一个对象与原型)。 我想所有这些函数作为方法,所以我仍然可以导出一个functionmain并能够使用这个模块之外的main.alpha()

有了这个说我坚持与模块中的function,我创作他们的方式。 我可以进入并更改每个函数声明( function (.+) \(main.$1 = function (用我的文本编辑器(primefaces的)查找和replace正则expression式函数。

我创build的模块中有20个function,编辑所有的代码非常繁琐和复杂。 另一个问题是,每个函数的名字变得不那么容易识别,而不是一个很好的getFiles函数,我有一个不必要的long main.getFiles函数。

我期望的结果是这个效果(图1):

 function main () { return main.alpha() + main.beta() + 'gamma' } main.alpha = function { return 'alpha' } main.beta = function () { return 'beta' } module.exports = main 

或这(图2)

 function alpha () { return 'alpha' } function beta () { return 'beta' } function main () { return alpha() + beta() + 'gamma' } main.alpha = alpha main.beta = beta module.exports = main 

我的问题是: 有没有办法创build一个CommonJS模块,我可以像我一样声明函数(如上),并轻松地添加模块中的所有声明的函数作为main方法?

我唯一的select似乎是:

  1. 通过模块中的每个函数,并replace像这个function (.+) \(函数装饰function (.+) \(像这个main.$1 = function (一样) main.$1 = function (然后检查函数的每个用法并将其replace为主要方法(图1)
  2. 在主文件和所有函数声明的文件末尾,添加与main函数相同的方法。 (例如main.getFiles = getFiles )(图2)

更新1

其中一种方法是在模块开始处和结束处获取globalvariables,然后diff它们以获取在模块中创build的variables,然后创build一个string映射,我可以将其粘贴到模块的末尾,将所有方法分配给主函数。 可悲的是,主要的新函数声明并没有被global 。 你可以在这里看到undefined global['main']日志。

 function main () { } console.log(global['main']) // => undefined 

更新2

我也喜欢这样的解决scheme,这将允许我添加一个variables定义到一个命名函数。 我想能够在内部调用它作为命名函数,它会导出为主要的方法。 这虽然不起作用。

 function main () { return alpha() + beta() + 'gamma' } main.alpha = function alpha () { return 'alpha' } main.beta = function beta () { return 'beta' } module.exports = main 

更新3

这工作!

 function main () { return alpha() + beta() + 'gamma' } var alpha = main.alpha = function () { return 'alpha' } var beta = main.beta = function () { return 'beta' } module.exports = main 

不。代码就是这样。 Javascript只做你告诉它做的事情。 如果你不声明一个函数是main一个属性,那么它将不是main一个属性。

你可以开发自己的文本预处理器,将所有顶级函数改为main属性 – 基本上只是改变源代码来声明它。 有几种不同的方法可以用来识别正确的函数 – 从前面一行的结构化注释到实际检测哪个函数声明处于顶层的代码。

不幸的是,Javascript并没有提供任何方式来迭代在范围内声明的所有项目。 为了能够迭代它们,它们必须是对象的属性,而不仅仅是范围内的声明。 所以,Javascript没有提供任何方式来迭代模块中的所有顶层函数(记住模块中的顶层实际上不是全局层次,而是在模块函数范围内)。 这意味着你不能迭代在你自己的Javascript范围内定义的函数来改变你自己的JS。


你并没有真正解释为什么只要声明这些函数是你想要的适当的属性就是这样一个负担。

如果你想要一行代码,这两行代码都将使你的函数成为main属性,并定义一个可以使用的本地符号,你可以这样做:

 var alpha = main.alpha = function() {...};