157
The CoffeeScript Edge Presented by Trevor Burnham at Philly ETE 2012 Wednesday, April 11, 12

The CoffeeScript Edge

Embed Size (px)

DESCRIPTION

CoffeeScript talk given at Philly Emerging Tech for the Enterprise conference (2012) by Trevor Burnham.

Citation preview

Page 1: The CoffeeScript Edge

The CoffeeScript Edge

Presented by Trevor Burnham at Philly ETE 2012

Wednesday, April 11, 12

Page 2: The CoffeeScript Edge

Who Am I?

Wednesday, April 11, 12

Page 3: The CoffeeScript Edge

http://pragprog.com/book/tbcoffee/coffeescriptWednesday, April 11, 12

Page 4: The CoffeeScript Edge

http://pragprog.com/book/tbcoffee/coffeescript

“This book helps readers become better JavaScripters in the process of learning CoffeeScript. What’s more, this book is a blast to read.”—Brendan Eich

Wednesday, April 11, 12

Page 5: The CoffeeScript Edge

The Compleat History of JavaScript

Preface

Wednesday, April 11, 12

Page 6: The CoffeeScript Edge

1995 to 2003: Ancient JavaScript

Wednesday, April 11, 12

Page 7: The CoffeeScript Edge

Paul Graham on JavaScript:

Wednesday, April 11, 12

Page 8: The CoffeeScript Edge

Paul Graham on JavaScript:

“I would not even use Javascript, if I were you... Most of the JavaScript I see on the Web isn’t necessary, and much of it breaks.”

(“The Other Road Ahead,” 2001)

Wednesday, April 11, 12

Page 9: The CoffeeScript Edge

2004-2008: Medieval JavaScript

Wednesday, April 11, 12

Page 10: The CoffeeScript Edge

Ajax!

Wednesday, April 11, 12

Page 11: The CoffeeScript Edge

Crockford!

Wednesday, April 11, 12

Page 12: The CoffeeScript Edge

Solid libraries!

Wednesday, April 11, 12

Page 13: The CoffeeScript Edge

Solid libraries!

...And probably others!

Wednesday, April 11, 12

Page 14: The CoffeeScript Edge

2009-: Modern JavaScript

Wednesday, April 11, 12

Page 15: The CoffeeScript Edge

JavaScript on the Server

Wednesday, April 11, 12

Page 16: The CoffeeScript Edge

JavaScript as anEmbedded Scripting Language

Wednesday, April 11, 12

Page 17: The CoffeeScript Edge

JavaScript is Now FAST!

Wednesday, April 11, 12

Page 18: The CoffeeScript Edge

The New First Language?

http://www.codecademy.com/

Wednesday, April 11, 12

Page 19: The CoffeeScript Edge

Everyone Who Knows JavaScriptFeels Like Superman!

Wednesday, April 11, 12

Page 20: The CoffeeScript Edge

Wednesday, April 11, 12

Page 21: The CoffeeScript Edge

“A Little Language”

Wednesday, April 11, 12

Page 22: The CoffeeScript Edge

Timeline

Wednesday, April 11, 12

Page 23: The CoffeeScript Edge

Timeline

Christmas 2009: First announced on HN

Wednesday, April 11, 12

Page 24: The CoffeeScript Edge

Timeline

Christmas 2009: First announced on HN

Christmas 2010: 1.0 Released

Wednesday, April 11, 12

Page 25: The CoffeeScript Edge

Timeline

Christmas 2009: First announced on HN

Christmas 2010: 1.0 Released

April 13, 2011: Added to Ruby on Rails

Wednesday, April 11, 12

Page 26: The CoffeeScript Edge

https://github.com/rails/rails/commit/9f09aeb8273177fc2d09ebdafcc76ee8eb56fe33

Wednesday, April 11, 12

Page 28: The CoffeeScript Edge

Ward Cunningham

Wednesday, April 11, 12

Page 29: The CoffeeScript Edge

Ward Cunningham

