ITADN
mauricemach/zappa · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈
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 开发

如果你能用 495 个字符描述它,为什么它需要 879 个字符?

Zappa 是一个针对 CoffeeScript 优化的 ExpressSocket.IO 接口,它使得:

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}

等价于:

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

并且在此过程中还加入了一些额外的功能:

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

了解更多

其他资源

  • 位于 github 的源码 仓库

  • 有问题或建议?请在 邮件列表 上联系我们

  • 更喜欢实时交流?加入 freenode 上的 IRC 频道:[#zappajs]((irc://irc.freenode.net/zappajs)

  • 发现 bug?在 github 上提交一个 issue

  • 变更日志 中查看项目历史

  • 从早期版本迁移?阅读公告(0.2.x/0.3.x)以了解变更概览,并遵循 TL;DR 迁移指南(0.2.x/0.3.x

  • 部署到 heroku?查看 这篇博客文章

致谢

感谢所有为让这个小项目成为可能而贡献了优秀库的人们,特别是:

  • Jeremy Ashkenas 为 CoffeeScript,这门“小”语言对我来说毫不逊色于革命性。

  • TJ Holowaychuk 为 Express,这个稳健且灵活的基石。

  • Guillermo Rauch 为(在我看来)彻底解决了 comet 问题。

  • Ryan Dahl 为 Node.js,没有它这一切都不可能。

另外:

  • Blake Mizerany 为 Sinatra,这个框架让我重新定义了“简单”。

  • why the lucky stiff,让我重新定义了“黑客”。

  • 最后但同样重要的是 Frank Zappa,他的不循规蹈矩和实验精神激励着我不断前进。更不用说他还提供了背景音乐。

“仅仅因为几百万人认为你是错的,你就一定得错吗?” - FZ