write better javascript

59
Write Better Javascript with RequireJS

Upload: vala

Post on 05-Feb-2016

57 views

Category:

Documents


0 download

DESCRIPTION

Write Better Javascript. with RequireJS. What is RequireJS?. What is RequireJS?. from requirejs.org, - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Write Better Javascript

Write Better Javascript

with RequireJS

Page 2: Write Better Javascript

What is RequireJS?

Page 3: Write Better Javascript

What is RequireJS?

from requirejs.org,

"RequireJS is a JavaScript file and module loader. It is optimized for in-browser use, but it can be used in other JavaScript environments, like Rhino and Node. Using a modular script loader like RequireJS will improve the speed and quality of your code."

Page 4: Write Better Javascript

What is RequireJS?

• Async Script Loader• 12 k• Very actively developed• Well documented• new BSD / MIT

Page 5: Write Better Javascript

Why use a tool like RequireJS?

 

Page 6: Write Better Javascript

Why use a tool like RequireJS?

Because Javascript Sucks. Also, user side scripting makes things worse.

Page 7: Write Better Javascript

JS sucks.├── local_settings.py├── manage.py├── datacleaning│   ├── admin.py│   ├── forms.py│   ├── migrations│   │   └── 0001_initial.py│   ├── models.py│   ├── tests.py│   ├── urls.py│   └── views.py├── journals│   ├── admin.py│   ├── fixtures│   │   └── 20101124_5.03.json│   ├── forms.py│   ├── migrations│   │   ├── 0001_initial.py│   │   ├── 0002_auto__images__add_entry.py│   │   └── 0003_loading_test_journal_entries.py│   ├── models.py│   ├── tests.py│   ├── urls.py│   └── views.py├── lib│   ├── context_processors.py│   ├── string_processors.py│   ├── template.py│   ├── urlmiddleware.py│   ├── user.py│   └── widgets.py

├── parks│   ├── admin.py│   ├── fixtures│   │   ├── initial_featurecategories.json│   │   └── train_examples.json│   ├── forms.py│   ├── importers│   │   └── recdata.py│   ├── management│   │   ├── commands│   │   │   ├── exportoregonparks.py│   │   │   ├── importparks.py│   │   │   ├── ......

Page 8: Write Better Javascript

JS sucks.├── ckeditor│   ├── ckeditor.js│   ├── contents.css│   ├── lang│   │   ├── af.js│   │   ├── ar.js│   │   ├── bg.js│   │   ├── bn.js│   │   ├── bs.js│   │   ├── ca.js│   │   ├── cs.js│   │   ├── cy.js│   │   ├── da.js│   │   ├── de.js│   │   ├── el.js│   │   ├── en-au.js│   │   ├── en-ca.js│   │   ├── en-gb.js│   │   ├── en.js│   │   ├── eo.js│   │   ├── es.js│   │   ├── et.js│   │   ├── eu.js│   │   ├── fa.js│   │   ├── fi.js│   │   ├── fo.js│   │   ├── fr-ca.js│   │   ├── fr.js│   │   ├── gl.js│   │   ├── gu.js│   │   ├── he.js

│   │   ├── hi.js│   │   ├── hr.js│   │   ├── hu.js│   │   ├── is.js│   │   ├── it.js│   │   ├── ja.js│   │   ├── ka.js│   │   ├── km.js│   │   ├── ko.js│   │   ├── _languages.js│   │   ├── lt.js│   │   ├── lv.js│   │   ├── mn.js│   │   ├── ms.js│   │   ├── nb.js│   │   ├── nl.js│   │   ├── no.js│   │   ├── pl.js│   │   ├── pt-br.js│   │   ├── pt.js│   │   ├── ro.js│   │   ├── ru.js│   │   ├── sk.js│   │   ├── sl.js│   │   ├── sr.js│   │   ├── sr-latn.js│   │   ├── sv.js│   │   ├── th.js│   │   ├── _trans.txt│   │   ├── tr.js│   │   ├── uk.js│   │   ├── vi.js│   │   ├── zh-cn.js│   │   └── zh.js│   ├── plugins│   │   └── styles│   │       └── styles