“CoffeeScript and the environment will all the powerful browsers is the closest I felt to the power I had twenty years ago in Smalltalk.”

—Interview with InfoQ, November 2011

Wednesday, April 11, 12

Page 30: The CoffeeScript Edge

Brendan Eich (!)

Wednesday, April 11, 12

Page 31: The CoffeeScript Edge

Brendan Eich (!)

CoffeeScript user

Wednesday, April 11, 12

Page 32: The CoffeeScript Edge

Eich + Ashkenas at JsConf 2011

Wednesday, April 11, 12

Page 33: The CoffeeScript Edge

Who uses it?

https://github.com/jashkenas/coffee-script/wiki/In-The-Wild

Wednesday, April 11, 12

Page 34: The CoffeeScript Edge

Ponder This...

https://github.com/languages/CoffeeScript

Wednesday, April 11, 12

Page 35: The CoffeeScript Edge

CoffeeScript: A Bird’s-Eye View

I

Wednesday, April 11, 12

Page 36: The CoffeeScript Edge

Things CoffeeScript Isn’t:

Wednesday, April 11, 12

Page 37: The CoffeeScript Edge

Things CoffeeScript Isn’t:

Ruby/Python

Wednesday, April 11, 12

Page 38: The CoffeeScript Edge

Things CoffeeScript Isn’t:

Ruby/Python

jQuery

Wednesday, April 11, 12

Page 39: The CoffeeScript Edge

Things CoffeeScript Isn’t:

Ruby/Python

jQuery

GWT

Wednesday, April 11, 12

Page 40: The CoffeeScript Edge

Things CoffeeScript Isn’t:

Ruby/Python

jQuery

GWT

Dart

Wednesday, April 11, 12

Page 41: The CoffeeScript Edge

Things CoffeeScript Isn’t:

Ruby/Python

jQuery

GWT

Dart

alert  'Hello  World!'    #  1  line!!!

Wednesday, April 11, 12

Page 42: The CoffeeScript Edge

“It’s Just JavaScript”

Wednesday, April 11, 12

Page 43: The CoffeeScript Edge

“It’s Just JavaScript”

a  =  b          #  var  a  =  b;

Wednesday, April 11, 12

Page 44: The CoffeeScript Edge

“It’s Just JavaScript”

a  =  b          #  var  a  =  b;

x  is  y        #  x  ===  y;

Wednesday, April 11, 12

Page 45: The CoffeeScript Edge

“It’s Just JavaScript”

a  =  b          #  var  a  =  b;

x  is  y        #  x  ===  y;

f  arg          #  f(arg);

Wednesday, April 11, 12

Page 46: The CoffeeScript Edge

“It’s Just JavaScript”

a  =  b          #  var  a  =  b;

x  is  y        #  x  ===  y;

f  arg          #  f(arg);

f  =  -­‐>  x#  var  f  =  function()  {return  x;};

Wednesday, April 11, 12

Page 47: The CoffeeScript Edge

“It’s Just JavaScript”

a  =  b          #  var  a  =  b;

x  is  y        #  x  ===  y;

f  arg          #  f(arg);

f  =  -­‐>  x#  var  f  =  function()  {return  x;};

No standard library. No additional types.Nothing but sweet, sweet syntax!

Wednesday, April 11, 12

Page 48: The CoffeeScript Edge

Ruby-isms

Wednesday, April 11, 12

Page 49: The CoffeeScript Edge

Ruby-isms

"That  costs  $#{price}"#  "That  costs  $"  +  price

Wednesday, April 11, 12

Page 50: The CoffeeScript Edge

Streamlined Literals (I)

Wednesday, April 11, 12

Page 51: The CoffeeScript Edge

Streamlined Literals (I)

[    "Commas?"    "We"    "don't"    "need"    "no"    "stinking"    "commmas!"]

Wednesday, April 11, 12

Page 52: The CoffeeScript Edge

Streamlined Literals (II)

Wednesday, April 11, 12

Page 53: The CoffeeScript Edge

