使用coffeescript进行多文件通信

Multiple Files communication with coffeescript

本文关键字:文件 通信 coffeescript 使用      更新时间:2023-09-26

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

CoffeeScript:

class ChatService
  constructor: (@io) ->

生成的Javascript:

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

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

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

客户端:在这里,我们将跨文件可用的东西附加到全局命名空间(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)。

通常的方法是在window:中定义一个全局命名空间

window.App = { }

在发生任何其他事情之前,这将出现在应用程序的初始化代码中。然后,对于你的班级:

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

这允许您通过App在任何您想要的地方引用您的类,并且您不必担心污染全局名称空间:

chatter = new App.ChatService

如果你想让ChatService真正具有全局性,那么你可以使用class window.ChatService,但我建议你不要这样做,除非是在最琐碎的应用程序中。

AFAIK,node.js有一些类似于window的东西,但我对node.js不够熟悉,无法告诉你它是什么

用名称空间分离类,并使用cake将它们全部编译在一个(或多个)生成的.js文件中。Cakefile被用作配置,用于控制咖啡脚本的编译顺序——对于更大的项目来说非常方便。

Cake很容易安装和设置,在编辑项目时从vim调用Cake就是

:!cake build

您可以刷新浏览器并查看结果。

由于我也忙于学习构建文件的最佳方法,并将coffeescript与主干网和蛋糕结合使用,我在github上创建了一个小项目,将其作为自己的参考,也许它也会对蛋糕和一些基本的东西有所帮助。所有编译的文件都在www文件夹中,这样您就可以在浏览器中打开它们,所有源文件(蛋糕配置除外)都在
src
中。在本例中,所有.coffee文件都被编译并组合在一个输出.js文件中,该文件随后包含在html中。