│   │           └── default.js│   ├── skins│   │   └── kama│   │       ├── dialog.css│   │       ├── editor.css│   │       ├── icons.png│   │       ├── icons_rtl.png│   │       ├── images│   │       │   ├── dialog_sides.gif│   │       │   ├── dialog_sides.png│   │       │   ├── dialog_sides_rtl.png│   │       │   ├── mini.gif│   │       │   ├── noimage.png│   │       │   ├── sprites_ie6.png│   │       │   ├── sprites.png│   │       │   └── toolbar_start.gif│   │       ├── skin.js│   │       └── templates.css│   └── SQRLY_TEAM_PLEASE_README__LICENSE├── elevationservice_eg_google.js├── jquery.form.js├── jquery.history.js├── jqueryplugins│   ├── jquery.address-1.3.js│   └── jquery.simplemodal-1.3.min.js├── markers.js├── pages│   ├── add-park.js│   ├── datacleaning.js│   └── park-detail.js├── park-ratings.js├── polylinearray_eg_google.js├── star-rating.js└── star-rating-metadata.js

Page 9: Write Better Javascript

JS sucks1. code is too long2. just a little code from somewhere else3. copy and paste4. goto: 1

Page 10: Write Better Javascript

JS sucks<head>   <script src="foo.js" type="text/javascript"></script>  <script src="bar.js" type="text/javascript"></script>  <script src="baz.js" type="text/javascript"></script>  <script src="biff.js" type="text/javascript"></script>  <script src="bop.js" type="text/javascript"></script>  <script src="foo.js" type="text/javascript"></script>  <script src="bar.js" type="text/javascript"></script>  <script src="baz.js" type="text/javascript"></script>  <script src="biff.js" type="text/javascript"></script>  <script src="bop.js" type="text/javascript"></script>   <script src="foo.js" type="text/javascript"></script>  <script src="bar.js" type="text/javascript"></script>  <script src="baz.js" type="text/javascript"></script>  <script src="biff.js" type="text/javascript"></script>  <script src="bop.js" type="text/javascript"></script>...</head>  

Page 11: Write Better Javascript

RequireJS makes JS suck less• Help you make your code more modular• manages script loading for you• build and compress your code

 (oh, and other stuff too...)

Page 12: Write Better Javascript

Making code more modular

Page 13: Write Better Javascript

So what's the code look like?

Page 14: Write Better Javascript

Loading from the page<script data-main="pages/profile.js"            src="scripts/require.js"></script>   <script src="scripts/require.js"></script>require(["pages/profile"]);

Page 15: Write Better Javascript

Loading from the pagerequire(["pages/profile"], function(Profile) {    ...do stuff...    require.ready() {        ...do more stuff...         Profile.init(INSERT_SOMETHING_HERE);     });}); 

Page 16: Write Better Javascript

Defining a Moduledefine(["foo", "baz", "x"], function(Foo, Baz) {    ...do stuff...    return {        init: function(data) {            container = data;        },        do_something: some_internal_method    }}); 

Page 17: Write Better Javascript

Loading - production vs dev

Page 18: Write Better Javascript

Loading - production vs dev

Page 19: Write Better Javascript

Loading - production vs dev

Page 20: Write Better Javascript

Let's look at an example

Page 21: Write Better Javascript

require("map", function(Map) {    ... map file is loaded ... });

Page 22: Write Better Javascript

require("map", function(Map) {    ... map file is loaded ... });

Page 23: Write Better Javascript

require("map", function(Map) {    ... map file is loaded ... });

define(["gm", "foo"], function(GM, Foo) {    ... set up js ...     return {};});

Page 24: Write Better Javascript

define(["gm", "foo"], function(GM, Foo) {    ... set up js ...     return {};});

require("map", function(Map) {    ... map file is loaded ... });

Page 25: Write Better Javascript

define(["gm", "foo"], function(GM, Foo) {    ... set up js ...     return {};});

require("map", function(Map) {    ... map file is loaded ...     require.ready(function() {        ... page is ready ...     }); });

Page 26: Write Better Javascript

define(["gm", "foo"], function(GM, Foo) {    ... set up js ...     return {};});

require("map", function(Map) {    ... map file is loaded ...     require.ready(function() {        Map.init();     }); });

Page 27: Write Better Javascript

require("map", function(Map) {    ... map file is loaded ...     require.ready(function() {        Map.init();     }); });

define(["gm", "foo"], function(GM, Foo) {    ... set up js ...     return {};});

Page 28: Write Better Javascript

require("map", function(Map) {    ... map file is loaded ...     require.ready(function() {        Map.init();     }); });

