Depending on whether this is client- or server-side code, there are two slightly different approaches.
Client-side: Here we attach things that should be available across files to the global namespace (window
) as follows:
class window.ChatService
constructor: (@io) ->
Then, in another file both ChatService
and window.ChatService
will allow access to the class.
Server-side: Here we must use exports
and require
. In the ChatService.coffee
file, you would have the following:
class exports.ChatService
constructor: (@io) ->
Then, to get at it from another file you can use:
ChatService = require('ChatService.coffee').ChatService
Note: If there are multiple classes that you are getting from ChatService.coffee, this is one place where CoffeeScript's dict unpacking really shines, such as:
{ChatService, OtherService} = require('ChatService.coffee')
Both: Basically, we choose whether to run server-side or client-side code based on which environment we're in. A common way to do it:
class ChatService
constructor: (@io) ->
if typeof module != "undefined" && module.exports
#On a server
exports.ChatService = ChatService
else
#On a client
window.ChatService = ChatService
To get it:
if typeof module != "undefined" && module.exports
#On a server
ChatService = require("ChatService.coffee").ChatService
else
#On a client
ChatService = window.ChatService
The else clause of the second block can be skipped, since ChatService
already refers to the reference attached to window
.
If you're going to define a lot of classes in this file, it may be easier to define them like:
self = {}
class self.ChatService
And then attach them like module.exports = self
on the server and _.extend(window, self)
on the client (replace _.extend
with another extend
function as appropriate).