NodeJS:保持库文件干燥

我最近开始在CoffeeScript中开发一个不平凡的项目,我正在努力处理注册输出等问题。我正在以非常“pythonesque”的方式编写它,个人文件有效地被称为“模块”相关的类和function。 我正在寻找的是在本地和在exports / window中尽可能less地重复定义类和函数的最佳方式。

目前,我在每个文件中使用以下内容,以节省写入exports.X = X文件中的所有内容:

 class module # All classes/functions to be included in exports should be defined with `@` # Eg class @DatClass exports[name] = item for own name, item of module 

我也研究过使用一个函数(比如publish ),根据名称将传入的类放在exports / window中的可能性:

 publish = (f) -> throw new Error 'publish only works with named functions' unless f.name? ((exports ? window).namespace ?= {})[f.name] = f publish class A # A is now available in the local scope and in `exports.namespace` # or `window.namespace` 

然而,这并不适用于函数,据我所知,它们不能在CoffeeScript中被命名(例如, f.name总是'' ),所以publish不能确定正确的名称。

有什么办法像publish一样工作,但与function? 或者处理这个问题的其他方法?

这是一个丑陋的黑客,但你可以使用以下内容:

 class module.exports class @foo @bar = 3 

接着 :

 require(...).foo.bar // 3 

老人

 (function (exports) { // my code exports.someLib = ... })(typeof exports === "undefined" ? window : exports); 

是一个干净的伎俩,应该做你想做的。

如果编写包装器样板是一个痛苦,然后使用构build脚本自动化它。

我正在寻找的是在本地和exports / window中尽可能less地重复定义类和函数的最佳方式。

做这样的事情是不可能的

 exports.x = var x = ...; 

没有用JavaScript写两次(不用黑魔法,即eval ),CoffeeScript也一样。 Bummer,我知道,但事实就是如此。

我的build议是不要太挂在上面; 这种重复是常见的。 但是请问自己:“我真的需要导出这个函数或variables, 使其在本地可用吗?” 干净的解耦代码通常不会这样工作。

“no named functions”规则有个例外:classes。 这工作: http : //jsfiddle.net/PxBgn/

 exported = (clas) -> console.log clas.name window[clas.name] = clas ... exported class Snake extends Animal move: -> alert "Slithering..." super 5