Streamlined Literals (II)

outer:    inner:        "You  got  YAML  in  my  JSON!"

{outer:    {inner:        "You  got  YAML  in  my  JSON!"    }}

Wednesday, April 11, 12

Page 54: The CoffeeScript Edge

{key: key} Shorthand andDestructuring Assignment

Wednesday, April 11, 12

Page 55: The CoffeeScript Edge

{key: key} Shorthand andDestructuring Assignment

obj  =  {x}    #  obj  =  {x:  x};

Wednesday, April 11, 12

Page 56: The CoffeeScript Edge

{key: key} Shorthand andDestructuring Assignment

obj  =  {x}    #  obj  =  {x:  x};

{x}  =  obj    #  x  =  obj.x;

Wednesday, April 11, 12

Page 57: The CoffeeScript Edge

{key: key} Shorthand andDestructuring Assignment

obj  =  {x}    #  obj  =  {x:  x};

{x}  =  obj    #  x  =  obj.x;

func  =  ({x})  -­‐>func  =  function(o)  {    var  x  =  o.x;}

Wednesday, April 11, 12

Page 58: The CoffeeScript Edge

More Syntactic Sugar

Wednesday, April 11, 12

Page 59: The CoffeeScript Edge

More Syntactic Sugar

f()  if  z    #  if  (z)  {  f();  }

Wednesday, April 11, 12

Page 60: The CoffeeScript Edge

More Syntactic Sugar

f()  if  z    #  if  (z)  {  f();  }

f?()            #  if  (...)  {  f();  }

Wednesday, April 11, 12

Page 61: The CoffeeScript Edge

More Syntactic Sugar

f()  if  z    #  if  (z)  {  f();  }

f?()            #  if  (...)  {  f();  }

obj?            #  obj  !=  null;

Wednesday, April 11, 12

Page 62: The CoffeeScript Edge

More Syntactic Sugar

f()  if  z    #  if  (z)  {  f();  }

f?()            #  if  (...)  {  f();  }

obj?            #  obj  !=  null;

x  ?  y          #  x  !=  null  ?  x  :  y;

Wednesday, April 11, 12

Page 63: The CoffeeScript Edge

More Syntactic Sugar

f()  if  z    #  if  (z)  {  f();  }

f?()            #  if  (...)  {  f();  }

obj?            #  obj  !=  null;

x  ?  y          #  x  !=  null  ?  x  :  y;

Plus, significant whitespace...

Wednesday, April 11, 12

Page 64: The CoffeeScript Edge

The Beauty of Indentationsource: https://github.com/TrevorBurnham/connect-assets

Wednesday, April 11, 12

Page 65: The CoffeeScript Edge

The Beauty of Indentation

for  ext  in  exts    sourcePath  =  stripExt(route)  +  ".#{ext}"    try        stats  =  fs.statSync  @absPath(sourcePath)        if  ext  is  'css'            {mtime}  =  stats            if  timeEq  mtime,  @cache.map[route]?.mtime                css  =  @cache.map[route].data            else                css  =  fs.readFileSync  @absPath(sourcePath)

source: https://github.com/TrevorBurnham/connect-assets

Wednesday, April 11, 12

Page 66: The CoffeeScript Edge

The Curly-Braced Equivalent

Wednesday, April 11, 12

Page 67: The CoffeeScript Edge

The Curly-Braced Equivalentvar  css,  ext,  mtime,  sourcePath,  stats,  _i,  _len,  _ref;for  (_i  =  0,  _len  =  exts.length;  _i  <  _len;  _i++)  {    ext  =  exts[_i];    sourcePath  =  stripExt(route)  +  ("."  +  ext);    try  {        stats  =  fs.statSync(this.absPath(sourcePath));        if  (ext  ===  'css')  {            mtime  =  stats.mtime;            if  (timeEq(mtime,  (_ref  =  this.cache.map[route])  !=  null  ?  _ref.mtime  :  void  0))  {                css  =  this.cache.map[route].data;            }  else  {                css  =  fs.readFileSync(this.absPath(sourcePath));            }        }    }  catch  (_e)  {}}

