使用coffeescript进行多文件通信
Multiple Files communication with 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处理多个文件?
根据这是客户端代码还是服务器端代码,有两种略有不同的方法。
客户端:在这里,我们将跨文件可用的东西附加到全局命名空间(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
)。
通常的方法是在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中。
- 如何播放部分音频文件
- 从桌面读取python文件时高亮显示代码
- 使用JS如何动态更改显示的html文件中的文本背景颜色
- 如何使用WCF服务和javascript表单post上传.doc文件
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 如何在生成下载文件时显示加载动画
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 如何在Famo.us中的两个视图(不同的js文件)之间进行通信
- 谷歌浏览器扩展 - content_scripts与background_page js文件进行通信
- 从 Mozilla 扩展运行二进制文件的推荐方法(使用 std I/O 通信)
- Angularjs控制器与不同文件中的另一个控制器通信
- 使用coffeescript进行多文件通信
- Cordova跨域文件://iframe contentwindow通信
- 从Rails应用程序中的javascript文件与数据库通信
- JSON跨域通信与PHP文件和本地javascript文件
- 通信b/w JavaScript文件通过Post/Dispatch消息在safari扩展像在chrome扩展
- actionscript 3-将二进制文件从javascript通信到flash
- 使用AJAX在两个JavaScript文件之间通信并发送数据
- 我如何与本地可执行文件从nodejs服务器通信
- manifest文件中需要哪些权限才能让applet通过Javascript进行通信