define(["gm", "foo"], function(GM, Foo) {    var m;    function init(id) {        m = GM.create(id);    }    return {};});

Page 29: Write Better Javascript

require("map", function(Map) {    ... map file is loaded ...     require.ready(function() {        Map.init();     }); });

define(["gm", "foo"], function(GM, Foo) {    var m;    function init(id) {        m = GM.create(id);    }    return {        init: init    };});

Page 30: Write Better Javascript

define(["gm", "foo"], function(GM, Foo) {    var m;    function init(id) {        m = GM.create(id);    }    return {        init: init    };});

require("map", function(Map) {    ... map file is loaded ...     require.ready(function() {        Map.init();     }); });

Page 31: Write Better Javascript

define(["gm", "foo"], function(GM, Foo) {    var m;    function init(id) {        m = GM.create(id);    }    return {        init: init    };});

require("map", function(Map) {    ... map file is loaded ...     require.ready(function() {        Map.init("div_id");     }); });

Page 32: Write Better Javascript

That's it.

Page 33: Write Better Javascript

require("map", function(Map) {    ... map file is loaded ...     require.ready(function() {        Map.init("div_id");    });});

define(["gm", "foo"], function(GM, Foo) {    var m;    function init(id) {        m = GM.create(id);    }    return {        init: init    };});

Page 34: Write Better Javascript

require("map", function(Map) {    ... map file is loaded ...     require.ready(function() {        Map.init("div_id");    });});

define(["gm", "foo"], function(GM, Foo) {    var m;    function init(id) {        m = GM.create(id);    }    return {        init: init,        map: m    };});

Page 35: Write Better Javascript

define(["gm", "foo"], function(GM, Foo) {    var m;    function init(id) {        m = GM.create(id);    }    return {        init: init,        map: m    };});

require("map", function(Map) {    ... map file is loaded ...     require.ready(function() {        Map.init("div_id");     }); });

Page 36: Write Better Javascript

define(["gm", "foo"], function(GM, Foo) {    var m;    function init(id) {        m = GM.create(id);    }    return {        init: init,        map: m    };});

require("map", function(Map) {    ... map file is loaded ...     require.ready(function() {        Map.init("div_id");        a = Map.m;    });});

Page 37: Write Better Javascript

define(["gm", "foo"], function(GM, Foo) {    var m;    function init(id) {        m = GM.create(id);    }    return {        init: init,        map: m    };});

require("map", function(Map) {    ... map file is loaded ...     require.ready(function() {        Map.init("div_id");        a = Map.m;        Map.init("another_div_id");        b = Map.m;    });});

Page 38: Write Better Javascript

define(["gm", "foo"], function(GM, Foo) {    var m;    function init(id) {        m = GM.create(id);    }    return {        init: init,        map: m    };});

require("map", function(Map) {    ... map file is loaded ...     require.ready(function() {        Map.init("div_id");        a = Map.m;        Map.init("another_div_id");        b = Map.m;    });});

Page 39: Write Better Javascript

define(["gm", "foo"], function(GM, Foo) {    var m;    function init(id) {        m = GM.create(id);    }    return {        init: init,        map: m    };});

require("map", function(Map) {    require.ready(function() {        Map.init("div_id");    });});

Page 40: Write Better Javascript

define(["gm", "foo"], function(GM, Foo) {    var m;    function init(id) {        m = GM.create(id);    }    return {        init: init,        map: m    };});

require("map", function(Map) {    require.ready(function() {        Map.init("div_id");        a = Map;    });});

require("map", function(Map) {    require.ready(function() {        Map.init("another_div_id");        b = Map;    });});

// a === b

Page 41: Write Better Javascript

define(["gm", "foo"], function(GM, Foo) {    var m;    function init(id) {        m = GM.create(id);    }    return {        init: init,        map: m    };});

require({context:"abc"},"map", function(Map) {    require.ready(function() {        Map.init("div_id");        a = Map.m;    });});

require({context:"xyz"},"map", function(Map) {    require.ready(function() {        Map.init("another_div_id");        b = Map.m;    });});

// a.m !== b.m

Page 42: Write Better Javascript

define(["gm", "foo"], function(GM, Foo) {    var m;    function init(id) {        m = GM.create(id);    }    return {        init: init,        map: m    };});