Wednesday, April 11, 12

Page 68: The CoffeeScript Edge

Wednesday, April 11, 12

Page 69: The CoffeeScript Edge

Language Features

II

Wednesday, April 11, 12

Page 70: The CoffeeScript Edge

The Wrapper

Wednesday, April 11, 12

Page 71: The CoffeeScript Edge

The Wrapper

CoffeeScript in:

console.log  i  for  i  in  arr

JavaScript out:(function()  {    var  i,  _i,  _len;    for  (_i  =  0,  _len  =  arr.length;  _i  <  _len;  _i++)  {        i  =  arr[_i];        console.log(i);    }}).call(this);

Wednesday, April 11, 12

Page 73: The CoffeeScript Edge

Wednesday, April 11, 12

Page 74: The CoffeeScript Edge

Things That Don’t Create Scopein JavaScript

Wednesday, April 11, 12

Page 75: The CoffeeScript Edge

Things That Don’t Create Scopein JavaScript

Conditionals

Wednesday, April 11, 12

Page 76: The CoffeeScript Edge

Things That Don’t Create Scopein JavaScript

Conditionals

Parentheses

Wednesday, April 11, 12

Page 77: The CoffeeScript Edge

Things That Don’t Create Scopein JavaScript

Conditionals

Parentheses

Objects

Wednesday, April 11, 12

Page 78: The CoffeeScript Edge

Things That Don’t Create Scopein JavaScript

Conditionals

Parentheses

Objects

Loops

Wednesday, April 11, 12

Page 79: The CoffeeScript Edge

Things That Don’t Create Scopein JavaScript

Conditionals

Parentheses

Objects

Loops

Files (!)

Wednesday, April 11, 12

Page 80: The CoffeeScript Edge

Wednesday, April 11, 12

Page 81: The CoffeeScript Edge

http://blog.meloncard.com/post/12175941935

Don’t Let This Happen to You!

Wednesday, April 11, 12

Page 82: The CoffeeScript Edge

CoffeeScripters Need No var!

Wednesday, April 11, 12

Page 83: The CoffeeScript Edge

CoffeeScripters Need No var!

console.log  i  for  i  in  arr

(function()  {    var  i,  _i,  _len;    for  (_i  =  0,  _len  =  arr.length;  _i  <  _len;  _i++)  {        i  =  arr[_i];        console.log(i);    }}).call(this);

Wednesday, April 11, 12

Page 84: The CoffeeScript Edge

JS Best Practices,CoffeeScript Defaults!

Wednesday, April 11, 12

Page 85: The CoffeeScript Edge

JS Best Practices,CoffeeScript Defaults!

Parappa the Wrapper

Wednesday, April 11, 12

Page 86: The CoffeeScript Edge

JS Best Practices,CoffeeScript Defaults!

Parappa the Wrapper

Proper Indentation

Wednesday, April 11, 12

Page 87: The CoffeeScript Edge

JS Best Practices,CoffeeScript Defaults!

Parappa the Wrapper

Proper Indentation

Avoiding ==

Wednesday, April 11, 12

Page 88: The CoffeeScript Edge

JS Best Practices,CoffeeScript Defaults!

Parappa the Wrapper

Proper Indentation

Avoiding ==

Packaging extensible objects as “classes”

Wednesday, April 11, 12

Page 89: The CoffeeScript Edge

Plain, Ordinary JavaScript Objects

Wednesday, April 11, 12

Page 90: The CoffeeScript Edge

Plain, Ordinary JavaScript Objects

lifeEtAl = answer: 42 showAnswer: -> console.log @answer #  @  ==  this

Wednesday, April 11, 12

Page 91: The CoffeeScript Edge

Plain, Ordinary JavaScript Objects

lifeEtAl = answer: 42 showAnswer: -> console.log @answer #  @  ==  this

