2013-02-11 70 views
1

当写在CoffeeScript的AMD模块,因为一切都被包裹在一个功能,每一个文件最终看起来像这样:在coffeescript AMD模块没有缩进整个文件?

define 'myModule', ['dep1', 'dep2'], (dep1, dep2) -> 
    funcA: -> 
    funcB: -> 
    # etc... 
    funcZ: -> 

我想,以尽量减少我的代码缩进,使之更容易理解,而且我不喜欢AMD如何在几乎所有方面增加缩进水平。有没有办法避免它?

回答

2

不幸的是,现在不行。但是一个功能提案可以完全解决这种用例(以及其他问题,特别是关于异步回调代码和一般回调函数)is being actively discussed in the CoffeeScript Issues。所提出的功能被称为“backcalls”,它基本上是一种语法转换,使得这种回调嵌套代码看起来更加顺序。你的模块定义会是什么样子:

(dep1, dep2) <- define 'myModule', ['dep1', 'dep2'] 

funcA: -> 
funcB: -> 
# etc... 
funcZ: -> 

如果你想要的东西的工作现在,有一两件事你可以做的是一个预处理步骤添加到您的构建配置,以便define ...线和压痕在进入CoffeeScript编译器之前被添加。

您可以与.coffee源上的一些特殊的注释声明你的模块:

#!module=myModule 
#!dependencies=dep1,dep2 

funcA: -> 
funcB: -> 
# etc... 
funcZ: -> 

,然后有一个脚本,将阅读这些评论并产生define 'myModule', ['dep1', 'dep2'], (dep1, dep2) ->行和缩进一个级别添加到每一行在输入文件中。

所以您构建步骤看起来是这样的:

cat myModule.coffee | add-amd | coffee -sc > myModule.js 
+1

的backcall语法看起来很有趣。我认为,如果我要添加一个预处理步骤,它将成为AMD转换器的常见选择。 – gregsabo 2013-02-13 02:00:57

+0

@gregsabo这是一个很好的选择。更好的是:看起来[RequireJS提供了一个工具](http://requirejs.org/docs/commonjs.html)就是这么做的。看起来'r.js'工具虽然是JS代码转换器,但它必须是CoffeeScript编译器之后的后处理器。祝你好运:) – epidemian 2013-02-13 02:46:09