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