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处理多个文件?

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

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

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已经引用了附加到窗口的引用。

如果你要在这个文件中定义很多类,可以更容易定义它们,如:

self = {}

class self.ChatService

然后将它们像在服务器上的module.exports = self和在客户端上的_.extend(window,self)附加,(用适当的另一个扩展函数替换_.extend)。

翻译自:https://stackoverflow.com/questions/9287510/multiple-files-communication-with-coffeescript

转载注明原文:javascript – 多文件与coffeescript沟通