Reputation: 694
I am just getting use to CoffeeScript and I have gotten stuck with classes. I want to have my files structured like in node so that I can require a JavaScript file containing a class like this.
Test = require "test.js"
Test.start()
Where start is a method of the Test Class.
Is this possible?
Upvotes: 2
Views: 758
Reputation: 664648
Is this possible?
Not exactly like in Node. There is no synchronous require
in browser environments. Yet, you could try one of the many asynchronous libraries to do that, have a look at AMD. The most famous implementation is require.js.
Upvotes: 4
Reputation: 19219
I've found that the simplest way to use CommonJS modules (the ones that Node.js uses) in browser environments is to use Browserify. I personally also prefer the CommonJS module definitions to the the AMD ones, but that's just personal taste.
Also, take into account that in order to export your classes so that require 'test'
will give you the class constructor directly, you would have to assign your class to module.exports
:
# In test.coffee
module.exports = class Test
@start = -> console.log 'start!'
Then compile that file to test.js
and you're ready to use it:
Test = require './test'
Test.start()
In Node.js this will Just Work. In browsers, you will need to process the files first with Browserify (or some other tool) to get it working (it will create the proper require
function as well as some exports
and module.exports
variables for CommonJS modules to work correctly).
Upvotes: 3
Reputation: 391
Take a look on stitch, hem (which is inspired by stitch, but has more neat features) and browserify.
Personally, I prefer hem. You can do something like this with it:
# app/lib/model.coffee
module.exports = class Model
...
.
# app/lib/util.coffee
helper1 = -> ...
helper2 = -> ...
module.export = {helper1, helper2}
.
# app/index.coffee
Model = require 'lib/model'
{helper1} = require 'lib/util'
# do whatever you want with required stuff
...
Hem takes care of compiling CoffeeScript on the fly and bundling all the needed code together (it also supports npm modules and arbitrary js libs as external dependencies for your code, see the docs for more details).
Upvotes: 2