我最近开始研究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
那样工作,但是可以使用函数吗?或者任何其他处理方法?
答案 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