lifeEtAl.showAnswer()

Wednesday, April 11, 12

Page 92: The CoffeeScript Edge

Plain, Ordinary JavaScript Objects

lifeEtAl = answer: 42 showAnswer: -> console.log @answer #  @  ==  this

lifeEtAl.showAnswer()

setTimeout  lifeEtAl.showAnswer,  10

Wednesday, April 11, 12

Page 93: The CoffeeScript Edge

Wednesday, April 11, 12

Page 94: The CoffeeScript Edge

Classes to the Rescue!

Wednesday, April 11, 12

Page 95: The CoffeeScript Edge

Classes to the Rescue!

class LifeEtAl answer: 42 showAnswer: => # fat -> console.log @answer

Wednesday, April 11, 12

Page 96: The CoffeeScript Edge

Classes to the Rescue!

class LifeEtAl answer: 42 showAnswer: => # fat -> console.log @answer

myLife = new LifeEtAl

Wednesday, April 11, 12

Page 97: The CoffeeScript Edge

Classes to the Rescue!

class LifeEtAl answer: 42 showAnswer: => # fat -> console.log @answer

myLife = new LifeEtAl

setTimeout myLife.showAnswer, 10

Wednesday, April 11, 12

Page 98: The CoffeeScript Edge

How About a Little Privacy?

Wednesday, April 11, 12

Page 99: The CoffeeScript Edge

How About a Little Privacy?

class LifeEtAl answer = 42 showAnswer: -> console.log answer

Wednesday, April 11, 12

Page 100: The CoffeeScript Edge

How About a Little Privacy?

class LifeEtAl answer = 42 showAnswer: -> console.log answer

myLife = new LifeEtAl

Wednesday, April 11, 12

Page 101: The CoffeeScript Edge

How About a Little Privacy?

class LifeEtAl answer = 42 showAnswer: -> console.log answer

myLife = new LifeEtAl

setTimeout myLife.showAnswer, 10

Wednesday, April 11, 12

Page 102: The CoffeeScript Edge

Using a Constructor

Wednesday, April 11, 12

Page 103: The CoffeeScript Edge

class Circle twoPi = Math.PI * 2 constructor: (@radius) -> @radiusSqr = Math.pow @radius, 2 diameter: => twoPi * @radius area: => Math.PI * @radiusSqr

Using a Constructor

Wednesday, April 11, 12

Page 104: The CoffeeScript Edge

class Circle twoPi = Math.PI * 2 constructor: (@radius) -> @radiusSqr = Math.pow @radius, 2 diameter: => twoPi * @radius area: => Math.PI * @radiusSqr

c = new Circle(5)console.log c.diameter() # 31.4159console.log c.area() # 78.5398

Using a Constructor

Wednesday, April 11, 12

Page 105: The CoffeeScript Edge

Let’s Try a Little Inheritance

Wednesday, April 11, 12

Page 106: The CoffeeScript Edge

Let’s Try a Little Inheritance

class  Document  extends  Backbone.Model    defaults:        title:  'Untitled'

Wednesday, April 11, 12

Page 107: The CoffeeScript Edge

Doing Inheritance via aJavaScript Library

Wednesday, April 11, 12

Page 108: The CoffeeScript Edge

Doing Inheritance via aJavaScript Library

var  Document  =  Backbone.Model.extend({    defaults:  {        title:  'Untitled'    }});

Wednesday, April 11, 12

Page 109: The CoffeeScript Edge

Wednesday, April 11, 12

Page 110: The CoffeeScript Edge

I. The Prototype Chain

Wednesday, April 11, 12

Page 111: The CoffeeScript Edge

I. The Prototype Chainclass  Document  extends  Backbone.Model    defaults:        title:  'Untitled'

Wednesday, April 11, 12

Page 112: The CoffeeScript Edge

I. The Prototype Chainclass  Document  extends  Backbone.Model    defaults:        title:  'Untitled'

doc  =  new  Document

Wednesday, April 11, 12

