Skip to content

Latest commit

 

History

History
127 lines (84 loc) · 3.39 KB

index.md

File metadata and controls

127 lines (84 loc) · 3.39 KB
layout title
default
CoffeeScript-optimized interface for building web apps on Node.js with Express and Socket.IO.

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:

{% highlight coffeescript %} require('zappajs') -> 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} {% endhighlight %}

Equivalent to this:

{% highlight coffeescript %} 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 {% endhighlight %}

And throws in some additional features while at it:

{% highlight coffeescript %} require('zappajs') -> @enable 'default layout', '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

{% endhighlight %}

Learn More

Other resources