NodeJS:保存库文件DRY

时间:2011-10-30 00:04:51

标签: node.js coffeescript dry

我最近开始研究CoffeeScript中的一个非平凡的项目,我正在努力解决如何最好地处理注册导出等问题。我正在以非常'pythonesque'的方式编写它,有效地将单个文件写入相关类和函数的“模块”。我正在寻找的是在exports / window本地定义类和函数的最佳方法,尽可能少重复。

目前,我在每个文件中都使用以下内容,以便为文件中的所有内容保存exports.X = X的写入内容:

class module
  # All classes/functions to be included in exports should be defined with `@`
  # E.g.
  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那样工作,但是可以使用函数吗?或者任何其他处理方法?

4 个答案:

答案 0 :(得分:2)

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

class module.exports
  class @foo
    @bar = 3

然后:

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

答案 1 :(得分:0)

旧的

(function (exports) {
  // my code

  exports.someLib = ...
})(typeof exports === "undefined" ? window : exports);

是一个巧妙的技巧,应该做你想要的。

如果编写那个包装器样板很痛苦,那么使用构建脚本自动化它。

答案 2 :(得分:0)

  

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

不可能做像

这样的事情
exports.x = var x = ...;

没有在JavaScript中编写x两次(不使用黑色魔法,即eval),CoffeeScript也是如此。我知道,这真是太糟糕了。但事实就是如此。

我的建议是不要太挂机;那种重复很常见。但请问自己:“我是否真的需要导出此函数或变量使其在本地可用?”干净解耦的代码通常不会那样工作。

答案 3 :(得分:0)

“无命名函数”规则有一个例外:类。这有效:http://jsfiddle.net/PxBgn/

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