Page 113: The CoffeeScript Edge

I. The Prototype Chainclass  Document  extends  Backbone.Model    defaults:        title:  'Untitled'

doc  =  new  Document

Document::  is  Document.prototype

Wednesday, April 11, 12

Page 114: The CoffeeScript Edge

I. The Prototype Chainclass  Document  extends  Backbone.Model    defaults:        title:  'Untitled'

doc  =  new  Document

Document::  is  Document.prototype

doc.defaults  is  Document::defaults

Wednesday, April 11, 12

Page 115: The CoffeeScript Edge

I. The Prototype Chainclass  Document  extends  Backbone.Model    defaults:        title:  'Untitled'

doc  =  new  Document

Document::  is  Document.prototype

doc.defaults  is  Document::defaults

doc.validate  is  Backbone.Model::validate

Wednesday, April 11, 12

Page 116: The CoffeeScript Edge

I. The Prototype Chainclass  Document  extends  Backbone.Model    defaults:        title:  'Untitled'

doc  =  new  Document

Document::  is  Document.prototype

doc.defaults  is  Document::defaults

doc.validate  is  Backbone.Model::validate

doc.hasOwnProperty  is  Object::hasOwnProperty

Wednesday, April 11, 12

Page 117: The CoffeeScript Edge

II. Superclass Methods Can BeInvoked With super

Wednesday, April 11, 12

Page 118: The CoffeeScript Edge

II. Superclass Methods Can BeInvoked With super

class  AppleDevice    constructor:  (cost)  -­‐>        bankAccount.deduct  cost        bankAccount.deduct  cost  /  4  #  AppleCare

Wednesday, April 11, 12

Page 119: The CoffeeScript Edge

II. Superclass Methods Can BeInvoked With super

class  AppleDevice    constructor:  (cost)  -­‐>        bankAccount.deduct  cost        bankAccount.deduct  cost  /  4  #  AppleCare

class  iPhone  extends  AppleDevice    constructor:  (cost)  -­‐>        super    #  equivalent  to  super(cost)        setInterval  (-­‐>            bankAccount.deduct  cost  /  4        ),  ONE_MONTH

Wednesday, April 11, 12

Page 120: The CoffeeScript Edge

III. Superclass Properties are Copied

Wednesday, April 11, 12

Page 121: The CoffeeScript Edge

III. Superclass Properties are Copied

class  Primate    @thumbs  =  'opposable'

Wednesday, April 11, 12

Page 122: The CoffeeScript Edge

III. Superclass Properties are Copied

class  Primate    @thumbs  =  'opposable'

class  Human  extends  Primate

Wednesday, April 11, 12

Page 123: The CoffeeScript Edge

III. Superclass Properties are Copied

class  Primate    @thumbs  =  'opposable'

class  Human  extends  Primate

Human.thumbs  is  Primate.thumbs  is  'opposable'

Wednesday, April 11, 12

Page 124: The CoffeeScript Edge

Wednesday, April 11, 12

Page 125: The CoffeeScript Edge

Working with CoffeeScript

III

Wednesday, April 11, 12

Page 126: The CoffeeScript Edge

Installing coffee

Wednesday, April 11, 12

Page 127: The CoffeeScript Edge

Installing coffee

Step 1: Install Node

Wednesday, April 11, 12

Page 128: The CoffeeScript Edge

Installing coffee

Step 1: Install Node

Step 2: npm  install  -­‐g  coffee-­‐script

Wednesday, April 11, 12

Page 129: The CoffeeScript Edge

Installing coffee

Step 1: Install Node

Step 2: npm  install  -­‐g  coffee-­‐script

Want a different version?npm  install  -­‐g  coffee-­‐[email protected]

Wednesday, April 11, 12

Page 130: The CoffeeScript Edge

Installing coffee

Step 1: Install Node

Step 2: npm  install  -­‐g  coffee-­‐script

Want a different version?npm  install  -­‐g  coffee-­‐[email protected]

Wednesday, April 11, 12

