Node development for the lazy
If you can describe it in 495 characters, why on earth should it take 879?
Zappa is a CoffeeScript-optimized interface to Express and Socket.IO that makes this:
require('zappa') ->
Gizmo = require './model/gizmo'
@use 'bodyParser', 'methodOverride', @app.router, 'static'
@configure
development: => @use errorHandler: {dumpExceptions: on}
production: => @use 'errorHandler'
@get '/': -> @render 'index'
@get '/gizmos/:id': ->
Gizmo.findById @params.id, (err, gizmo) =>
@render index: {err, gizmo}
@on connection: ->
@emit welcome: {time: new Date()}
@on shout: ->
@broadcast shout: {@id, text: @data.text}
Equivalent to this:
express = require 'express'
app = express.createServer()
io = require('socket.io').listen(app)
Gizmo = require './model/gizmo'
app.use express.bodyParser()
app.use express.methodOverride()
app.use app.router
app.use express.static __dirname + '/public'
app.configure 'development', ->
app.use express.errorHandler dumpExceptions: on
app.configure 'production', ->
app.use express.errorHandler()
app.get '/', (req, res) -> res.render 'index'
app.get '/gizmos/:id', (req, res) ->
Gizmo.findById req.params.id, (err, gizmo) ->
res.render 'index', {err, gizmo}
io.sockets.on 'connection', (socket) ->
socket.emit 'welcome', time: new Date()
socket.on 'shout', (data) ->
socket.broadcast.emit 'shout',
id: socket.id, text: data.text
app.listen 3000
console.log "Express server listening on port %d in %s mode",
app.address().port, app.settings.env
And throws in some additional features while at it:
require('zappa') ->
@enable 'default layout', 'serve jquery',
'serve sammy', 'minify'
@get '/': ->
@render 'index'
@on connection: ->
@emit welcome: {result: sum 1, 2}
@shared '/shared.js': ->
root = window ? global
root.sum = (x, y) -> x + y
@client '/index.js': ->
@connect()
@get '#/route': ->
$('body').append 'client routes!'
@on welcome: ->
$('body').append "welcomed: #{sum @data.result, 2}"
@view index: ->
@title = 'PicoChat!'
@scripts = ['/socket.io/socket.io', '/zappa/jquery',
'/zappa/sammy', '/zappa/zappa', '/shared', '/index']
h1 @title
Learn More
-
Get the gist with the crash course
-
Check the API reference
-
See the examples included with the source
-
Read the annotated source generated by docco
Other resources
-
The source code repository at github
-
Questions, suggestions? Drop us a line on the mailing list
-
Rather do it realtime? Join the IRC channel on freenode: #zappajs
-
Found a bug? Open an issue at github
-
Check the project’s history at the change log
-
Migrating from an earlier version? Read the announcements (0.2.x/0.3.x) for an overview on changes, and follow the TL;DR migration guides (0.2.x/0.3.x)
-
Deploying to heroku? Check this blog post