多个文件与coffeescript通信

时间:2012-02-15 03:33:19

标签: javascript coffeescript

当我创建一个新的coffeescript文件时,我无法从另一个文件中访问已编译代码中的代码,因为它包含在某个函数范围内。例如:

CoffeeScript的:

class ChatService
  constructor: (@io) ->

生成的Javascript:

(function() {
  var ChatService;    
  ChatService = (function() {    
    function ChatService(io) {
      this.io = io;
    }    
    return ChatService;    
  })();    
}).call(this);

尝试在另一个文件中调用ChatService时,未定义。如何使用coffeescript处理多个文件?

3 个答案:

答案 0 :(得分:56)

根据这是客户端代码还是服务器端代码,有两种略有不同的方法。

客户端:在这里,我们将跨文件可用的内容附加到全局命名空间(window),如下所示:

class window.ChatService
  constructor: (@io) ->

然后,在另一个文件中,ChatServicewindow.ChatService都允许访问该类。


服务器端:我们必须使用exportsrequire。在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中。