Page 131: The CoffeeScript Edge

Compiling

Wednesday, April 11, 12

Page 132: The CoffeeScript Edge

Compiling

coffee  -­‐w

Wednesday, April 11, 12

Page 133: The CoffeeScript Edge

Compiling

coffee  -­‐w

Rails / other web frameworks

Wednesday, April 11, 12

Page 134: The CoffeeScript Edge

Compiling

coffee  -­‐w

Rails / other web frameworks

Middleman / other static web frameworks

Wednesday, April 11, 12

Page 135: The CoffeeScript Edge

Compiling

coffee  -­‐w

Rails / other web frameworks

Middleman / other static web frameworks

LiveReload (Mac)

Wednesday, April 11, 12

Page 136: The CoffeeScript Edge

Compiling

coffee  -­‐w

Rails / other web frameworks

Middleman / other static web frameworks

LiveReload (Mac)

Write a Cakefile

Wednesday, April 11, 12

Page 137: The CoffeeScript Edge

A Piece of Cakesource: https://github.com/sstephenson/node-coffee-project/

Wednesday, April 11, 12

Page 138: The CoffeeScript Edge

A Piece of Cake

build = (watch, callback) ->  if typeof watch is 'function'    callback = watch    watch = false  options = ['-c', '-o', 'lib', 'src']  options.unshift '-w' if watch  coffee = spawn 'coffee', options  coffee.stdout.on 'data', (data) -> print data.toString()  coffee.stderr.on 'data', (data) -> print data.toString()  coffee.on 'exit', (status) -> callback?() if status is 0

task 'build', 'Compile CoffeeScript source files', ->  build()

task 'test', 'Run the test suite', ->  build ->    require.paths.unshift __dirname + "/lib"    {reporters} = require 'nodeunit'    process.chdir __dirname    reporters.default.run ['test']

source: https://github.com/sstephenson/node-coffee-project/

Wednesday, April 11, 12

Page 139: The CoffeeScript Edge

Wednesday, April 11, 12

Page 140: The CoffeeScript Edge

Editing

https://github.com/jashkenas/coffee-script/wiki/Text-editor-pluginsWednesday, April 11, 12

Page 141: The CoffeeScript Edge

Documentingsource: http://coffeescript.org/documentation/docs/grammar.html

Wednesday, April 11, 12

Page 142: The CoffeeScript Edge

Testing

Wednesday, April 11, 12

Page 143: The CoffeeScript Edge

Testing

Mocha

Wednesday, April 11, 12

Page 144: The CoffeeScript Edge

Testing

Mocha

Mocha

Wednesday, April 11, 12

Page 145: The CoffeeScript Edge

Testing

Mocha

Mocha

Mocha

Wednesday, April 11, 12

Page 146: The CoffeeScript Edge

Testing

Mocha

Mocha

Mocha

http://visionmedia.github.com/mocha/

Wednesday, April 11, 12

Page 147: The CoffeeScript Edge

The Future of Web Apps...?

IV

Wednesday, April 11, 12

Page 151: The CoffeeScript Edge

Breaking the Client-ServerBoundaries

Wednesday, April 11, 12

Page 152: The CoffeeScript Edge

Breaking the Client-ServerBoundaries

Stitch (37signals)

Wednesday, April 11, 12

Page 153: The CoffeeScript Edge

Breaking the Client-ServerBoundaries

Stitch (37signals)

browserify

Wednesday, April 11, 12

Page 154: The CoffeeScript Edge

Breaking the Client-ServerBoundaries

Stitch (37signals)

browserify

jsdom

Wednesday, April 11, 12

Page 155: The CoffeeScript Edge

Wednesday, April 11, 12

Page 156: The CoffeeScript Edge

Wednesday, April 11, 12

Page 157: The CoffeeScript Edge

Thanks! Questions?

Follow me @trevorburnham and @coffeescript

Check out my new book, Async JavaScripthttp://leanpub.com/asyncjs

Wednesday, April 11, 12