Home

Awesome

8888888888P        d8888 8888888b.  8888888b.     d8888          @@@    @@@ 
      d88P        d88888 888   Y88b 888   Y88b   d88888        @@@@@@@@@@@@@@
     d88P        d88P888 888    888 888    888  d88P888       @@@@@@@@@@@@@@@@
    d88P        d88P 888 888   d88P 888   d88P d88P 888      @@@@@@@@  @@@@@@@@
   d88P        d88P  888 8888888P"  8888888P" d88P  888      @@@            @@@
  d88P        d88P   888 888        888      d88P   888      @@   @@@@@@@@   @@
 d88P        d8888888888 888        888     d8888888888           @@@@@@@@    
d8888888888 d88P     888 888        888    d88P     888            @@@@@@     

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

Other resources

Thanks loads

To all people behind the excellent libs that made this little project possible, more specifically:

Also:

"Why do you necessarily have to be wrong just because a few million people think you are?" - FZ