当我创建一个新的coffeescript文件时,我无法从另一个文件中访问已编译代码中的代码,因为它包含在某个函数范围内。例如:
CoffeeScript的:
class ChatService
constructor: (@io) ->
生成的Javascript:
(function() {
var ChatService;
ChatService = (function() {
function ChatService(io) {
this.io = io;
}
return ChatService;
})();
}).call(this);
尝试在另一个文件中调用ChatService
时,未定义。如何使用coffeescript处理多个文件?
答案 0 :(得分:56)
根据这是客户端代码还是服务器端代码,有两种略有不同的方法。
客户端:在这里,我们将跨文件可用的内容附加到全局命名空间(window
),如下所示:
class window.ChatService
constructor: (@io) ->
然后,在另一个文件中,ChatService
和window.ChatService
都允许访问该类。
服务器端:我们必须使用exports
和require
。在ChatService.coffee
文件中,您将拥有以下内容:
class exports.ChatService
constructor: (@io) ->
然后,要从另一个文件中获取它,您可以使用:
ChatService = require('ChatService.coffee').ChatService
注意:如果您从ChatService.coffee获得多个类,那么这是CoffeeScript的dict解包真正发光的地方,例如:
{ChatService, OtherService} = require('ChatService.coffee')
两者:基本上,我们根据我们所处的环境选择是运行服务器端代码还是客户端代码。这是一种常见的方法:
class ChatService
constructor: (@io) ->
if typeof module != "undefined" && module.exports
#On a server
exports.ChatService = ChatService
else
#On a client
window.ChatService = ChatService
获得它:
if typeof module != "undefined" && module.exports
#On a server
ChatService = require("ChatService.coffee").ChatService
else
#On a client
ChatService = window.ChatService
可以跳过第二个块的else子句,因为ChatService
已经引用了附加到window
的引用。
如果你要在这个文件中定义很多类,可能更容易定义它们:
self = {}
class self.ChatService
然后将module.exports = self
添加到服务器上,将_.extend(window, self)
添加到客户端上(根据需要将_.extend
替换为另一个extend
函数。)
答案 1 :(得分:23)
通常的方法是在window
中定义全局命名空间:
window.App = { }
在其他任何事情发生之前,这将在应用程序的初始化代码中的某处。然后,为你的班级:
class App.ChatService
constructor: (@io) ->
这允许您通过App
在任何地方引用您的课程,而您不必担心污染全局命名空间:
chatter = new App.ChatService
如果你想让你的ChatService
真正全球化,那么你可以使用class window.ChatService
但我建议不要使用它,除非在最简单的应用程序中。
AFAIK,node.js与window
类似,但我对node.js不太熟悉,告诉你它是什么。
答案 2 :(得分:0)
将您的类与命名空间分开,并使用cake将它们全部编译在一个(或多个)生成的.js文件中。 Cakefile用作控制咖啡脚本编译顺序的配置 - 对于更大的项目非常方便。
Cake非常容易安装和设置,在您编辑项目时从vim调用cake就是
:!cake build
您可以刷新浏览器并查看结果。
由于我也忙着学习构建文件的最佳方法,并将coffeescript与backbone和cake结合使用,我创建了一个small project on github来保留它作为我自己的参考,也许它会有所帮助你也围着蛋糕和一些基本的东西。所有编译的文件都在 www 文件夹中,以便您可以在浏览器中打开它们,所有源文件(蛋糕配置除外)都在 src 文件夹中。在此示例中,所有.coffee文件都在一个输出.js文件中进行编译和组合,然后将其包含在html中。