require("map", function(Map) {    require.ready(function() {        a = new Map.init("div_id");        b = new Map.init("another_id");    });});

Page 43: Write Better Javascript

require("map", function(Map) {    require.ready(function() {        a = new Map.init("div_id");        b = new Map.init("another_id");    });});

define(["gm", "foo"], function(GM, Foo) {    var m;    function init(id) {        m = GM.create(id);    }    return {        init: init,        map: m    };});

Page 44: Write Better Javascript

require("map", function(Map) {    require.ready(function() {        a = new Map.init("div_id");        b = new Map.init("another_id");    });});

define(["gm", "foo"], function(GM, Foo) {    function init(id) {        var that = {};        that.m = GM.create(id);        return that;    }    return {        init: init,        map: m    };});

Page 45: Write Better Javascript

require("map", function(Map) {    require.ready(function() {        a = new Map.init("div_id");        b = new Map.init("another_id");    });});

define(["gm", "foo"], function(GM, Foo) {    function init(id) {        var that = {};        that.m = GM.create(id);        return that;    }    return {        init: init    };});

Page 46: Write Better Javascript

require("map", function(Map) {    require.ready(function() {        a = new Map.init("div_id");        b = new Map.init("another_id");    });});

define(["gm", "foo"], function(GM, Foo) {    function init(id) {        var that = {};        that.m = GM.create(id);        return that;    }    return init;});

Page 47: Write Better Javascript

require("map", function(Map) {    require.ready(function() {        a = new Map.init("div_id");        b = new Map.init("another_id");    });});

define(["gm", "foo"], function(GM, Foo) {    return function(id) {        var that = {};        that.m = GM.create(id);        return that;    }});

Page 48: Write Better Javascript

define(["gm", "foo"], function(GM, Foo) {    return function(id) {        var that = {};        that.m = GM.create(id);        return that;    }});

require("map", function(Map) {    require.ready(function() {        a = new Map.init("div_id");        b = new Map.init("another_id");    });});

Page 49: Write Better Javascript

define(["gm", "foo"], function(GM, Foo) {    return function(id) {        var that = {};        that.m = GM.create(id);        return that;    }});

require("map", function(Map) {    require.ready(function() {        a = new Map("div_id");        b = new Map("another_id");    });});

Page 50: Write Better Javascript

Plugins

define([ "foo!bar" ], function() { ... });

Page 51: Write Better Javascript

When order matters...define(["order!foo", "order!bar", "order!baz"], function(Foo, Bar, Baz) {    ...});

Page 52: Write Better Javascript

Loading a Templatedefine(["resig_micro", "text!bar"], function(Resig, BarTmpl) {    ...    data = {   foo: 1,                    bar: "once upon a time..." };    rendered = Resig(BarTmpl, data);    ...});

Page 53: Write Better Javascript

Write in CoffeeScriptdefine(["cs!foo"], function(Foo) {    ...});

Page 54: Write Better Javascript

Loading CSSdefine(["css!foo"], function() {    ...});

function loadCss(url) {    var link = document.createElement("link");    link.type = "text/css";    link.rel = "stylesheet";    link.href = url;    document.getElementsByTagName("head")                                                                [0].appendChild(link);}

Page 55: Write Better Javascript

Loading Offsite contentdefine(["foo", "https://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js"], function(Foo, $) {    ...});

Page 56: Write Better Javascript

Loading Google Maps, etc.define(["async!http://maps.google.com/maps/api/js?                                               sensor=false!callback"], function() {    return google.maps;})

Page 57: Write Better Javascript

Getting specific with your settingsrequire({          baseUrl: "/another/path",          paths: {              "some": "some/v1.0"          },          waitSeconds: 15,          locale: "fr-fr",          context: "foo"      }, ["some/module"],      function(someModule) {...

//    some/v1.0/module.js

Page 58: Write Better Javascript

Compiling / Minifying./requirejs/build/build.sh app.build.js

• app.build.js• dev/

o your_stuff.js• requirejs/

o require.js source files• built/

o destination directory

app.build.js({    appDir: "dev/",    baseUrl: "scripts",    dir: "built/",    optimize: "uglify",    ...    paths?    priority?    ...})

github.com/jrburke/r.js/blob/master/build/example.build.js

Page 59: Write Better Javascript

Thanks

Chris Pitzerrequirejs.org

#requirejs on irc.freenode.net