<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Greg Franko]]></title>
  <link href="http://gregfranko.com/atom.xml" rel="self"/>
  <link href="http://gregfranko.com/"/>
  <updated>2014-05-05T23:17:40-07:00</updated>
  <id>http://gregfranko.com/</id>
  <author>
    <name><![CDATA[Greg Franko]]></name>
    <email><![CDATA[gfranko5@yahoo.com]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Building JavaScript Tools]]></title>
    <link href="http://gregfranko.com/blog/building-javascript-tools/"/>
    <updated>2014-02-14T17:58:00-08:00</updated>
    <id>http://gregfranko.com/blog/building-javascript-tools</id>
    <content type="html"><![CDATA[<p>Many developers use popular JavaScript static code analysis tools such as <a href='http://jshint.com' target='_blank'>JSHint</a>, <a href='http://lisperator.net/uglifyjs/' target='_blank'>UglifyJS</a>, and the <a href='http://requirejs.org/docs/optimization.html' target='_blank'>RequireJS Optimizer</a> in their workflows.</p>

<p>Unfortunately, not many developers know how to create similar tools for themselves.</p>

<!-- more -->


<p>This talk will cover what JavaScript Abstract Syntax Trees (ASTs) are, how to use ASTs to create powerful node.js and client-side tools, and why you are smart enough to use them.</p>

<div class="embed-video-container"><iframe src="http://www.youtube.com/embed/XA8_hZfVecI "></iframe></div>




<br />


<p><strong>Note:</strong> If the slide deck does not appear below, or you would like to view the actual presentation, go to: <a href='http://gregfranko.com/building-javascript-tools-talk' target='_blank'>http://gregfranko.com/building-javascript-tools-talk</a></p>

<script async class="speakerdeck-embed" data-id="2e62fb60780b0131442d06710e138990" data-ratio="0.772830188679245" src="http://gregfranko.com//speakerdeck.com/assets/embed.js"></script>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Modular Workflow with Require.js]]></title>
    <link href="http://gregfranko.com/blog/requirejs-presentation/"/>
    <updated>2014-02-14T17:40:00-08:00</updated>
    <id>http://gregfranko.com/blog/requirejs-presentation</id>
    <content type="html"><![CDATA[<p>Building JavaScript web apps today that you will still enjoy working on a year from now is difficult. The solution is to decrease code complexity and increase maintainability. Easier said than done.</p>

<p>This talk will review some of the traditional maintainability roadblocks facing JavaScript client-side developers, and introduce a new project workflow with RequireJS and Almond.js/AMDClean.js.</p>

<!-- more -->


<p>Let&#8217;s dive in and see how we can improve code maintainability with AMD and start enjoying the code that we write.</p>

<p><strong>Note:</strong> If the slide deck does not appear below, or you would like to view the actual presentation, go to: <a href='http://gregfranko.com/requirejs-talk' target='_blank'>http://gregfranko.com/requirejs-talk</a></p>

<script async class="speakerdeck-embed" data-id="05053010780c0131442c06710e138990" data-ratio="0.772830188679245" src="http://gregfranko.com//speakerdeck.com/assets/embed.js"></script>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[JavaScript Design Patterns]]></title>
    <link href="http://gregfranko.com/blog/javascript-design-patterns/"/>
    <updated>2013-10-05T11:43:00-07:00</updated>
    <id>http://gregfranko.com/blog/javascript-design-patterns</id>
    <content type="html"><![CDATA[<p>JavaScript design patterns are important for the maintainability and scalability of web applications. While working on the <a href="http://addthis.com/get/smart-layers" target="_blank">AddThis Smart Layers</a> product, the team focused on writing DRY (Don’t Repeat Yourself), consistent, and cross-browser compliant code. Before we talk about the specific techniques that we used, let’s first understand the Smart Layers use case.</p>

<!-- more -->


<h2>Use Case</h2>

<p>Smart Layers is a product suite that currently includes 6 different UI widgets (including share, follow, recommended content). Although each widget contains unique functionality, there are many similarities between the widgets.</p>

<p><a href="http://www.addthis.com/blog/2013/10/03/javascript-design-patterns-used-in-smart-layers/" target="_blank" title="JavaScript Design Patterns"><img class="center" src="http://gregfranko.com/images/smartlayers.png"></a></p>

<p>For example, all widgets create and append DOM elements, listen to events, support user-specified options, utilize CSS3 show/hide animations, etc. Once we put our code architect hats on, we realized that:</p>

<blockquote><p>We needed an inheritance model that could handle both unique widget functionality and common logic without code duplication.</p></blockquote>

<h2>Simple JavaScript Prototypal Inheritance</h2>

<p>At this point, it is important to delve into object-oriented JavaScript, and recognize the difference between <strong>instance properties</strong> and <strong>prototype properties</strong>.</p>

<h3>Instance Properties</h3>

<p>Instance properties are properties that are scoped to a particular instance object and are not propagated to other instances (unless you go out of your way to change that). Let’s look at an example:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>  <span class="c1">// Creates an AddThisEmployee constructor function</span>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">AddThisEmployee</span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="nx">name</span><span class="p">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Creates an AddThisEmployee instance object</span>
</span><span class='line'>  <span class="c1">// and stores it in the greg local variable</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">greg</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">AddThisEmployee</span><span class="p">(</span><span class="s1">&#39;Greg Franko&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="c1">// Creates an AddThisEmployee instance object</span>
</span><span class='line'>    <span class="c1">// and stores it in the sol local variable</span>
</span><span class='line'>    <span class="nx">sol</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">AddThisEmployee</span><span class="p">(</span><span class="s1">&#39;Sol Chea&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Greg doesn&#39;t like his name and decides to</span>
</span><span class='line'>  <span class="c1">// legally change it to &#39;Frank The Tank&#39;</span>
</span><span class='line'>  <span class="nx">greg</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="s1">&#39;Frank The Tank&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Sol has no idea that Greg has changed his name to</span>
</span><span class='line'>  <span class="c1">// &#39;Frank The Tank&#39; and continues to call him Greg</span>
</span><span class='line'>  <span class="c1">// This angers Greg</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the previous example, each instance object contains one instance property (name). Since each instance object’s properties are not propagated to each other, they are not aware of each other’s changes.</p>

<h3>Prototype Properties</h3>

<p>On the other hand, prototype properties are properties that are propagated to all instances. In JavaScript, an object’s property is looked up at run time, by first checking if there is an instance property. If there is not an instance property, then the object’s prototype is checked next to see if it contains the property.</p>

<blockquote><p>All prototype properties are kept in sync and visible to each instance.</p></blockquote>

<p>Let’s demonstrate prototypes by expanding upon our previous code example:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>  <span class="c1">// Creates a Person constructor function</span>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">AddThisEmployee</span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="nx">name</span><span class="p">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Assigns the AddThisEmployee prototype property</span>
</span><span class='line'>  <span class="nx">AddThisEmployee</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">companyName</span><span class="o">:</span> <span class="s1">&#39;AddThis&#39;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>  <span class="c1">// Creates an AddThisEmployee instance object and</span>
</span><span class='line'>  <span class="c1">// stores it in the greg local variable</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">greg</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">AddThisEmployee</span><span class="p">(</span><span class="s1">&#39;Greg Franko&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="c1">// Creates an AddThisEmployee instance object and</span>
</span><span class='line'>    <span class="c1">// stores it in the sol local variable</span>
</span><span class='line'>    <span class="nx">sol</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">AddThisEmployee</span><span class="p">(</span><span class="s1">&#39;Sol Chea&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Greg doesn&#39;t like his name and decides to</span>
</span><span class='line'>  <span class="c1">// legally change it to &#39;Frank The Tank&#39;</span>
</span><span class='line'>  <span class="nx">greg</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="s1">&#39;Frank The Tank&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Sol has no idea that Greg has changed his name to</span>
</span><span class='line'>  <span class="c1">// &#39;Frank The Tank&#39; and continues to call him Greg</span>
</span><span class='line'>  <span class="c1">// This angers Greg</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// AddThis changes it&#39;s company name to &#39;Team Awesome&#39;</span>
</span><span class='line'>  <span class="nx">AddThisEmployee</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">companyName</span> <span class="o">=</span> <span class="s1">&#39;Team Awesome&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Both Greg and Sol know that AddThis changed it&#39;s name</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">greg</span><span class="p">.</span><span class="nx">companyName</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">sol</span><span class="p">.</span><span class="nx">companyName</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>For Smart Layers, every widget instance reuses the same object as it’s prototype. This both simplifies the codebase and makes it easy to make changes that need to be propagated to all widgets.</p>

<h2>Factory Pattern</h2>

<p>Since every widget is created in a similar way, we needed a design pattern to take care of the instance creation process. Smart Layers uses the Factory pattern as a generic interface for creating instance objects.</p>

<p>Here’s a high-level look:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>  <span class="kd">var</span> <span class="nx">commonObj</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">exampleProp</span><span class="o">:</span> <span class="s1">&#39;Each instance will have this property&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>    <span class="nx">factory</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">instanceProps</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">Constructor</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">x</span> <span class="k">in</span> <span class="nx">instanceProps</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">if</span> <span class="p">(</span><span class="nx">instanceProps</span><span class="p">.</span><span class="nx">hasOwnProperty</span><span class="p">(</span><span class="nx">x</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">[</span><span class="nx">x</span><span class="p">]</span> <span class="o">=</span> <span class="nx">instanceProps</span><span class="p">[</span><span class="nx">x</span><span class="p">];</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>        <span class="nx">widget</span><span class="p">;</span>
</span><span class='line'>      <span class="nx">widget</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="nx">commonObj</span><span class="p">;</span>
</span><span class='line'>      <span class="nx">widget</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Constructor</span><span class="p">();</span>
</span><span class='line'>      <span class="nx">widget</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="nx">name</span><span class="p">;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Calls the factory method</span>
</span><span class='line'>  <span class="nx">factory</span><span class="p">(</span><span class="s1">&#39;share&#39;</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// Constructor function</span>
</span><span class='line'>    <span class="nx">_create</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{}</span>
</span><span class='line'>  <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>The previous example shows a <code>factory()</code> method that can be called by passing a string name and an object literal containing all of the desired instance properties.</p>

<blockquote><p>The factory pattern abstracts away the JavaScript constructor and prototype assigning ugliness, and provides an easy way to implement a consistent API for each instance.</p></blockquote>

<p><strong>Note:</strong> For similar techniques that work with jQuery plugins, check out the <a href="http://api.jqueryui.com/jQuery.widget/" target="_blank">jQueryUI Widget Factory</a> and <a href="https://github.com/gfranko/jqfactory" target="_blank">jqfactory</a> open-source projects.</p>

<h2>Module Pattern</h2>

<p>Another major design pattern used in Smart Layers is the module pattern. Currently, the Smart Layers JavaScript API only has one public method (destroy) that can be used after Smart Layers is initialized on the page. Under the hood though, the JavaScript API consists of multiple hidden methods that are used internally. To accomplish public/private API methods, we took advantage of JavaScript function scoping to only expose what we wanted to.</p>

<p>Let’s look at a basic example of the module pattern:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>  <span class="c1">// Function constructor</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Person</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">obj</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// Local variables that are privately scoped</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">firstName</span> <span class="o">=</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">firstName</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">lastName</span> <span class="o">=</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">lastName</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">occupation</span> <span class="o">=</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">occupation</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Public API properties</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">firstName</span><span class="o">:</span> <span class="nx">firstName</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="c1">// Instantiating a new Person instance object</span>
</span><span class='line'>  <span class="nx">greg</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Person</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">firstName</span><span class="o">:</span> <span class="s1">&#39;Greg&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">lastName</span><span class="o">:</span> <span class="s1">&#39;Franko&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">occupation</span><span class="o">:</span> <span class="s1">&#39;JavaScript Engineer&#39;</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Prints out &quot;Greg&quot;</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;first name&#39;</span><span class="p">,</span> <span class="nx">greg</span><span class="p">.</span><span class="nx">firstName</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Prints out &quot;undefined&quot;</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;last name&#39;</span><span class="p">,</span> <span class="nx">greg</span><span class="p">.</span><span class="nx">lastName</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Prints out &quot;undefined&quot;</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;occupation&#39;</span><span class="p">,</span> <span class="nx">greg</span><span class="p">.</span><span class="nx">occupation</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>This example demonstrates that all local variables, declared using the <code>var</code> keyword, are only accessible within the declaring function or other nested functions.</p>

<p>In our example, a person’s first name, last name, and occupation are all local variables. An object, that includes the <code>firstName</code> property, is then returned inside of our constructor function.  Since the <code>firstName</code> local variable is the only variable returned, it is the only property that can be retrieved from a different scope.</p>

<blockquote><p>The module pattern is an example of a <strong>closure</strong>, since a local property is kept alive and can be referenced inside of a different scope.</p></blockquote>

<p>Here’s a more practical example:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>  <span class="c1">// Method that will only return functions that do not</span>
</span><span class='line'>  <span class="c1">// begin with an underscore</span>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">publicApi</span> <span class="p">(</span><span class="nx">api</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">method</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">currentMethod</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">publicApi</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>    <span class="k">for</span><span class="p">(</span><span class="nx">method</span> <span class="k">in</span> <span class="nx">api</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">currentMethod</span> <span class="o">=</span> <span class="nx">api</span><span class="p">[</span><span class="nx">method</span><span class="p">];</span>
</span><span class='line'>      <span class="k">if</span><span class="p">(</span><span class="nx">method</span><span class="p">.</span><span class="nx">charAt</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="o">!==</span> <span class="s1">&#39;_&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">publicApi</span><span class="p">[</span><span class="nx">method</span><span class="p">]</span> <span class="o">=</span> <span class="nx">api</span><span class="p">[</span><span class="nx">method</span><span class="p">];</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">publicApi</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Stores the return value of the publicApi method</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">publicMethods</span> <span class="o">=</span> <span class="nx">publicApi</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">publicMethod</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{},</span>
</span><span class='line'>    <span class="nx">_privateMethod</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Should only contain the publicMethod as a property</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Public API&#39;</span><span class="p">,</span> <span class="nx">publicMethods</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>This demonstrates the technique that Smart Layers uses to expose public API methods. All methods that start with an underscore are assumed to be private and are not returned as a public method.</p>

<h2>Summary</h2>

<p>Prototypal inheritance, the factory pattern, and the module pattern are all extremely useful techniques that can be used together to create powerful applications. I’d love to hear your thoughts and the patterns you use in your own JavaScript codebases!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[JavaScript Performance Tips]]></title>
    <link href="http://gregfranko.com/blog/javascript-performance-tips/"/>
    <updated>2013-09-17T16:25:00-07:00</updated>
    <id>http://gregfranko.com/blog/javascript-performance-tips</id>
    <content type="html"><![CDATA[<p>It is a competitive advantage for websites to be fast and responsive.  When building the <a href="https://www.addthis.com/get/smart-layers#.UjjAS2TXhTs" target="_blank">AddThis Smart Layers</a> tool suite, performance was a priority and first-class feature. Let’s take a look at some of the mobile and desktop performance best practices that I (and the rest of the AddThis team) used to make Smart Layers blazing fast.</p>

<!-- more -->




<br><br>


<h2>Dynamic Loading</h2>

<p>With the increasing number of mobile web users using a 3g/4g connection, it’s more important than ever to only download what you need. To save unnecessary bytes from being downloaded, we dynamically load assets (JavaScript, CSS, etc).</p>

<p><a href="http://www.addthis.com/blog/2013/09/17/performance-optimizing-for-smart-layers/" target="_blank" title="JavaScript Performance Best Practices"><img class="center" src="http://farm4.staticflickr.com/3742/9776421873_0d5795a966_z.jpg"></a></p>

<p>For example, Smart Layers uses the great <a href="https://github.com/douglascrockford/JSON-js" target="_blank">JSON2.js</a> JavaScript library, created by <a href="https://github.com/douglascrockford" target="_blank">Douglas Crockford</a>, to provide native JSON support for older browsers (IE6 and IE7). Instead of including JSON2.js for browsers that already support the native JSON methods, we make sure to only include JSON2.js for browsers that need the polyfill.</p>

<p>Dynamic asset loading is becoming popular in the front-end community, and is often a benefit of using a client-side script loader, such as <a href="http://requirejs.org">Require.js</a> (which we don’t use).</p>

<h2>Animations</h2>

<p>The unofficial performance goal for web animations is to perform at around 60 frames per second (fps). If your app is running animations at 60fps, then your users will see smooth and jank-free animations. Smooth animations = happy users.</p>

<p>To achieve ~60fps performance, Smart Layer animations use CSS transitions and transforms. A major performance benefit of using CSS transitions and transforms is <strong>hardware acceleration</strong>. At a high level, this means that all of the animation hard work can be offloaded to the browser and GPU. Performance benchmarks have shown massive speed and resource consumption improvements for browsers that utilize these techniques (specifically mobile browsers).</p>

<p>Instead of creating our own custom CSS transforms and transitions, we decided to use a few of the CSS-based animations from the popular project, <a href="http://daneden.me/animate/" target="_blank">Animate.css</a>. We love open-source technologies and want to thank <a href="https://twitter.com/_dte" target="_blank">Dan Eden</a> for all of his hard work on the project.</p>

<h2>Memory Management</h2>

<p>Proper memory management is crucial for the performance of web applications. A common reason for a web app feeling sluggish and non-responsive to a user is a memory leak.</p>

<blockquote><p>I thought the browser does automatic JavaScript garbage collection and memory deallocation, so why do I have to worry about this?</p></blockquote>


<p>You’re right, your browser does automatically clean up and deallocate memory. Unfortunately, the browser does not know your application, and you must make it clear what code is no longer being used and can be freed up for other things.</p>

<p><strong>Memory leaks are so common that your web application most likely has one</strong> that you may not have noticed; only the memory leaks which cause performance issues easily draw attention. One of the most performance-intensive operations in JavaScript is interacting with the DOM. If you suspect that your application has a memory leak, then you should first investigate if it is DOM-related.</p>

<p>Since so many web applications these days are <strong>single page applications</strong> (I know, I’m tired of that buzz word too), and long-lived (meaning they go for a long time without a page refresh), we wanted to make sure to support memory deallocation for Smart Layers. To support this, Smart Layers provides a <code>destroy()</code> method that allows you to remove all DOM nodes and DOM event listeners it creates. This method will trigger the browser to garbage collect and deallocate the memory used by Smart Layers to other parts of your application.</p>

<p>This brings us to another important topic: <strong>memory consumption</strong>. Smart Layers uses a variety of techniques to make sure that it is taking up as little memory as possible, leaving more for your application. Here are a couple techniques.</p>

<h3>Event Delegation</h3>

<p>Event delegation promotes binding as few DOM event handlers as possible, since each event handler requires memory. For example, let’s say that we have an HTML unordered list we want to bind event handlers to. Instead of binding a click event handler for each list item (which may be hundreds for all we know), we bind one click handler to the parent unordered list itself.</p>

<p>But how does the unordered list click handler get triggered when a child list item is clicked? That’s where event bubbling comes in.</p>

<p><strong>Event bubbling</strong> is the concept that a DOM event is propagated (sent to) to the outer-most elements (parents) all the way up to the root element of the document (e.g. the HTML element). By checking the target property of a JavaScript Event object, we can see what DOM element triggered the current event.</p>

<p>Smart Layers heavily uses event delegation and event bubbling to minimize the number of event handlers that are bound. While testing Smart Layers on mobile devices, there was a noticeable performance improvement when using event delegation instead of direct element binding, since less memory was being used.</p>

<h3>DOM Performance</h3>

<p>Let’s reiterate; <strong>DOM interactions are one of the most memory-expensive actions</strong> a web application can complete.</p>

<p>A common performance pitfall is repeatedly appending DOM elements (causing multiple browser reflows) to the page instead of appending once. With Smart Layers, we only append elements to the DOM when absolutely necessary. For each Layer, we construct all of the HTML that we want as a string, and then append that string to the DOM. This prevents unnecessary browser reflows, which force the browser to re-calculate the layout of the page.</p>

<p>Another best practice that Smart Layers uses to improve performance is <strong>simplified DOM selectors and DOM caching</strong>. If we can select a DOM element using an id, then we do. We also save those elements as instance properties internally, so that we do not need to re-query the DOM again.</p>

<p>For any complicated selectors (not too complicated, mind you), we use <a href="https://github.com/ded/qwery" target="_blank">qwery</a>, a compact, blazing fast CSS selector engine. We are not using <a href="http://sizzlejs.com/" target="_blank">Sizzle</a> (the selector engine used by jQuery) since we are not using jQuery, and we do not need all of the advanced selectors Sizzle provides. A special shout out goes to <a href="https://twitter.com/ded" target="_blank">Dustin Diaz</a>, <a href="https://twitter.com/fat" target="_blank">Jacob Thornton</a>, and <a href="https://twitter.com/rvagg" target="_blank">Rod Vagg</a> for their amazing work on qwery.</p>

<h2>Debouncing High-Rate Events</h2>

<p>Certain JavaScript events are notorious for being triggered at a high rate per second. Examples include the <strong>scroll and resize events</strong>. If you are listening for these DOM events and your event handlers contain performance-intensive actions, you should be <strong>debouncing your event handlers</strong>.</p>

<p>Debouncing an event handler allows you to specify a time (e.g. 500 milleseconds) where you would only like one call to your event handler to execute. For example, if the window scroll event triggers 100 times every 500 milleseconds, your debounced event handler will only get called once (probably the desired behavior). Remember that JavaScript is single threaded (unless you are using web workers, which do not handle DOM-related activities), so if your event handler had executed 100 times repeatedly, it will most likely prevent other logic from executing.</p>

<p>Smart Layers listens to both the resize and scroll events for different reasons, and we make sure to debounce each event to prevent from blocking the UI thread.</p>

<p>One of the cooler features of Smart Layers is our responsive toolset. If you are on a desktop browser and the viewport is less than the size of a tablet browser, we automatically provide our mobile tools (which look better in a small viewport) using the resize event.</p>

<blockquote><p>Why don’t you just use CSS3 media queries instead of listening to the JavaScript resize event?</p></blockquote>


<p>We use CSS3 media queries, in conjunction with the debounced resize event, so that we can allow users to specify which viewport sizes they would like our mobile tools to show up on for desktop browsers. Configurable + good performance = happy users.</p>

<p>If you would like to see example implementations of a debounce method, then check out either <a href="http://underscorejs.org/#debounce" target="_blank">Underscore.js</a> or <a href="http://lodash.com/docs#debounce" target="_blank">Lodash.js</a>.</p>

<h2>Infinite Scrolling</h2>

<p>On mobile browsers, we allow you to scroll through all the possible sharing services that we support. There are hundreds of services, and we are using beautiful, retina-ready, <strong>SVG icons</strong> for each service. To prevent any performance issues, we do not load all of our services at once.</p>

<p>If a user searches for a service, or scrolls to a position on the page where that service should be, then we load the service (and it’s associated icon). This technique allows our users to enjoy beautiful icons, and not get bogged down by any performance issues.</p>

<h2>Responsive Mobile Scrolling</h2>

<p>When testing Smart Layers on mobile browsers, we noticed that scrolling through a large unordered list with a flick of the finger did not send the webpage scrolling. Since we did not feel this was a great user experience, we started to investigate how we could incorporate this <strong>momentum</strong> effect.</p>

<p>We found out that you can add this default behavior on iOS 5 using the <code>-webkit-overflow-scrolling: touch;</code> CSS property. This is great, but what about other platforms/browsers? To support other browsers, we incorporated the popular library, <a href="https://github.com/cubiq/iscroll" target="_blank">iScroll</a>. A big thank you to <a href="https://twitter.com/cubiq" target="_blank">Matteo Spinelli</a> for all of his hard work on iScroll.</p>

<p>We hope that all of these performance best practices baked into Smart Layers pay dividends for you. If you haven’t already tried <a href="https://www.addthis.com/get/smart-layers#.UjjAS2TXhTs" target="_blank">Smart Layers</a>, grab and code and let us know what you think!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Modular jQuery Plugins]]></title>
    <link href="http://gregfranko.com/blog/modular-jquery-plugins/"/>
    <updated>2013-08-22T20:54:00-07:00</updated>
    <id>http://gregfranko.com/blog/modular-jquery-plugins</id>
    <content type="html"><![CDATA[<p>In June 2013, I presented about modular jQuery plugins at the <a href="http://events.jquery.org/2013/portland/">jQuery Portland 2013</a> conference.  You can watch my entire <a href="http://www.youtube.com/watch?v=sC0JJRHuP5M" target="_blank">presentation video</a> and/or check out my full <a href="http://gregfranko.com/modular-jquery-plugins-talk/" target="_blank">slide deck</a>, but let&#8217;s review my talk.</p>

<!-- more -->




<div class="embed-video-container"><iframe src="http://www.youtube.com/embed/sC0JJRHuP5M "></iframe></div>


<h2>What Does Modular Mean to You?</h2>

<p>The term &#8220;modular&#8221; has many different definitions in the JavaScript community.  In the context of this blog post, let&#8217;s establish it as JavaScript logic that is separated from the rest of a codebase, can work independently, and <strong>does one thing and does it well</strong>.</p>

<h2>Why Modular?</h2>

<p><strong>Maintainability</strong>.  It is far easier for developers to understand code that has a <strong>limited scope</strong>.</p>

<h2>Benefits of a Maintainable Codebase</h2>

<p><em>New Contributors</em> - A modular codebase allows new contributors to make improvements/changes straight away, since knowledge of an entire codebase is not required.</p>

<p><em>Core Maintainer</em> - Looking at code you wrote over three months ago might as well have been written by someone else.  You will experience the same learning curve improvement that new contributors experience.</p>

<p><em>Code Reuse</em> - When different parts of an application are separated into standalone modules, it is easier to plugin and play each part wherever you need it.  This drastically decreases the amount of code and code duplication in a codebase.  Less bytes = happier developers.</p>

<p><em>Physical and Emotional Well-Being</em> - Wading through one monolithic file is difficult on the eyes and brain.  Looking at logically-grouped small files is not.</p>

<h2>jQuery Plugins</h2>

<p>Now that we have covered the benefits of a modular codebase, let&#8217;s take a high-level look at a typical jQuery plugin codebase.</p>

<p>Let&#8217;s assume this is a jQuery Tooltip plugin that has been written in one file:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Adding the tooltip method to the jQuery prototype</span>
</span><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">tooltip</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span> <span class="nx">options</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// Boilerplate jQuery plugin code goes here</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>  <span class="c1">// Plugin Constructor</span>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">Tooltip</span><span class="p">()</span> <span class="p">{};</span>
</span><span class='line'>  <span class="c1">// All my plugin logic goes here</span>
</span><span class='line'>  <span class="nx">Tooltip</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>  <span class="c1">//Default Options</span>
</span><span class='line'>  <span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">tooltip</span><span class="p">.</span><span class="nx">options</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>For very small plugins, this code structure will work at first.  Unfortunately, one of the most common problems in software development, <a href="http://en.wikipedia.org/wiki/Feature_creep">feature creep</a>, will demonstrate that this architecture is not scalable.</p>

<blockquote><p>As more features are added to a plugin and the codebase grows, it becomes more difficult to maintain.</p></blockquote>

<h2>How to Become Modular?</h2>

<p>AMD (e.g. Require.js) and CommonJS (e.g. Node.js) are the two most commonly used module formats that allow you to separate your codebase into small reusable pieces.  If you aren&#8217;t using a specific module format, then you need to be aware of inner-file dependencies when separating logic into different files and then bringing them together at build time.</p>

<h2>Can I use AMD with my jQuery Plugin?</h2>

<p>Yes!  You can wrap each JavaScript file in an AMD <code>define()</code> method call, that lists all file dependencies, and then use the Require.js optimizer, <a href="https://github.com/jrburke/r.js/">r.js</a>, and <a href="https://github.com/jrburke/almond">Almond.js</a> to build your library.</p>

<p>This means that you can internally use AMD to build your JavaScript library, while not forcing users to use AMD themselves.</p>

<p>Here is an example Require.js build profile (using Almond.js) to do just that:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="p">({</span>
</span><span class='line'>  <span class="nx">baseUrl</span><span class="o">:</span> <span class="s2">&quot;src/js&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="c1">// Set&#39;s the path name of the first file that will be built</span>
</span><span class='line'>  <span class="nx">paths</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>  <span class="s2">&quot;examplePlugin&quot;</span><span class="o">:</span> <span class="s2">&quot;app/begin&quot;</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="c1">// Makes sure everthing is wrapped in an IIFE (does not expose any global vars)</span>
</span><span class='line'>  <span class="nx">wrap</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>  <span class="c1">// Uses the small AMD shim, Almond.js, instead of Require.js</span>
</span><span class='line'>  <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;../libs/almond&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="c1">// All of your Require.js configurations would go in here</span>
</span><span class='line'>  <span class="nx">mainConfigFile</span><span class="o">:</span> <span class="s2">&quot;app/config/config.js&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">include</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;examplePlugin&quot;</span><span class="p">],</span>
</span><span class='line'>  <span class="c1">// Creates a new minified file</span>
</span><span class='line'>  <span class="nx">out</span><span class="o">:</span> <span class="s2">&quot;js/dist/examplePlugin.min.js&quot;</span>
</span><span class='line'><span class="p">})</span>
</span></code></pre></td></tr></table></div></figure>


<p>This works great, but unfortunately, Almond.js needs to be built into your library&#8217;s source file.  Although Almond.js is a small library (~1kb gzipped and minified), it is not desirable for third-party code to be built inside of your own third-party library.</p>

<p>Recently, jQuery started wrapping all of it&#8217;s <a href="https://github.com/jquery/jquery/tree/master/src">source files</a> in AMD <code>define()</code> method calls.  Instead of including an AMD shim, such as Almond.js, the jQuery team is using regular expression checks, at <a href="https://github.com/jquery/jquery/blob/1.x-master/build/tasks/build.js">build time</a>, to convert all <code>define()</code> method calls into local variables.  This allows the jQuery team to use the benefits of AMD (e.g. dependency management) during development, while not having to include an AMD shim (such as Almond.js) after the jQuery production source file is built.</p>

<p>This is a great idea, but I am looking forward to someone (potentially me) creating <strong>a Grunt plugin that can generically reverse engineer an Almond.js project</strong> at build time and removes any AMD trace.  When this happens, I believe the majority of JavaScript library authors will start incorporating AMD into their workflows.</p>

<h2>How to Make jQuery Plugins Maintainable</h2>

<p>Abstract <strong>boilerplate</strong> code</p>

<p>Make the codebase <strong>modular</strong> (even without Require.js)</p>

<h2>Abstract jQuery Plugin Boilerplate</h2>

<p>There are currently two open-source libraries that help abstract away common jQuery plugin boilerplate code; the <a href="http://api.jqueryui.com/jQuery.widget/">jQueryUI Widget Factory</a> and <a href="https://github.com/gfranko/jqfactory">jqfactory</a>.</p>

<h2>jQueryUI Widget Factory</h2>

<p><a href="http://jqueryui.com" target="_blank" title="jQueryUI"><img class="center" src="http://gregfranko.com/images/jquery_ui_logo_small.gif"></a></p>

<p>Provides a <strong>consistent foundation and API</strong> for building jQuery plugins</p>

<p>Supports <strong>widget inheritance</strong> using functions</p>

<p>Provides common <strong>helper methods</strong></p>

<p>Let&#8217;s us create plugins using <strong>object literals</strong></p>

<p><strong>Can be used independently of jQueryUI</strong></p>

<p><em>Example</em>:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Calling the jQueryUI Widget Factory Method</span>
</span><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">widget</span><span class="p">(</span><span class="s2">&quot;an.example&quot;</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// These options will be used as defaults</span>
</span><span class='line'>  <span class="nx">options</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">someOption</span><span class="o">:</span> <span class="kc">true</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="c1">// Constructor</span>
</span><span class='line'>  <span class="nx">_create</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">internal</span><span class="p">)</span> <span class="p">{}</span>
</span><span class='line'>  <span class="c1">// Custom method we added to our plugin instance</span>
</span><span class='line'>  <span class="nx">customMethod</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{}</span>
</span><span class='line'>  <span class="c1">// The rest of your plugin goes here</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h2>jqfactory</h2>

<p><a href="http://jqueryui.com" target="_blank" title="jQueryUI"><img class="center" src="http://gregfranko.com/images/constructionhat.png"></a></p>

<p>Supports <strong>widget inheritance</strong> using object literals</p>

<p>Provides common <strong>helper methods</strong></p>

<p>Supports <strong>jQuery prototype namespacing</strong></p>

<p>Includes an elegant, promises-based, solution for <strong>asynchronous initializations</strong></p>

<p>Easy event binding support <strong>similar to Backbone.js views</strong></p>

<p><em>Example</em>:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>   <span class="c1">// Calling the jqfactory Method</span>
</span><span class='line'>   <span class="nx">$</span><span class="p">.</span><span class="nx">jqfactory</span><span class="p">(</span><span class="s1">&#39;person.greg&#39;</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// Default plugin options</span>
</span><span class='line'>        <span class="nx">options</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">occupation</span><span class="o">:</span> <span class="s1">&#39;JavaScript Engineer&#39;</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="c1">// Plugin Constructor (called first)</span>
</span><span class='line'>        <span class="nx">_create</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{},</span>
</span><span class='line'>        <span class="c1">// Dom manipulation goes here (called second)</span>
</span><span class='line'>        <span class="nx">_render</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{},</span>
</span><span class='line'>        <span class="c1">// Plugin event bindings (called third)</span>
</span><span class='line'>        <span class="nx">_events</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="s1">&#39;click&#39;</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{}</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="c1">// All event listeners are now bound (called last)</span>
</span><span class='line'>        <span class="nx">_postevents</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{}</span>
</span><span class='line'>    <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Differences Between the jQueryUI Widget Factory and jqfactory</h3>

<p>  <strong>Namespacing</strong></p>

<p>  jqfactory supports jQuery prototype namespacing and the jQueryUI Widget Factory does not.  This means that with jqfactory, you could create a multiple jQuery plugins under a single jQuery name (reducing the possibility of naming collisions).</p>

<p>  <strong>Inheritance</strong></p>

<p>  jqfactory allows widgets to inherit from object literals when the jQueryUI Widget Factory supports inheritance using functions.</p>

<p>  <strong>AMD support</strong></p>

<p>  jqfactory exports itself as a named AMD module (&#8220;jqfactory&#8221;) when the jQueryUI Widget Factory does not currently support AMD (although all jQueryUI files will soon be exported as anonymous AMD modules in a future release).</p>

<p>  <strong>Event Handlers</strong></p>

<p>  jqfactory does not support passing event handlers as options when the jQueryUI Widget Factory does support event handler options.</p>

<p>  <strong>Assumed Environment</strong></p>

<p>  jqfactory does not assume that you are using jQueryUI, when the jQueryUI Widget Factory does (e.g. Expects jQueryUI CSS class names).</p>

<p>  <strong>Syntactic Sugar</strong></p>

<p>  jqfactory provides helpful abstractions in places the widget factory does not.  Examples include event binding, jQuery deferred object support on intialization, and automatic event firing for certain actions (e.g. setting options)</p>

<h2>Separate Our Plugin into Independent Pieces</h2>

<p>From here on out, let&#8217;s assume we are using jqfactory to abstract away our jQuery plugin boilerplate code and are now ready to split up our plugin into separate files.</p>

<h2>Our First jQuery Plugin File</h2>

<p>Let&#8217;s assume that this file will be the first built file and will contain our default plugin options.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// options.js</span>
</span><span class='line'><span class="c1">// ----------</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">example</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'><span class="nx">example</span><span class="p">.</span><span class="nx">options</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">someOption</span><span class="o">:</span> <span class="kc">true</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<h2>On to the Next File</h2>

<p>Let&#8217;s assume that this file will contain our plugin constructor function logic.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// _create.js</span>
</span><span class='line'><span class="c1">// ----------</span>
</span><span class='line'><span class="nx">example</span><span class="p">.</span><span class="nx">_create</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// Our constructor logic goes here</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Can You See the Pattern?</h2>

<p>So far, we are creating a new file for each plugin method.  The reality is that this is a bit overkill, so try to <strong>make logical modular design decisions</strong>.  In other words, try to put methods/features that depend on each other in the same file.  Since we are not using anything that handles dependency management (e.g. Require.js), we are forced to track dependencies ourselves.</p>

<h2>Creating Our Plugin</h2>

<p>Once we are done decoupling our plugin into different files, we can create our plugin using jqfactory.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// _plugin.js</span>
</span><span class='line'><span class="c1">// ----------</span>
</span><span class='line'><span class="c1">// Calling the jqfactory Method</span>
</span><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">jqfactory</span><span class="p">(</span><span class="s2">&quot;an.example&quot;</span><span class="p">,</span> <span class="nx">example</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Building Our Plugin with Grunt</h2>

<p><a href="http://gruntjs.com" target="_blank" title="Grunt.js"><img class="center" src="http://gregfranko.com/images/grunt.png"></a></p>

<p>Since our plugin has been separated into multiple files, we need a command-line tool to build our plugin into one file (for a user to use).  We also want users to be able to exclude certain files from the build to allow custom builds.  This is where <strong>Grunt</strong> comes in.</p>

<h2>What is Grunt?</h2>

<p><a href="http://nodejs.org" target="_blank" title="Node.js"><img class="left" src="http://gregfranko.com/images/nodejs.png"></a>
JavaScript (Node.js) Command-Line Task Runner</p>

<p>Perfect for <strong>automating repetitive tasks</strong></p>

<p>A <strong>huge plugin ecosystem</strong></p>

<h2>Example Grunt Tasks?</h2>

<p>File Concatenation</p>

<p>Minification</p>

<p>Code Quality Checking (e.g. jsHint)</p>

<p>Unit Testing and Phantom.js</p>

<p><strong>SO MUCH MORE</strong></p>

<h2>How Do We Use It?</h2>

<p>We need to create a file, called <strong>Gruntfile.js</strong>, at the root of our project directory.</p>

<h2>Creating Our Gruntfile</h2>

<h3>Step 1</h3>

<p>Inside of Gruntfile.js, we first need to wrap all of our Node.js code inside of a <strong>module.exports</strong> function.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Gruntfile.js</span>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">grunt</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// The rest of our Grunt code will go here!</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Step 2</h3>

<p>Add the configurations for any Grunt plugins/custom tasks you would like to use inside of the <code>initConfig()</code> Grunt method and also call the <code>loadNpmTasks</code> Grunt method for each plugin.  For this example, we are going to use the <a href="https://github.com/gruntjs/grunt-contrib-concat">grunt-contrib-concat</a> and <a href="https://github.com/chrissrogers/grunt-wrap">grunt-wrap</a> plugins.</p>

<p><strong>Note:</strong> Any plugins that start with the <em>grunt-contrib</em> naming convention are Grunt plugins that are maintained by the core Grunt team.  All other plugins are user plugins.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Gruntfile.js</span>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">grunt</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">baseFilePath</span> <span class="o">=</span> <span class="s1">&#39;src/js/&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">fileToBuild</span> <span class="o">=</span> <span class="nx">baseFilePath</span> <span class="o">+</span> <span class="s1">&#39;jquery.customBuild.js&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="c1">// Our Grunt configuration</span>
</span><span class='line'>  <span class="nx">grunt</span><span class="p">.</span><span class="nx">initConfig</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">concat</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">dist</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">src</span><span class="o">:</span> <span class="s1">&#39;&lt;%= customBuild.files %&gt;&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">dest</span><span class="o">:</span> <span class="nx">fileToBuild</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="nx">wrap</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">modules</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">src</span><span class="o">:</span> <span class="p">[</span><span class="nx">fileToBuild</span><span class="p">],</span>
</span><span class='line'>      <span class="nx">wrapper</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;;(function($, undefined) {\n&#39;</span><span class="p">,</span> <span class="s1">&#39;\n}(jQuery));&#39;</span><span class="p">]</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>  <span class="nx">grunt</span><span class="p">.</span><span class="nx">loadNpmTasks</span><span class="p">(</span><span class="s1">&#39;grunt-contrib-concat&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">grunt</span><span class="p">.</span><span class="nx">loadNpmTasks</span><span class="p">(</span><span class="s1">&#39;grunt-wrap&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="c1">// Our custom task will go here next  </span>
</span><span class='line'> <span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>Note:</strong> In the previous code example, you will notice that we had to call the <code>loadNpmTasks()</code> Grunt method for each Grunt plugin we were using.  This can become annoying to do if you are using many Grunt plugins, so you may want to check out the <a href="https://github.com/sindresorhus/load-grunt-tasks">load-grunt-tasks</a> plugin, which allows you to load all Grunt plugins with one line of code.</p>

<h3>Step 3</h3>

<p>Create our very own customBuild <strong>custom Grunt task</strong>.  Our custom task will work together with the other Grunt plugins we are already using (concat, wrap) to allow users to create custom builds of our jQuery plugin.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Gruntfile.js</span>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">grunt</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">baseFilePath</span> <span class="o">=</span> <span class="s1">&#39;src/js/&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">fileToBuild</span> <span class="o">=</span> <span class="nx">baseFilePath</span> <span class="o">+</span> <span class="s1">&#39;jquery.customBuild.js&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="c1">// Our Grunt configuration</span>
</span><span class='line'>  <span class="nx">grunt</span><span class="p">.</span><span class="nx">initConfig</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">concat</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">dist</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">src</span><span class="o">:</span> <span class="s1">&#39;&lt;%= customBuild.files %&gt;&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">dest</span><span class="o">:</span> <span class="nx">fileToBuild</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="nx">wrap</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">modules</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">src</span><span class="o">:</span> <span class="p">[</span><span class="nx">fileToBuild</span><span class="p">],</span>
</span><span class='line'>      <span class="nx">wrapper</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;;(function($, undefined) {\n&#39;</span><span class="p">,</span> <span class="s1">&#39;\n}(jQuery));&#39;</span><span class="p">]</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>  <span class="nx">grunt</span><span class="p">.</span><span class="nx">loadNpmTasks</span><span class="p">(</span><span class="s1">&#39;grunt-contrib-concat&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">grunt</span><span class="p">.</span><span class="nx">loadNpmTasks</span><span class="p">(</span><span class="s1">&#39;grunt-wrap&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="c1">// Our custom task will go here next</span>
</span><span class='line'>  <span class="c1">// Registers a default Grunt Task</span>
</span><span class='line'>  <span class="nx">grunt</span><span class="p">.</span><span class="nx">registerTask</span><span class="p">(</span><span class="s1">&#39;customBuild&#39;</span><span class="p">,</span> <span class="s1">&#39;customBuild task&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">defaultFiles</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;options&#39;</span><span class="p">,</span> <span class="s1">&#39;_create&#39;</span><span class="p">,</span> <span class="s1">&#39;_plugin&#39;</span><span class="p">,</span> <span class="s1">&#39;customMethod&#39;</span><span class="p">],</span>
</span><span class='line'>      <span class="nx">args</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">args</span><span class="p">,</span> <span class="nx">customFiles</span> <span class="o">=</span> <span class="p">[],</span> <span class="nx">index</span><span class="p">,</span> <span class="nx">i</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>    <span class="c1">// Loops through and excludes any file that was passed</span>
</span><span class='line'>    <span class="k">if</span><span class="p">(</span><span class="nx">args</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">while</span><span class="p">(</span><span class="o">++</span><span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">args</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">index</span> <span class="o">=</span> <span class="nx">defaultFiles</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">args</span><span class="p">[</span><span class="nx">i</span><span class="p">]);</span>
</span><span class='line'>        <span class="k">if</span><span class="p">(</span><span class="nx">index</span> <span class="o">!==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="nx">defaultFiles</span><span class="p">.</span><span class="nx">splice</span><span class="p">(</span><span class="nx">index</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="c1">// Makes sure that each passed file has the correct file path</span>
</span><span class='line'>    <span class="nx">customFiles</span> <span class="o">=</span> <span class="nx">defaultFiles</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">currentFile</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">baseFilePath</span> <span class="o">+</span> <span class="nx">currentFile</span> <span class="o">+</span> <span class="s1">&#39;.js&#39;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>    <span class="c1">// Sets a Grunt configuration variable</span>
</span><span class='line'>    <span class="nx">grunt</span><span class="p">.</span><span class="nx">config</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;customBuild.files&#39;</span><span class="p">,</span> <span class="nx">customFiles</span><span class="p">);</span>
</span><span class='line'>    <span class="c1">// Run&#39;s the Grunt concat plugin</span>
</span><span class='line'>    <span class="nx">grunt</span><span class="p">.</span><span class="nx">task</span><span class="p">.</span><span class="nx">run</span><span class="p">(</span><span class="s1">&#39;concat&#39;</span><span class="p">,</span> <span class="s1">&#39;wrap&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Running Grunt</h2>

<p>On the command line, type: <code>grunt customBuild</code>.  This will build all of our plugin files into one file.</p>

<p>If you had wanted to exclude a file from the build (let&#8217;s assume there is an optional customMethod.js file), then you could type: <code>grunt customBuild:customMethod</code></p>

<p><img class="center" src="http://gregfranko.com/images/gruntcustombuild.png"></p>

<p><strong>Success!</strong></p>

<p>By default, any colon-separated arguments passed to our customBuild Grunt task will be mapped to plugin file names and will be not be included in our build.</p>

<h2>Final Thoughts</h2>

<p>JavaScript workflow tools are improving every day and will continue to improve.  Start using these tools today!</p>

<p>Also, if you would like to learn how to create custom web UI builds for your users, then check out the rest of <a href="http://gregfranko.com/modular-jquery-plugins-talk/#32">jQuery Portland Slide Deck</a> that covers my open source library, <a href="http://gregfranko.com/DownloadBuilder.js/">DownloadBuilder.js</a></p>

<p>Happy jQuery plugin building!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Instant Dependency Management with RequireJS]]></title>
    <link href="http://gregfranko.com/blog/instant-dependency-management-with-requirejs/"/>
    <updated>2013-07-21T23:28:00-07:00</updated>
    <id>http://gregfranko.com/blog/instant-dependency-management-with-requirejs</id>
    <content type="html"><![CDATA[<p>In May 2013, Packt Publishing published my Require.js book, <a href="http://www.packtpub.com/dependency-management-with-requirejs-how-to/book">Instant Dependency Management with RequireJS</a>.  This book is perfect for intermediate to advanced JavaScript developers who are interested in learning more about AMD and Require.js.</p>

<!-- more -->


<p><a href="http://www.amazon.com/Instant-Dependency-Management-RequireJS-How/dp/1782169067" target="_blank" title="Instant Dependency Management with RequireJS"><img class="center" src="http://gregfranko.com/images/amd_and_require.jpg"></a></p>

<h2>Topics</h2>

<p>Some of the topics covered include Require.js configurations, creating AMD modules, using third-party libraries with Require.js, the mobile web, Lodash templates, Jasmine unit testing, and r.js (the Require.js optimizer).</p>

<h2>Free Preview</h2>

<p>A <a href="http://my.safaribooksonline.com/book/programming/javascript/9781782169062">free preview</a> and <a href="http://www.packtpub.com/article/using-jQuery-jQueryui-widget-factory-plugins-with-requirejs">sample chapter</a> are both available.  Happy reading!</p>

<p><a href="http://www.amazon.com/Instant-Dependency-Management-RequireJS-How/dp/1782169067" target="_blank" title="Instant Dependency Management with RequireJS"><img class="left" src="http://gregfranko.com/images/requirejsbook.jpg" width="350"></a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[jQuery Best Practices]]></title>
    <link href="http://gregfranko.com/blog/jquery-best-practices/"/>
    <updated>2013-07-20T11:24:00-07:00</updated>
    <id>http://gregfranko.com/blog/jquery-best-practices</id>
    <content type="html"><![CDATA[<p>Back in February 2013, I presented about jQuery best practices at the <a href="http://www.meetup.com/NoVA-Web-Develoment-User-Group/events/101712422/">Nova Web Development User Group</a> meetup.  Let&#8217;s take a moment to review my <a href="http://gregfranko.com/jquery-best-practices/#/" target="_blank">presentation</a>.</p>

<!-- more -->


<p><a href="http://www.meetup.com/NoVA-Web-Develoment-User-Group/events/101712422/" target="_blank"><img class="center" src="http://gregfranko.com/images/novameetup.jpeg"></a></p>

<h2>IIFEs</h2>

<p>IIFEs are an ideal solution for locally scoping global variables/properties and protecting your JavaScript codebase from outside interference (e.g. third-party libraries).  If you are writing jQuery code that will be run in many different environments (e.g. jQuery plugins), then it is important to use an IIFE to locally scope jQuery.</p>

<p><a href="http://gregfranko.com/jquery-best-practices/#/" target="_blank"><img class="center" src="http://gregfranko.com/images/jquery.png"></a></p>

<blockquote><p>You can&#8217;t assume everyone is using the $ to alias jQuery.</p></blockquote>

<p>Here is how you would do it:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>   <span class="c1">// IIFE - Immediately Invoked Function Expression</span>
</span><span class='line'>  <span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">,</span> <span class="nb">window</span><span class="p">,</span> <span class="nb">document</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// The $ is now locally scoped</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// The rest of your code goes here!</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}(</span><span class="nb">window</span><span class="p">.</span><span class="nx">jQuery</span><span class="p">,</span> <span class="nb">window</span><span class="p">,</span> <span class="nb">document</span><span class="p">));</span>
</span><span class='line'>  <span class="c1">// The global jQuery object is passed as a parameter</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you don&#8217;t like having to scroll to the bottom of your source file to see what global variables/properties you are passing to your IIFE, you can do this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>   <span class="c1">// IIFE - Immediately Invoked Function Expression</span>
</span><span class='line'>  <span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">yourcode</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// The global jQuery object is passed as a parameter</span>
</span><span class='line'>      <span class="nx">yourcode</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">jQuery</span><span class="p">,</span> <span class="nb">window</span><span class="p">,</span> <span class="nb">document</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="p">}(</span><span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">,</span> <span class="nb">window</span><span class="p">,</span> <span class="nb">document</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>          <span class="c1">// The rest of your code goes here!</span>
</span><span class='line'>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">));</span>
</span></code></pre></td></tr></table></div></figure>


<p>To read more about IIFEs, you can read my blog post titled, <a href="http://gregfranko.com/blog/i-love-my-iife/">I Love My IIFE</a>.</p>

<h2>Ready Event</h2>

<p>Many developers wrap all of their code inside of the jQuery ready event like this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>   <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;document&quot;</span><span class="p">).</span><span class="nx">ready</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// The DOM is ready!</span>
</span><span class='line'>      <span class="c1">// The rest of your code goes here!</span>
</span><span class='line'>  <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Or developers use a shorter version like this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>   <span class="nx">$</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// The DOM is ready!</span>
</span><span class='line'>      <span class="c1">// The rest of your code goes here!</span>
</span><span class='line'>  <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you are doing either of the above patterns, then you should consider moving the pieces of your application (e.g. methods), that don&#8217;t depend on the DOM, outside of the ready event handler.  Like this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>   <span class="c1">// IIFE - Immediately Invoked Function Expression</span>
</span><span class='line'>  <span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">yourcode</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// The global jQuery object is passed as a parameter</span>
</span><span class='line'>      <span class="nx">yourcode</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">jQuery</span><span class="p">,</span> <span class="nb">window</span><span class="p">,</span> <span class="nb">document</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="p">}(</span><span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">,</span> <span class="nb">window</span><span class="p">,</span> <span class="nb">document</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>          <span class="c1">// The $ is now locally scoped </span>
</span><span class='line'>          <span class="nx">$</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>              <span class="c1">// The DOM is ready!</span>
</span><span class='line'>
</span><span class='line'>          <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>          <span class="c1">// The rest of your code goes here!</span>
</span><span class='line'>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">));</span>
</span></code></pre></td></tr></table></div></figure>


<p>This pattern makes it easier to separate your logic (from a code design perspective) since not everything has to be wrapped inside of a single anonymous function.  It will also improve your application&#8217;s page load performance, since not everything needs to initialized right away.</p>

<h2>Caching DOM selectors</h2>

<p>When manipulating elements in the DOM (e.g. animating, setting attributes, changing CSS properties), it is important to consider performance.</p>

<blockquote><p>Every time you select a DOM element using jQuery, you are instantiating a new jQuery object and forcing jQuery to search the DOM.</p></blockquote>

<p>Instead of creating multiple jQuery instances and forcing jQuery to re-query the DOM for a particular element, you can cache your jQuery object in a variable and reuse it like this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>   
</span><span class='line'>  <span class="c1">// Stores the jQuery instance inside of a variable</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">elem</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#elem&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Set&#39;s an element&#39;s title attribute using it&#39;s current text</span>
</span><span class='line'>  <span class="nx">elem</span><span class="p">.</span><span class="nx">attr</span><span class="p">(</span><span class="s2">&quot;title&quot;</span><span class="p">,</span> <span class="nx">elem</span><span class="p">.</span><span class="nx">text</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Set&#39;s an element&#39;s text color to red</span>
</span><span class='line'>  <span class="nx">elem</span><span class="p">.</span><span class="nx">css</span><span class="p">(</span><span class="s2">&quot;color&quot;</span><span class="p">,</span> <span class="s2">&quot;red&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Makes the element fade out</span>
</span><span class='line'>  <span class="nx">elem</span><span class="p">.</span><span class="nx">fadeOut</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you prefer the previous code snippet to be on one line, you can <strong>chain</strong> multiple jQuery methods together like this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>   <span class="c1">// Stores the live DOM element inside of a variable</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">elem</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#elem&quot;</span><span class="p">);</span>
</span><span class='line'>  
</span><span class='line'>  <span class="c1">// Chaining</span>
</span><span class='line'>  <span class="nx">elem</span><span class="p">.</span><span class="nx">attr</span><span class="p">(</span><span class="s2">&quot;title&quot;</span><span class="p">,</span> <span class="nx">elem</span><span class="p">.</span><span class="nx">text</span><span class="p">()).</span><span class="nx">css</span><span class="p">(</span><span class="s2">&quot;color&quot;</span><span class="p">,</span> <span class="s2">&quot;red&quot;</span><span class="p">).</span><span class="nx">fadeOut</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Adding DOM elements</h2>

<p>Adding elements to the DOM is one of the slowest and most common use cases in a web application.  To limit the performance hit, make sure you are not unneccessarily adding elements to the DOM.</p>

<p>A common example, that can cause web applications to feel janky (or slow), is building a dynamic HTML unordered list.  Since there could potentially be thousands of list items inside of the list, you want to make sure to only append to the DOM once (instead of thousands of times).  Like this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>   <span class="c1">// Dynamically building an unordered list from an array</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">localArr</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;Greg&quot;</span><span class="p">,</span> <span class="s2">&quot;Peter&quot;</span><span class="p">,</span> <span class="s2">&quot;Kyle&quot;</span><span class="p">,</span> <span class="s2">&quot;Danny&quot;</span><span class="p">,</span> <span class="s2">&quot;Mark&quot;</span><span class="p">],</span>
</span><span class='line'>      <span class="nx">list</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;ul.people&quot;</span><span class="p">),</span>
</span><span class='line'>      <span class="nx">dynamicItems</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">$</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="nx">localArr</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">index</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">dynamicItems</span> <span class="o">+=</span> <span class="s2">&quot;&lt;li id=&quot;</span> <span class="o">+</span> <span class="nx">index</span> <span class="o">+</span> <span class="s2">&quot;&gt;&quot;</span> <span class="o">+</span> <span class="nx">value</span> <span class="o">+</span> <span class="s2">&quot;&lt;/li&gt;&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">list</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span><span class="nx">dynamicItems</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>The previous example stores the entire HTML of the dynamic list inside of a local string variable.  Once all the HTML has been created, the list is appended to the page <strong>ONE TIME</strong>.  Many developers mistakingly append to the DOM each time they create a new list item.  <strong>DO NOT DO BE THAT DEVELOPER</strong></p>

<h2>Event Delegation</h2>

<p>DOM event handlers take up a lot of memory and can very easily cause <strong>memory leaks</strong> (and poor performance) in web applications.  We can use an HTML unordered list example to demonstrate how to use <strong>event delegation</strong> to reduce the number of event handlers that we have and the amount of memory our application uses.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>   <span class="kd">var</span> <span class="nx">list</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#longlist&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">list</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s2">&quot;mouseenter&quot;</span><span class="p">,</span> <span class="s2">&quot;li&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">text</span><span class="p">(</span><span class="s2">&quot;Click me!&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">list</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s2">&quot;click&quot;</span><span class="p">,</span> <span class="s2">&quot;li&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">text</span><span class="p">(</span><span class="s2">&quot;Why did you click me?!&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>The previous example uses the jQuery <code>on()</code> method to add <em>mouseenter</em> and <em>click</em> event handlers to an unordered list.  The second argument provided to the <code>on()</code> method is the <strong>event handler context</strong>.  This tells jQuery to trigger the associated unordered list event handler if a list item child element has been the targeted DOM element.</p>

<p>To understand event delegation, we have to understand <strong>event bubbling</strong>.  Event Bubbling is a behavior associated with DOM elements where parent DOM elements (all the way up to the <code>document</code>) are notified of child DOM element events.  Not all DOM events natively <em>bubble</em>, so jQuery has done the heavy lifting and made the event bubbling behavior consistent for every event and browser.</p>

<p>Because of event bubbling, we only have to add one additional event handler to the unordered list (instead of a new event handler for each child list item).  This saves system memory, which allows more memory to be allocated for other intensive operations, such as animations (improving our app&#8217;s perceived performance).</p>

<h2>Ajax</h2>

<p>Since jQuery version 1.5+, the jQuery <code>ajax()</code> method has returned a Promise object.  Using Promises with Ajax allows us to bind multiple callback functions to our request, write flexible code where our ajax handling logic is in a different place than our actual request, and wait for multiple requests to complete before starting an action.</p>

<p>Here is an example of separating the handling logic from the actual request:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>   <span class="kd">function</span> <span class="nx">getName</span><span class="p">(</span><span class="nx">personid</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">dynamicData</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>      <span class="nx">dynamicData</span><span class="p">[</span><span class="s2">&quot;id&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="nx">personID</span><span class="p">;</span>
</span><span class='line'>      <span class="c1">// Returns the jQuery ajax method</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">({</span>
</span><span class='line'>          <span class="nx">url</span><span class="o">:</span> <span class="s2">&quot;getName.php&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">type</span><span class="o">:</span> <span class="s2">&quot;get&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">data</span><span class="o">:</span> <span class="nx">dynamicData</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">getName</span><span class="p">(</span><span class="s2">&quot;2342342&quot;</span><span class="p">).</span><span class="nx">done</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// Updates the UI based the ajax result</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;.person-name&quot;</span><span class="p">).</span><span class="nx">text</span><span class="p">(</span><span class="nx">data</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Our example demonstrates a <code>getName()</code> function that accepts a unique id, sends an ajax request with that unique id, and returns the jQuery <code>ajax()</code> method.  Since our function returns the jQuery <code>ajax()</code> method (which returns a Promise by default), we are able to call the <code>done()</code> method and pass a callback function (which will execute once the request has completed).</p>

<p>If we had wanted to wait for two separate ajax requests to our endpoint, we could have done something like this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>   <span class="kd">function</span> <span class="nx">getName</span><span class="p">(</span><span class="nx">personid</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">dynamicData</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>      <span class="nx">dynamicData</span><span class="p">[</span><span class="s2">&quot;id&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="nx">personID</span><span class="p">;</span>
</span><span class='line'>      <span class="c1">// Returns the jQuery ajax method</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">({</span>
</span><span class='line'>          <span class="nx">url</span><span class="o">:</span> <span class="s2">&quot;getName.php&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">type</span><span class="o">:</span> <span class="s2">&quot;get&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">data</span><span class="o">:</span> <span class="nx">dynamicData</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">person1</span> <span class="o">=</span> <span class="nx">getName</span><span class="p">(</span><span class="s2">&quot;2342342&quot;</span><span class="p">),</span>
</span><span class='line'>      <span class="nx">person2</span> <span class="o">=</span> <span class="nx">getName</span><span class="p">(</span><span class="s2">&quot;3712968&quot;</span><span class="p">),</span>
</span><span class='line'>      <span class="nx">people</span> <span class="o">=</span> <span class="p">[</span><span class="nx">person1</span><span class="p">,</span> <span class="nx">person2</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">$</span><span class="p">.</span><span class="nx">when</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">people</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// Both the ajax requests have completed</span>
</span><span class='line'>  <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>We are using the JavaScript <code>apply()</code> method in the previous example to demonstrate how we can pass an array to the <code>$.when</code> method.  If you do not want to use an array, then you can very easily pass each promise object (stored in a variable) as regular parameters.</p>

<p>Happy jQuerying!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Registering the jQueryUI Widget Factory as an AMD Module]]></title>
    <link href="http://gregfranko.com/blog/registering-the-jqueryui-widget-factory-as-an-amd-module/"/>
    <updated>2013-02-10T09:39:00-08:00</updated>
    <id>http://gregfranko.com/blog/registering-the-jqueryui-widget-factory-as-an-amd-module</id>
    <content type="html"><![CDATA[<p><strong>AMD</strong> (Asynchronous Module Definition) script loaders are fast becoming one of the most popular and important tools for organizing and maintaining JavaScript applications.  Many front-end developers, like myself, are becoming educated on the benefits of using a module system that promotes code reusability/decoupling, freeing the global namespace, dependency script management, and more.</p>

<!-- more -->


<p>Unfortunately, AMD script loaders, such as <a href="http://requirejs.org/">Require.js</a>, are not drop-in solutions.  To use an AMD module system, you must make sure every other JavaScript library used in your application is <em>AMD Compatible</em>.</p>

<h3>AMD Compatible</h3>

<p>For a JavaScript file to be <em>AMD Compatible</em>, the JavaScript content must be wrapped in a <code>define()</code> method and all module (file) dependencies must be listed.</p>

<p>A possible solution is to change the source of each JavaScript file you are using and make sure the content is wrapped inside of a <code>define()</code> method.  This is both time-intensive and error-prone, since you will even have to change the source of third-party libraries that your application is using, such as jQuery.</p>

<p>At this point you may be scratching your head and asking yourself a few questions&#8230;</p>

<!-- more -->


<h3>Common Questions</h3>

<p><strong>Why don&#8217;t third-party libraries automatically wrap their code in a define method?</strong></p>

<p>Third-party libraries, such as jQuery, are often used in many different development environments, and the jQuery team cannot assume that jQuery is being used in an AMD environment.  If jQuery was not being used in an AMD environment, then a syntax error would be thrown complaining that <code>the define method is undefined</code>.</p>

<p>Luckily for us, jQuery and many other popular libraries have found a way to support the AMD API (with the help of the always awesome <a href="https://github.com/jrburke">James Burke</a>)!  When jQuery is executed, it checks to see if an AMD script loader is being used, and then conditionally wraps itself in a <code>define()</code> method and declares itself as a <strong>named AMD module</strong>.</p>

<p><strong>Is there a better way to load a non-AMD Compatible third-party script with Require.js then upgrading the source of a file?</strong>
Yes, with the Require.js v2.0 release, the <code>shim</code> configuration option was added to <em>shim</em> third-party libraries that were not AMD compatible and exported a global object.  You can read more about the <code>shim</code> configuration <a href="http://gregfranko.com/blog/require-dot-js-2-dot-0-shim-configuration/">here</a>.</p>

<p><strong>Does the shim configuration solve all of the AMD Compatibility problems?</strong>
No!  Although the <code>shim</code> configuration works for the most common uses cases, it is still not the ideal approach.  Shimmed third-party scripts cannot be loaded from a CDN after a build, since shimmed files are inlined by the builder and may be executed by Require.js before a CDN asset dependency.  The best approach is making sure a file is wrapped in a <code>define()</code> method (this works with CDN assets).</p>

<h3>jQuery AMD Support</h3>

<p>The first FAQ above mentioned that jQuery supports the AMD API by conditionally wrapping itself in a <code>define()</code> method and declaring itself as <strong>named AMD module</strong>.  Let&#8217;s take a look at the jQuery source to see how they are doing it:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="k">if</span> <span class="p">(</span> <span class="k">typeof</span> <span class="nx">define</span> <span class="o">===</span> <span class="s2">&quot;function&quot;</span> <span class="o">&amp;&amp;</span> <span class="nx">define</span><span class="p">.</span><span class="nx">amd</span> <span class="o">&amp;&amp;</span> <span class="nx">define</span><span class="p">.</span><span class="nx">amd</span><span class="p">.</span><span class="nx">jQuery</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">define</span><span class="p">(</span> <span class="s2">&quot;jquery&quot;</span><span class="p">,</span> <span class="p">[],</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">jQuery</span><span class="p">;</span> <span class="p">}</span> <span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The jQuery code is checking to make sure that a global <code>define()</code> method is on the page, that there is an <code>amd</code> property (object) set on the <code>define</code> method (Remember this is JavaScript and functions act as first-class objects and can have properties), and that the <code>amd</code> object contains a <code>jQuery</code> property that is set to true.  jQuery is essentially checking that an AMD script loader is on the page and that the AMD loader handles the special case when more than one jQuery version is included on the page (this is unfortunately very common).</p>

<p>If an AMD loader satisfies all of the jQuery AMD checks, then jQuery will wrap itself in the global <code>define()</code> method, register itself as a named module (&#8220;jquery&#8221;), and return itself (the jQuery object) within the <code>define()</code> method callback function.</p>

<p><strong>Note:</strong>  Registering <strong>named</strong> AMD modules is usually not recommended, since it hard codes a module id and does not allow you to change the module name, making it inflexible.  The reason most popular third-party libraries register as <strong>named</strong> AMD modules is because many other libraries depend on them, and desire a common name that they can list as a dependency.</p>

<h3>Using jQuery with Require.js</h3>

<p>Now that we know jQuery is AMD compatible, we can easily use jQuery with a Require.js configuration like this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Sample Configuration File</span>
</span><span class='line'><span class="c1">// -------------------------</span>
</span><span class='line'><span class="nx">require</span><span class="p">.</span><span class="nx">config</span><span class="p">({</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Sets the js folder as the base directory for all future relative paths</span>
</span><span class='line'>  <span class="nx">baseUrl</span><span class="o">:</span> <span class="s2">&quot;./js&quot;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// 3rd party script alias names (Easier to type &quot;jquery&quot; than &quot;libs/jquery, etc&quot;)</span>
</span><span class='line'>  <span class="nx">paths</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// Core Libraries</span>
</span><span class='line'>      <span class="c1">// --------------</span>
</span><span class='line'>      <span class="s2">&quot;jquery&quot;</span><span class="o">:</span> <span class="s2">&quot;libs/jquery&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Includes Desktop Specific JavaScript files here (or inside of your Desktop router)</span>
</span><span class='line'><span class="nx">require</span><span class="p">([</span><span class="s2">&quot;jquery&quot;</span><span class="p">],</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Hey look, I&#39;m using jQuery with Require.js!&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Using jQuery Plugins with Require.js</h3>

<p>Although jQuery supports the AMD API, that does not mean that jQuery plugins are also AMD compatible.  Here is how we could load a jQuery plugin that does not support the AMD API:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Sample Configuration File</span>
</span><span class='line'><span class="c1">// -------------------------</span>
</span><span class='line'><span class="nx">require</span><span class="p">.</span><span class="nx">config</span><span class="p">({</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Sets the js folder as the base directory for all future relative paths</span>
</span><span class='line'>  <span class="nx">baseUrl</span><span class="o">:</span> <span class="s2">&quot;./js&quot;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// 3rd party script alias names (Easier to type &quot;jquery&quot; than &quot;libs/jquery, etc&quot;)</span>
</span><span class='line'>  <span class="nx">paths</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// Core Libraries</span>
</span><span class='line'>      <span class="c1">// --------------</span>
</span><span class='line'>      <span class="s2">&quot;jquery&quot;</span><span class="o">:</span> <span class="s2">&quot;libs/jquery&quot;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>      <span class="s2">&quot;example&quot;</span><span class="o">:</span> <span class="s2">&quot;libs/plugins/example&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">shim</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="s2">&quot;example&quot;</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;jquery&quot;</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Includes Desktop Specific JavaScript files here (or inside of your Desktop router)</span>
</span><span class='line'><span class="nx">require</span><span class="p">([</span><span class="s2">&quot;jquery&quot;</span><span class="p">,</span> <span class="s2">&quot;example&quot;</span><span class="p">],</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Hey look, I&#39;m using a jQuery plugin that does not support the AMD API with Require.js!&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>The above code example uses the <code>shim</code> configuration to tell Require.js that the plugin depends on jQuery.  Internally, Require.js waits until jQuery is loaded before it loads the jQuery plugin.</p>

<p>Luckily for plugin authors, a jQuery plugin can internally support the AMD API:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Example plugin</span>
</span><span class='line'><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">factory</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">define</span> <span class="o">===</span> <span class="s1">&#39;function&#39;</span> <span class="o">&amp;&amp;</span> <span class="nx">define</span><span class="p">.</span><span class="nx">amd</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// AMD. Register as an anonymous module.</span>
</span><span class='line'>        <span class="nx">define</span><span class="p">([</span><span class="s1">&#39;jquery&#39;</span><span class="p">],</span> <span class="nx">factory</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// Browser globals</span>
</span><span class='line'>        <span class="nx">factory</span><span class="p">(</span><span class="nx">jQuery</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">jqueryPlugin</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{};</span>
</span><span class='line'><span class="p">}));</span>
</span></code></pre></td></tr></table></div></figure>


<p>This jQuery plugin example checks to make sure an AMD loader is on the page and then registers itself as an <strong>anonymous</strong> AMD module (while also passing the &#8220;jquery&#8221; module as a dependency).  Since jQuery registers itself as a named AMD module, the plugin is able to pass that exact name as a dependency.</p>

<p><strong>Note:</strong> You can find other AMD patterns <a href="https://github.com/umdjs/umd">here</a>;</p>

<p>Here is how you would load the AMD Compatible jQuery plugin with Require.js:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Sample Configuration File</span>
</span><span class='line'><span class="c1">// -------------------------</span>
</span><span class='line'><span class="nx">require</span><span class="p">.</span><span class="nx">config</span><span class="p">({</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Sets the js folder as the base directory for all future relative paths</span>
</span><span class='line'>  <span class="nx">baseUrl</span><span class="o">:</span> <span class="s2">&quot;./js&quot;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// 3rd party script alias names (Easier to type &quot;jquery&quot; than &quot;libs/jquery, etc&quot;)</span>
</span><span class='line'>  <span class="nx">paths</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// Core Libraries</span>
</span><span class='line'>      <span class="c1">// --------------</span>
</span><span class='line'>      <span class="s2">&quot;jquery&quot;</span><span class="o">:</span> <span class="s2">&quot;libs/jquery&quot;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>      <span class="s2">&quot;example&quot;</span><span class="o">:</span> <span class="s2">&quot;libs/plugins/example&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Includes Desktop Specific JavaScript files here (or inside of your Desktop router)</span>
</span><span class='line'><span class="nx">require</span><span class="p">([</span><span class="s2">&quot;jquery&quot;</span><span class="p">,</span> <span class="s2">&quot;example&quot;</span><span class="p">],</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Hey look, I&#39;m using a jQuery plugin with Require.js!&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h3>jQueryUI Widget Factory Plugins</h3>

<p>The above code example is a great solution for jQuery plugins to register themselves as anonymous AMD modules, but let&#8217;s next look at jQuery plugins that depend on both jQuery and the <strong>jQueryUI Widget Factory</strong>.</p>

<p><a href="http://api.jqueryui.com/jQuery.widget/" target="_blank"><img class="center" src="http://gregfranko.com/images/jqueryui.png"></a></p>

<p>In case you are not familiar, the jQueryUI Widget Factory <em>provides a flexible base for building complex, stateful plugins with a consistent API.</em> - per the jQueryUI website.</p>

<p>The Widget Factory is designed not only for plugins that are part of jQuery UI, but for general consumption by developers who want to create object-oriented components without reinventing common infrastructure.</p>

<p>Since more and more jQuery plugin authors, including myself, are using the jQueryUI Widget Factory, it is necessary to understand how to use these jQuery plugins with AMD loaders such as Require.js.</p>

<p>Since the jQueryUI Widget Factory does not support the AMD API, here is how you currently have to load jQuery plugins that depend on the jQueryUI Widget Factory:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Sample Configuration File</span>
</span><span class='line'><span class="c1">// -------------------------</span>
</span><span class='line'><span class="nx">require</span><span class="p">.</span><span class="nx">config</span><span class="p">({</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Sets the js folder as the base directory for all future relative paths</span>
</span><span class='line'>  <span class="nx">baseUrl</span><span class="o">:</span> <span class="s2">&quot;./js&quot;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// 3rd party script alias names (Easier to type &quot;jquery&quot; than &quot;libs/jquery, etc&quot;)</span>
</span><span class='line'>  <span class="nx">paths</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// Core Libraries</span>
</span><span class='line'>      <span class="c1">// --------------</span>
</span><span class='line'>      <span class="s2">&quot;jquery&quot;</span><span class="o">:</span> <span class="s2">&quot;libs/jquery&quot;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>      <span class="s2">&quot;jquery.ui.widget&quot;</span><span class="o">:</span> <span class="s2">&quot;libs/jquery.ui.widget&quot;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>      <span class="s2">&quot;jquery.selectBoxIt&quot;</span><span class="o">:</span> <span class="s2">&quot;libs/plugins/jquery.selectBoxIt&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">shim</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="s2">&quot;jquery.ui.widget&quot;</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;jquery&quot;</span><span class="p">],</span>
</span><span class='line'>
</span><span class='line'>    <span class="s2">&quot;jquery.selectBoxIt&quot;</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;jquery.ui.widget&quot;</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Includes Desktop Specific JavaScript files here (or inside of your Desktop router)</span>
</span><span class='line'><span class="nx">require</span><span class="p">([</span><span class="s2">&quot;jquery&quot;</span><span class="p">,</span> <span class="s2">&quot;jquery.ui.widget&quot;</span><span class="p">,</span> <span class="s2">&quot;jquery.selectBoxIt&quot;</span><span class="p">],</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;select&quot;</span><span class="p">).</span><span class="nx">selectBoxIt</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Hey look, I&#39;m using a jQueryUI Widget Factory plugin with Require.js!&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>The above code uses the <code>shim</code> configuration to shim both the jQueryUI Widget Factory and <a href="https://github.com/gfranko/jquery.selectBoxIt.js">SelectBoxIt</a>, a jQuery plugin based on the jQueryUI Widget Factory.  This works, but requires additional configuration setup and the <code>shim</code> configuration, which prevents the loading of CDN assets after building using the Require.js optimizer.</p>

<p>After experiencing this first hand, I tweeted my desire that the jQueryUI Widget Factory should declare itself as a <strong>named</strong> AMD module, so that plugins (like SelectBoxIt) could list the Widget factory as a dependency and support the AMD API.</p>

<blockquote class="twitter-tweet"><p>@<a href="https://twitter.com/jrburke">jrburke</a> You should convince the jQueryUI devs to declare the Widget Factory as a named module, like jQuery.Lot&#8217;s of plugins depend on it.</p>&mdash; Greg Franko (@GregFranko) <a href="https://twitter.com/GregFranko/status/299184644887306240">February 6, 2013</a></blockquote>


<p>Dave Methvin, the President of the jQuery Foundation, and Scott Gonzalez, the jQueryUI Project lead, (both all around good guys), responded by asking me if James Burke&#8217;s <a href="https://github.com/jrburke/jqueryui-amd">jqueryui-amd</a> project would suit my needs.</p>

<blockquote class="twitter-tweet"><p>@<a href="https://twitter.com/gregfranko">gregfranko</a> Yes, @<a href="https://twitter.com/scott_gonzalez">scott_gonzalez</a> says you&#8217;re taking me on a mandate? Let&#8217;s gobowling. Does <a href="https://t.co/oE5mSOTg" title="https://github.com/jrburke/jqueryui-amd">github.com/jrburke/jquery…</a> work for you? @<a href="https://twitter.com/jrburke">jrburke</a></p>&mdash; Dave Methvin (@davemethvin) <a href="https://twitter.com/davemethvin/status/299595913150726145">February 7, 2013</a></blockquote>




<blockquote class="twitter-tweet"><p>@<a href="https://twitter.com/scott_gonzalez">scott_gonzalez</a> @<a href="https://twitter.com/davemethvin">davemethvin</a> @<a href="https://twitter.com/jrburke">jrburke</a> I&#8217;ll write a blog post and let you know when it is done.</p>&mdash; Greg Franko (@GregFranko) <a href="https://twitter.com/GregFranko/status/299613588459495424">February 7, 2013</a></blockquote>


<p>If you are not familiar with James Burke&#8217;s <a href="https://github.com/jrburke/jqueryui-amd">jqueryui-amd</a> project, it is a Node.js command line project that will automatically wrap jQueryUI modules within <code>define()</code> methods and pass jQuery as a dependency, thus making jQueryUI <em>AMD Compatible</em>:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">define</span><span class="p">([</span><span class="s1">&#39;jquery&#39;</span><span class="p">],</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">jQuery</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// jQueryUI code goes here</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is a great solution if you are only using jQueryUI plugins (i.e. Calendar widget, etc), but not such a great solution for third-party plugin authors, like myself, who are using the jQueryUI Widget Factory as the base for our plugin structures.</p>

<p>Here is how you would load a jQueryUI Widget Factory plugin with Require.js, when using the <strong>jqueryui-amd</strong> project:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Sample Configuration File</span>
</span><span class='line'><span class="c1">// -------------------------</span>
</span><span class='line'><span class="nx">require</span><span class="p">.</span><span class="nx">config</span><span class="p">({</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Sets the js folder as the base directory for all future relative paths</span>
</span><span class='line'>  <span class="nx">baseUrl</span><span class="o">:</span> <span class="s2">&quot;./js&quot;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// 3rd party script alias names (Easier to type &quot;jquery&quot; than &quot;libs/jquery, etc&quot;)</span>
</span><span class='line'>  <span class="nx">paths</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// Core Libraries</span>
</span><span class='line'>      <span class="c1">// --------------</span>
</span><span class='line'>      <span class="s2">&quot;jquery&quot;</span><span class="o">:</span> <span class="s2">&quot;libs/jquery&quot;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>      <span class="s2">&quot;jquery.ui.widget&quot;</span><span class="o">:</span> <span class="s2">&quot;libs/jquery.ui.widget&quot;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>      <span class="s2">&quot;jquery.selectBoxIt&quot;</span><span class="o">:</span> <span class="s2">&quot;libs/plugins/jquery.selectBoxIt&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">shim</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Shimming SelectBoxIt by telling Require.js that the plugin depends on the jQueryUI Widget Factory</span>
</span><span class='line'>    <span class="s2">&quot;jquery.selectBoxIt&quot;</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;jquery.ui.widget&quot;</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Includes Desktop Specific JavaScript files here (or inside of your Desktop router)</span>
</span><span class='line'><span class="nx">require</span><span class="p">([</span><span class="s2">&quot;jquery&quot;</span><span class="p">,</span> <span class="s2">&quot;jquery.ui.widget&quot;</span><span class="p">,</span> <span class="s2">&quot;jquery.selectBoxIt&quot;</span><span class="p">],</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;select&quot;</span><span class="p">).</span><span class="nx">selectBoxIt</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Hey look I&#39;m using a jQueryUI Widget Factory plugin with Require.js!&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the above code example, you&#8217;ll notice that jQueryUI Widget Factory no longer needs to use the shim configuration, since the <strong>jqueryui-amd</strong> project has wrapped it within a <code>define()</code> method.  Unfortunately, the SelectBoxIt plugin still needs to be shimmed, since it is not AMD compatible.</p>

<p>By now you may be thinking, couldn&#8217;t you just support the AMD API within SelectBoxIt by doing this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="p">;(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">selectBoxIt</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">define</span> <span class="o">===</span> <span class="s2">&quot;function&quot;</span> <span class="o">&amp;&amp;</span> <span class="nx">define</span><span class="p">.</span><span class="nx">amd</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// AMD. Register as an anonymous module.</span>
</span><span class='line'>        <span class="nx">define</span><span class="p">([</span><span class="s2">&quot;jquery&quot;</span><span class="p">,</span> <span class="s2">&quot;jquery.ui.widget&quot;</span><span class="p">],</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="nx">selectBoxIt</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">jQuery</span><span class="p">,</span> <span class="nb">window</span><span class="p">,</span> <span class="nb">document</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// Browser globals</span>
</span><span class='line'>        <span class="nx">selectBoxIt</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">jQuery</span><span class="p">,</span> <span class="nb">window</span><span class="p">,</span> <span class="nb">document</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">$</span><span class="p">,</span> <span class="nb">window</span><span class="p">,</span> <span class="nb">document</span><span class="p">,</span> <span class="kc">undefined</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// SelectBoxIt code goes here</span>
</span><span class='line'>
</span><span class='line'><span class="p">}));</span> <span class="c1">// End of all modules</span>
</span></code></pre></td></tr></table></div></figure>


<p>Technically yes, I could conditionally support the AMD API by using the above code.  The problem is that it would be a very confusing process for plugin users, since I would have to point them to the <strong>jqueryui-amd</strong> project, which is not trivial to set up.  Or I could maintain an up-to-date AMD Compatible version of the jQueryUI Widget Factory. Not an ideal process.</p>

<p>It would be much easier to tell users to create a Require.js path called, &#8220;jquery.ui.widget&#8221;, and be done with it!</p>

<h2>Upgrading the jQueryUI Widget Factory</h2>

<p>Following the lead of jQuery, I believe the jQueryUI Widget Factory should support the AMD API by registering as a named AMD module that Widget Factory plugins can declare as a dependency:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="p">;(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">widgetFactory</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">define</span> <span class="o">===</span> <span class="s2">&quot;function&quot;</span> <span class="o">&amp;&amp;</span> <span class="nx">define</span><span class="p">.</span><span class="nx">amd</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// AMD. Register as an anonymous module.</span>
</span><span class='line'>        <span class="nx">define</span><span class="p">(</span> <span class="s2">&quot;jquery.ui.widget&quot;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;jquery&quot;</span><span class="p">],</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="nx">widgetFactory</span><span class="p">(</span> <span class="nb">window</span><span class="p">.</span><span class="nx">jQuery</span> <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">}</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// Browser globals</span>
</span><span class='line'>        <span class="nx">widgetFactory</span><span class="p">(</span> <span class="nb">window</span><span class="p">.</span><span class="nx">jQuery</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="p">(</span><span class="kd">function</span><span class="p">(</span> <span class="nx">$</span><span class="p">,</span> <span class="kc">undefined</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// jQuery Widget Factory code goes here</span>
</span><span class='line'>
</span><span class='line'><span class="p">}));</span>
</span></code></pre></td></tr></table></div></figure>


<p>I have listed &#8220;jquery.ui.widget&#8221; to be the default name of the Widget Factory, but that is only my personal opinion and may be subject to change.  If this change is put into the jQueryUI Widget Factory, then the thousands of plugins that are based on it (probably more), could easily support the AMD API.  This means that no Require.js configurations/extra steps would be necessary for you to use a jQuery plugin based on the Widget Factory.</p>

<p><strong>Note:</strong> Check out this <a href="https://gist.github.com/gfranko/4750778">gist</a> to see the full source of the AMD Compatible jQueryUI Widget Factory that I am proposing.</p>

<h2>Final Thoughts</h2>

<p>It only takes a couple lines of code to support the AMD API, so I feel that the jQueryUI Widget Factory should follow in the footsteps of its parent&#8217;s favorite child, jQuery, and just do it (I am not sponsored by Nike).  I&#8217;d love to hear your thoughts!  Happy AMD&#8217;ing!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Backbone-Require-Boilerplate Explained]]></title>
    <link href="http://gregfranko.com/blog/backbone-require-boilerplate-explained/"/>
    <updated>2013-01-05T15:53:00-08:00</updated>
    <id>http://gregfranko.com/blog/backbone-require-boilerplate-explained</id>
    <content type="html"><![CDATA[<p><a href="https://github.com/BoilerplateMVC/Backbone-Require-Boilerplate">Backbone-Require-Boilerplate</a> is a popular open-source boilerplate library that I created to help promote best practices when using Backbone.js with Require.js.</p>

<!-- more -->


<p><a href="https://github.com/BoilerplateMVC/Backbone-Require-Boilerplate" target="_blank"><img class="center" src="http://gregfranko.com/images/rubik.png"></a></p>

<p>In the video, I walk through each boilerplate file, and explain in-depth how the library helps you create more maintainable applications.  Enjoy!</p>

<div class="embed-video-container"><iframe src="http://www.youtube.com/embed/L_kqGJmc1rY "></iframe></div>


<p>If you are also interested in incorporating the Backbone Marionette library into your stack, check out the <a href="https://github.com/BoilerplateMVC/Marionette-Require-Boilerplate" target="_blank">Marionette-Require-Boilerplate</a>. Happy boilerplating!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[I Love My IIFE]]></title>
    <link href="http://gregfranko.com/blog/i-love-my-iife/"/>
    <updated>2013-01-05T14:29:00-08:00</updated>
    <id>http://gregfranko.com/blog/i-love-my-iife</id>
    <content type="html"><![CDATA[<p>An <strong>IIFE</strong>, or <a href="http://benalman.com/news/2010/11/immediately-invoked-function-expression/">Immediately Invoked Function Expression</a>, is a common JavaScript design pattern used by most popular libraries (jQuery, Backbone.js, Modernizr, etc) to place all library code inside of a local scope.</p>

<!-- more -->


<p><a href="blog/i-love-my-iife"><img class="center" src="http://gregfranko.com/images/JavaScript-logo-small.png"></a></p>

<p>In the words of <a href="http://james.padolsey.com/javascript/iife-argument-madness/">James Padolsey</a>:</p>

<blockquote><p>An IIFE protects a module&#8217;s scope from the environment in which it is placed.</p></blockquote>

<p>There are more benefits to using IIFE&#8217;s than just local scoping, but before we talk about some of the other benefits, let&#8217;s take a look at some code to see how to create a basic IIFE:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="p">(</span><span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>  <span class="c1">// my special code</span>
</span><span class='line'><span class="p">}());</span>
</span></code></pre></td></tr></table></div></figure>


<p>The above <strong>IFFE</strong> is just an anonymous function (no name attached to it) that is wrapped inside of a set of parentheses and called (invoked) immediately.  Let&#8217;s break this down step by step.</p>

<h3>The Anonymous Function:</h3>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Anonymous function</span>
</span><span class='line'><span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>  <span class="c1">// my special code</span>
</span><span class='line'><span class="p">}();</span> <span class="c1">// The parentheses make sure the anonymous function gets called immediately</span>
</span></code></pre></td></tr></table></div></figure>


<p>A function, without a name, is created and then called (invoked) immediately via the <code>()</code> at the very end.</p>

<h3>The Parentheses</h3>

<p>You might be wondering why we need to wrap the immediately invoked anonymous function inside of parentheses.  Before I explain why, try the above code inside of a console window.  Get a syntax error?</p>

<p>By wrapping the anonymous function inside of parentheses, the JavaScript parser knows to treat the anonymous function as a function expression instead of a function declaration.  A function expression can be called (invoked) immediately by using a set of parentheses, but a function declaration cannot be.</p>

<!-- more -->


<p><strong>Note</strong>: In case you forget the difference between JavaScript function expressions and function declarations:</p>

<p><em>Function Expression</em> - <code>var test = function() {};</code></p>

<p><em>Function Declaration</em> - <code>function test() {};</code></p>

<p>Since the anonymous function within our IIFE is a function expression and is not being assigned to a global variable, no global property is being created, and all of the properties created inside of the function expression are scoped locally to the expression itself.</p>

<h3>Other Benefits of using an IIFE</h3>

<p>Whew, now that we understand the basic concept of an IIFE, let&#8217;s determine some other benefits of using them in your code.</p>

<h4>Reduce scope lookups</h4>

<p>A small performance benefit of using IIFE&#8217;s is the ability to pass commonly used global objects (window, document, jQuery, etc) to an IIFE&#8217;s anonymous function, and then reference these global objects within the IIFE via a local scope.</p>

<p><strong>Note</strong>: JavaScript first looks for a property in the local scope, and then it goes all the way up the chain, last stopping at the global scope.  Being able to place global objects in the local scope provides faster internal lookup speeds and performance.</p>

<p>Let&#8217;s look at a code example of passing global objects to an IIFE:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Anonymous function that has three arguments</span>
</span><span class='line'><span class="kd">function</span><span class="p">(</span><span class="nb">window</span><span class="p">,</span> <span class="nb">document</span><span class="p">,</span> <span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// You can now reference the window, document, and jQuery objects in a local scope</span>
</span><span class='line'>
</span><span class='line'><span class="p">}(</span><span class="nb">window</span><span class="p">,</span> <span class="nb">document</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">jQuery</span><span class="p">);</span> <span class="c1">// The global window, document, and jQuery objects are passed into the anonymous function</span>
</span></code></pre></td></tr></table></div></figure>


<h4>Minification Optimization</h4>

<p>Another small performance benefit of using IIFE&#8217;s is that it helps with minification optimization.  Since we are able to pass global objects into the anonymous function as local values (parameters), a minifier is able to reduce the name of each global object to a one letter word (as long as you don&#8217;t already have a variable of the same name).  Let&#8217;s look at the above code sample after minification:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Anonymous function that has three arguments</span>
</span><span class='line'><span class="kd">function</span><span class="p">(</span><span class="nx">w</span><span class="p">,</span> <span class="nx">d</span><span class="p">,</span> <span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// You can now reference the window, document, and jQuery objects in a local scope</span>
</span><span class='line'>
</span><span class='line'><span class="p">}(</span><span class="nb">window</span><span class="p">,</span> <span class="nb">document</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">jQuery</span><span class="p">);</span> <span class="c1">// The global window, document, and jQuery objects are passed into the anonymous function</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>Note</strong>:  Another added benefit (when using jQuery), is that you can freely use the <code>$</code> without worrying about other library conflicts, since you passed in the global <code>jQuery</code> object and scoped it to the <code>$</code> as a local parameter.</p>

<h3>Readability</h3>

<p>One of the con&#8217;s with using IIFE&#8217;s is readability.  If you have a lot of JavaScript code inside of an IIFE, and you want to find the parameters that you are passing into an IIFE, then you need to scroll all the way to the bottom of the page.  Luckily, there is a more readable pattern that I have begun to use:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">library</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Calls the second IIFE and locally passes in the global jQuery, window, and document objects</span>
</span><span class='line'>    <span class="nx">library</span><span class="p">(</span><span class="nb">window</span><span class="p">,</span> <span class="nb">document</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">jQuery</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Locally scoped parameters </span>
</span><span class='line'><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nb">window</span><span class="p">,</span> <span class="nb">document</span><span class="p">,</span> <span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Library code goes here</span>
</span><span class='line'>
</span><span class='line'><span class="p">}));</span>
</span></code></pre></td></tr></table></div></figure>


<p>This IIFE pattern allows you see what global objects you are passing into your IIFE, without you having to scroll to the very bottom of a potentially very long file.  Happy IIFE&#8217;ing!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Backbone.validateAll plugin]]></title>
    <link href="http://gregfranko.com/blog/backbone-dot-validateall-plugin/"/>
    <updated>2012-09-18T14:56:00-07:00</updated>
    <id>http://gregfranko.com/blog/backbone-dot-validateall-plugin</id>
    <content type="html"><![CDATA[<p><strong><a href="https://github.com/gfranko/Backbone.validateAll">Backbone.validateAll</a></strong> is a small Backbone.js plugin that provides an option to only validate Model properties that are currently being set or saved.</p>

<!-- more -->


<p><img class="center" src="http://gregfranko.com/images/backbone.png"></p>

<h3>Background</h3>

<p><em>Backbone.validateAll</em> originated from a failed Backbone.js <a href="https://github.com/documentcloud/backbone/pull/1595">pull request</a>.  The original pull request was created because of frustration with using the Backbone.js Model validate method when validating HTML forms.</p>

<h3>Backbone.js v0.9.1 Changes</h3>

<p>Since Backbone.js v0.9.1 and greater, Backbone Model validation was not made to elegantly handle form validation, since the default validate method will validate all Model attributes, regardless of what particular attribute is being set or saved. For certain use cases, it is necessary to only validate a certain Model property (or form field) without worrying about the validation of any other Model property (or form field).</p>

<h3>Performance!</h3>

<p>Backbone core contributor, <a href="https://github.com/braddunbar">@braddunbar</a>, presented a possible solution for this use case in the above mentioned <a href="https://github.com/documentcloud/backbone/pull/1595">pull request</a>, but it still involved calling all of the validation methods within the <code>validate()</code> method, which can negatively affect performance.</p>

<p>Here is a <a href="http://jsperf.com/backbone-validateall">jsPerf Test</a> showing the performance benefits when setting Backbone Model attributes with and without <em>Backbone.validateAll</em>.</p>

<!-- more -->


<h3>Who Should Use This</h3>

<p>Anyone who wants an <strong>option</strong> to validate only Model properties that are currently being set/saved instead of the entire Model.  An obvious use case for this is form validation.</p>

<p><strong>Note</strong>: The plugin does not override the default Backbone.js Model validation behavior (all Model attributes are validated whenever an attribute is saved/set on a Model) by default.  You need to pass the <strong>validateAll</strong> option when setting/saving Model attributes.</p>

<h3>Is it easy to use the plugin?</h3>

<p>Yes!  You just have to pass the validateAll option when setting/saving a Model attribute.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>    <span class="c1">// The validateAll option makes sure that only the Model attributes that you are setting get passed to the validate method</span>
</span><span class='line'>    <span class="nx">user</span><span class="p">.</span><span class="nx">set</span><span class="p">({</span> <span class="s2">&quot;firstname&quot;</span><span class="o">:</span> <span class="s2">&quot;Greg&quot;</span> <span class="p">},</span> <span class="p">{</span><span class="nx">validateAll</span><span class="o">:</span> <span class="kc">false</span><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Summary</h3>

<p>If you have found yourself frustrated about Backbone&#8217;s default Model validation behavior, then this plugin is a perfect fit.  You can also read more about this plugin in Addy Osmani&#8217;s <a href="http://addyosmani.github.com/backbone-fundamentals/">Backbone Fundamentals</a> book under the section titled <strong>Better Model Property Validation</strong>.  Happy Model validating!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Documenting Your Open Source Projects]]></title>
    <link href="http://gregfranko.com/blog/documenting-your-open-source-projects/"/>
    <updated>2012-09-18T10:14:00-07:00</updated>
    <id>http://gregfranko.com/blog/documenting-your-open-source-projects</id>
    <content type="html"><![CDATA[<p>Popular Open Source (OS) projects are self promoted by their easy to read, organized, and exhaustive documentation.  Great examples include Backbone.js, Can.js, jQuery++, Underscore.js, jQuery, HTML5 Boilerplate, Require.js, Twitter Bootstrap, and many more.</p>

<!-- more -->


<p><img class="center" src="http://gregfranko.com/images/opensource.png"></p>

<p>These projects realize that users expect their documentation to follow a common format that includes a table of contents that houses, at the very least, a <em>Getting Started</em> guide, a <em>Demos/Examples</em> section, and a <em>forum</em> section to ask questions.  Additional sections (ie. <em>annotated source code</em>, <em>Contributor Guide</em>) targeting potential core project contributors may also be included.</p>

<p>All OS developers should take note of these documentation practices and follow them when promoting their own projects.  When patrolling Github to find new and interesting projects, I often find myself dismissing a project right away if there is a lack of documentation.</p>

<blockquote><p>The project could have the most readable, brilliant, and performant code known to man, yet I (and many other developers) would never know</p></blockquote>

<h3>But Documentation Takes Too Long to Write!</h3>

<p>It&#8217;s true, documenting your project may take longer than writing the project code itself.  But there are open source tools that can help expediate the process&#8230;</p>

<!-- more -->


<h4><a href="http://gregfranko.com/jquery.tocify.js/">Tocify.js</a> - a jQuery plugin</h4>

<p>Tocify is &#8220;a jQuery plugin that dynamically generates a table of contents (TOC). Tocify can be optionally styled with Twitter Bootstrap or jQueryUI Themeroller, and optionally animated with jQuery show/hide effects&#8221;.</p>

<p>Tocify also optionally provides support for smooth scrolling, scroll highlighting, scroll page extending, and the HTML5 pushstate API via History.js.</p>

<p>Tocify works by looking at all of the header elements on an HTML page and constructing a TOC based on the page structure.  Tocify was inspired by the Can.js and jQuery++ documentation created by <a href="http://bitovi.com/">Bitovi</a>, so it allows you to have complex nested TOC structures along with slick show/hide effects.</p>

<h4><a href="http://gregfranko.com/Document-Bootstrap/">Document-Bootstrap</a> - a Boilerplate Project</h4>

<p>Document-Bootstrap is &#8220;a boilerplate project that incorporates JavaScript libraries, jQuery plugins, and Twitter Bootstrap to save developers time when creating project pages and providing users with custom project builds&#8221;.</p>

<p>Document-Bootstrap serves as a great starting point for creating a OS project page.  Document-Bootstrap allows you to stop worrying about the design of your project page and instead focus on the content.</p>

<p><strong>Note:</strong> Document-Bootstrap includes Tocify</p>

<h4><a href="http://jashkenas.github.com/docco/">Docco</a> - an Annotated Source Code Generator</h4>

<p>Docco &#8220;produces HTML that displays your comments alongside your code. Comments are passed through Markdown, and code is passed through Pygments syntax highlighting.&#8221;</p>

<p>As long as your codebase adheres to <a href="http://daringfireball.net/projects/markdown/">Markdown</a> standards, Docco will automatically create an annotated source code HTML page for your project.  Annotated source code is much cleaner and easier to read than regular source code, in my opinion.</p>

<p><strong>Note:</strong> Docco can be used to process CoffeeScript, JavaScript, Ruby, Python, or TeX files</p>

<h4>Summary</h4>

<p>I find that as a developer I read more documentation than I write code.  Please help my eyes by creating awesome documentation.  Happy documenting!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Creating Custom Project Builds with DownloadBuilder.js]]></title>
    <link href="http://gregfranko.com/blog/creating-custom-project-builds-with-downloadbuilder-dot-js/"/>
    <updated>2012-09-17T14:52:00-07:00</updated>
    <id>http://gregfranko.com/blog/creating-custom-project-builds-with-downloadbuilder-dot-js</id>
    <content type="html"><![CDATA[<p>Many of the most popular Open Source (OS) projects understand that flexibility and performance is very important for users.  Since it is nearly impossible to create a project that is a perfect fit for all users, many OS projects provide a custom build option.  This allows users to specify which parts of a project he/she wants and then download only those parts (thus minimizing file size).</p>

<!-- more -->


<p><img class="center" src="http://gregfranko.com/images/html5.png"></p>

<p><em>Examples of popular OS projects that are providing custom build options now include jQuery (recent addition in version 1.8), jQueryUI, Modernizr, Twitter Bootstrap, Can.js, etc.</em></p>

<p>After reviewing the custom build processes of the above OS projects, it seemed that each project had developed its own custom back-end build process from scratch.  This architecture seemed to work well for projects with many contributors/organizational backing, but I wanted an easy solution that I could use for my own OS projects where I was the only main contributor.  Since I could not find any existing OS projects that fit the bill, I created <strong>DownloadBuilder.js</strong>.</p>

<h3>DownloadBuilder.js</h3>

<h4>Description</h4>

<p><a href="http://gregfranko.com/DownloadBuilder.js/">DownloadBuilder.js</a> is a JavaScript library that uses the HTML5 Filesystem API to create concatenated single file custom builds for front-end projects.  Since the project uses the HTML5 Filesystem API, all of its features only currently work in Chrome 21+, although it can still be used in all other modern browsers(Firefox, IE8+) to create a generated concatenated project file.</p>

<h4>Getting Started</h4>

<p><strong>Note:</strong> DownloadBuilder.js expects your project to be decoupled and split into separate files (modular approach).</p>

<p>Download the <a href="https://github.com/gfranko/DownloadBuilder.js/zipball/master">entire project</a> from Github and look at the examples in the <em>demos</em> folder.</p>

<h4>Include DownloadBuilder.js</h4>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>    // DownloadBuilder.js
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;DownloadBuilder.js&quot;</span> <span class="nt">/&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<h5>HTML</h5>

<p>Create one checkbox for each file in your project that you want to allow users to download. Each checkbox value should be the full file path.</p>

<p><strong>Note:</strong> You can use Github or local relative file paths. This example uses Github to download your project files.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>    // A checkbox with the correct Github filepath of testfile.js
</span><span class='line'>    <span class="nt">&lt;label</span> <span class="na">class=</span><span class="s">&quot;checkbox&quot;</span><span class="nt">&gt;&lt;input</span> <span class="na">checked=</span><span class="s">&quot;checked&quot;</span> <span class="na">type=</span><span class="s">&quot;checkbox&quot;</span> <span class="na">value=</span><span class="s">&quot;src/javascripts/testfile.js&quot;</span><span class="nt">&gt;</span>Test File<span class="nt">&lt;/label&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<h5>JavaScript</h5>

<p>Using a library (eg. jQuery) or regular JavaScript, create a new DownloadBuilder object instance with custom options when the DOM is ready.</p>

<p><strong>Note:</strong> You do not need to use a library, such as jQuery. I am using it here for convenience. Also, all options are optional and more documentation about all of the options can be found in the documentation.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>    <span class="c1">//Executes your code when the DOM is ready.  Acts the same as $(document).ready().</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// All options passed to the DownloadBuilder object constructor are optional</span>
</span><span class='line'>        <span class="c1">// This example is a sample Github setup</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">builder</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">DownloadBuilder</span><span class="p">({</span> <span class="s2">&quot;location&quot;</span><span class="o">:</span> <span class="s2">&quot;github&quot;</span><span class="p">,</span> <span class="s2">&quot;author&quot;</span><span class="o">:</span> <span class="s2">&quot;gfranko&quot;</span><span class="p">,</span> <span class="s2">&quot;repo&quot;</span><span class="o">:</span> <span class="s2">&quot;jquery.selectboxit.js&quot;</span><span class="p">,</span> <span class="s2">&quot;branch&quot;</span><span class="o">:</span> <span class="s2">&quot;dev&quot;</span> <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next, create an event handler for when you want to create your custom built file, call the <code>buildURL()</code> method to construct a file url (if supported), and then create custom logic once your custom built file has been created (the file is passed into the buildURL callback function).</p>

<p><strong>Note:</strong> More documentation about the buildURL method and other methods can be found in the documentation.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>    <span class="c1">// Whenever an element with an id of javascript-generate is clicked, the buildURL() method is called</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#javascript-generate&quot;</span><span class="p">).</span><span class="nx">on</span><span class="p">(</span><span class="s2">&quot;click&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Pass in all of the checkboxes that should be used to download files, the desired name of the file to be created,</span>
</span><span class='line'>        <span class="c1">// the type of file to be created, and a callback function</span>
</span><span class='line'>        <span class="nx">builder</span><span class="p">.</span><span class="nx">buildURL</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#javascript-downloads input[type=&#39;checkbox&#39;]:checked&quot;</span><span class="p">),</span> <span class="s2">&quot;example.js&quot;</span><span class="p">,</span> <span class="s2">&quot;javascript&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// An object is passed to the callback function which contains a file url</span>
</span><span class='line'>            <span class="c1">// (if the current browser supports the HTML5 Filesystem API), file content (the text of the file),</span>
</span><span class='line'>            <span class="c1">// the name of the file that was created, and the type of file that was created.</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Put any custom logic here</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Below is the full <strong>DownloadBuilder.js</strong> example:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>    <span class="c1">//Executes your code when the DOM is ready.  Acts the same as $(document).ready().</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// All options passed to the DownloadBuilder object constructor are optional</span>
</span><span class='line'>        <span class="c1">// This example is a sample Github setup</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">builder</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">DownloadBuilder</span><span class="p">({</span> <span class="s2">&quot;location&quot;</span><span class="o">:</span> <span class="s2">&quot;github&quot;</span><span class="p">,</span> <span class="s2">&quot;author&quot;</span><span class="o">:</span> <span class="s2">&quot;gfranko&quot;</span><span class="p">,</span> <span class="s2">&quot;repo&quot;</span><span class="o">:</span> <span class="s2">&quot;jquery.selectboxit.js&quot;</span><span class="p">,</span> <span class="s2">&quot;branch&quot;</span><span class="o">:</span> <span class="s2">&quot;dev&quot;</span> <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Whenever an element with an id of javascript-generate is clicked, the buildURL() method is called</span>
</span><span class='line'>        <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#javascript-generate&quot;</span><span class="p">).</span><span class="nx">on</span><span class="p">(</span><span class="s2">&quot;click&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Pass in all of the checkboxes that should be used to download files, the desired name of the file to be created,</span>
</span><span class='line'>            <span class="c1">// the type of file to be created, and a callback function</span>
</span><span class='line'>            <span class="nx">builder</span><span class="p">.</span><span class="nx">buildURL</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#javascript-downloads input[type=&#39;checkbox&#39;]:checked&quot;</span><span class="p">),</span> <span class="s2">&quot;example.js&quot;</span><span class="p">,</span> <span class="s2">&quot;javascript&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>                <span class="c1">// An object is passed to the callback function which contains a file url</span>
</span><span class='line'>                <span class="c1">// (if the current browser supports the HTML5 Filesystem API), file content (the text of the file),</span>
</span><span class='line'>                <span class="c1">// the name of the file that was created, and the type of file that was created.</span>
</span><span class='line'>
</span><span class='line'>                <span class="c1">// Put any custom logic here</span>
</span><span class='line'>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Summary</h3>

<p><a href="https://github.com/gfranko/DownloadBuilder.js">DownloadBuilder.js</a> is a great fit for small OS projects that are only worried about creating a single file custom build.  If there is a feature that you would like to see added to DownloadBuilder.js, feel free to create an issue or fork the project the project on Github.  Happy custom building!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Backbone.js: Convincing the Boss Guide]]></title>
    <link href="http://gregfranko.com/blog/backbone-dot-js-convincing-the-boss-guide/"/>
    <updated>2012-09-17T10:00:00-07:00</updated>
    <id>http://gregfranko.com/blog/backbone-dot-js-convincing-the-boss-guide</id>
    <content type="html"><![CDATA[<p>I am officially pronouncing <strong>2012 as the year of the JavaScript MV* frameworks</strong>.  Although many people complain that the JavaScript MV* frameworks boom has created too many frameworks to choose from, which further divides the developer community, let&#8217;s look at the glass half full.</p>

<!-- more -->


<p>The influx of JavaScript MV* frameworks has created new design patterns that have promoted <strong>JavaScript as a language that you should care about</strong>.  JavaScript codebase consistency, maintainability, and performance have never been scrutinized more.  This intensified focus is helping the web become an even better place to spend your time.</p>

<p>Although 2012 has been a big win for the JavaScript community, there is still much work to be done.  Much of that work consists of educating developers, who may not be JavaScript wizards (seriously not everyone can be <a href="http://paulirish.com/">Paul Irish</a>, <a href="http://addyosmani.com/">Addy Osmani</a>, etc), that organizing their front-end codebases deserves their full time and attention.</p>

<p>A common argument against using JavaScript MV* frameworks by non-JavaScript wizards is that most &#8220;apps&#8221; are not complex enough to warrent using these &#8220;bloated MV Whatever frameworks&#8221; (their words not mine).  Before you start screaming at your computer, let&#8217;s look at this argument in more detail using <a href="http://backbonejs.org">Backbone.js</a>, one of the most popular JavaScript MV* frameworks, and <a href="http://gregfranko.com/backbone/customBuild/">custom Backbone.js builds</a>.</p>

<h3>Backbone.js</h3>

<p><img class="center" src="http://gregfranko.com/images/backbone.png"></p>

<p><strong>Backbone.js</strong> is a great client-side MV* JavaScript framework that provides structure to JavaScript applications by providing View, Model, Collection, Router, and Event class objects.  Although your application may not need all of the functionality that Backbone.js provides you, 99% of all applications could use the functionality provided by one or more Backbone.js class objects.  <strong>Let&#8217;s take a look at each Backbone.js class object and determine if a &#8220;simple&#8221; application needs the functionality provided.</strong></p>

<h4>Backbone.js View</h4>

<p>Backbone <strong>Views</strong> allow you to organize all of your JavaScript event handlers while also providing a mechanism for adding dynamic HTML to your page through the optional use of JavaScript templates.</p>

<p>Here is an example Backbone View class:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>   <span class="kd">var</span> <span class="nx">View</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Represents the actual DOM element that corresponds to your View</span>
</span><span class='line'>        <span class="nx">el</span><span class="o">:</span> <span class="s1">&#39;body&#39;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Constructor</span>
</span><span class='line'>        <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Event Handlers</span>
</span><span class='line'>        <span class="nx">events</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="s2">&quot;click #example&quot;</span><span class="o">:</span> <span class="s2">&quot;doSomething&quot;</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Updates the text of the element with an ID attribute of example            </span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">$el</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="s2">&quot;#example&quot;</span><span class="p">).</span><span class="nx">text</span><span class="p">(</span><span class="s2">&quot;This is an example&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">doSomething</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Do something</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h5>Backbone.js View Conclusion</h5>

<p>The basic functionality that a Backbone View class object provides is organizing your JavaScript event handlers and organizing how you update your applications UI.  99.9% of all applications (simple or complex) will include JavaScript event handlers that respond to user interactions and then add content to a page.</p>

<p>A common problem with most applications is that their JavaScript code is filled with inconsistent event handlers.  You could very well see a &#8220;legacy&#8221; application with <strong>DOM Level 0</strong> (event handlers inside HTML code), <strong>DOM Level 1</strong> (event handlers inside JavaScript code that limit the amount of event handlers that can be bound to each HTML element) , and <strong>DOM Level 2</strong> event handlers (event handlers inside JavaScript code that allows an unlimited amount of event handlers to be bound to each HTML element).  This inconsistency makes it extremely difficult to maintain an app, especially if a new team member is added to the project.</p>

<p>If you are using a library, such as <a href="http://www.jquery.com">jQuery</a>, you most likely have many DOM Level 2 events in your codebase (ie. $(&#8220;body&#8221;).click(function() {})).  Although jQuery helps with the consistency of your event handlers, it does not help you structure how to organize all of your event handlers.  With just jQuery, an application could consist of spaghetti code that binds event handlers all over the place.  I have worked in this environment, and have found that more bugs are created because of this inconsistency.</p>

<p>No matter the complexity of your application, Backbone Views could very easily help promote best practices and improve maintainability of your JavaScript event handlers.</p>

<h4>Backbone Model</h4>

<p>Backbone <strong>Models</strong> store all of your applications business logic and data. This allows you to organize all of your application&#8217;s data validation inside of your Models.</p>

<p>Here is an example Backbone Model class:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>    <span class="kd">var</span> <span class="nx">Model</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Model</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Default properties</span>
</span><span class='line'>        <span class="nx">defaults</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="nx">example</span><span class="o">:</span> <span class="s2">&quot;I love having my data separated from the DOM&quot;</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Constructor</span>
</span><span class='line'>        <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Any time a Model attribute is set, this method is called</span>
</span><span class='line'>        <span class="nx">validate</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">attrs</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h5>Backbone.js Model Conclusion</h5>

<p>The basic functionality that a Backbone Model class object provides is a place for your application to store and validate client-side information.  99.9% of applications will include validation of data.</p>

<p>A common problem with most applications is that they use the DOM (Document Object Model) as a database (Backbone.js creator, Jeremy Ashkenas, has talked about this at length).  Any time an application needs to find the current &#8220;state&#8221; of an application, that data is retrieved from the DOM.  This can severely hurt performance, since DOM related activities are one of the most memory intensive actions your JavaScript can take.</p>

<p>A common misconception is that the DOM is a part of the JavaScript language.  It isn&#8217;t.  In fact, it is a completely separate API that JavaScript interacts with.  Having the ability to query the current &#8220;state&#8221; of your application without always resorting to querying the DOM is a HUGE WIN.</p>

<p>No matter the complexity of your application, Backbone Models could very easily promote decoupling your code and standardizing where your application performs business logic validation.</p>

<h4>Backbone.js Collection</h4>

<p>If your application is complex, it is also helpful to use Backbone <strong>Collections</strong>, which provides a mechanism to interact with many different Model instances. Since Backbone has a hard dependency on Underscore.js, you are able to utilize many Underscore.js methods to interact with Collections.</p>

<p>Here is an example Backbone Collection class:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">Collection</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Collection</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//Allows the Collection to work with User models</span>
</span><span class='line'>    <span class="nx">model</span><span class="o">:</span> <span class="nx">User</span>
</span><span class='line'>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h5>Backbone.js Collection Conclusion</h5>

<p>The basic functionality that a Backbone Collection class object provides is a mechanism for your application to interact with one or more Backbone Models.</p>

<p>The Backbone Collection class object may not be necessary for all applications, since the true benefit of collections shines through when your application contains more than one Backbone Model instance, and very simple applications may only contain one model instance.</p>

<h4>Backbone.js Router</h4>

<p>Backbone <strong>Routers</strong> are typically used to define &#8220;routes&#8221; in your application. Routes are essentially a unique page in a traditional web application, but in a one page JavaScript application, they help organize your client-side logic without requiring a page refresh (traditionally appending a route as a hash tag to a browser&#8217;s url or using the new HTML5 push state api to silently track page state).</p>

<p>Here is an example Backbone Router class:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>    <span class="kd">var</span> <span class="nx">Router</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Router</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Constructor</span>
</span><span class='line'>        <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">//Required for Backbone to start listening to hashchange events</span>
</span><span class='line'>        <span class="nx">Backbone</span><span class="p">.</span><span class="nx">history</span><span class="p">.</span><span class="nx">start</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">routes</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Calls the home method when there is no hashtag on the url</span>
</span><span class='line'>            <span class="s1">&#39;&#39;</span><span class="o">:</span> <span class="s1">&#39;home&#39;</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="s1">&#39;home&#39;</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Gets called when there is no hashtag on the url</span>
</span><span class='line'>            <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;My very first Backbone route&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h5>Backbone.js Router Conclusion</h5>

<p>The basic functionality that a Backbone Router class object provides is a mechanism for your application to utlize a &#8220;single page&#8221; structure.  This is particularly useful if you do not want page refreshes in your application when a user navigates between &#8220;pages&#8221; or different sections of your app&#8217;s functionality.</p>

<p>The Backbone Router class object may not be necessary for all applications, since not all applications may want the &#8220;single page&#8221; feel or care about refreshing the page.</p>

<h4>Backbone.js Event</h4>

<p>Backbone <strong>Events</strong> are an important concept in Backbone, since they provide you with an easy mechanism to use the pub sub pattern and decouple your code.  Backbone triggers certain events by default (eg. a Model change event is triggered after a Model property has been validated and saved), but Backbone also allows you to trigger and bind to custom events.  This is an extremely useful pattern, since it allows many different classes to listen to one class, without that one class knowing about any of its listeners.</p>

<p>Here is an example Event being triggered by a Backbone Model class:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>    <span class="kd">var</span> <span class="nx">Model</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Model</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Default properties</span>
</span><span class='line'>        <span class="nx">defaults</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="nx">example</span><span class="o">:</span> <span class="s2">&quot;I love having my data separated from the DOM&quot;</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Constructor</span>
</span><span class='line'>        <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Any time a Model attribute is set, this method is called</span>
</span><span class='line'>        <span class="nx">validate</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">attrs</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">triggerEvent</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Triggers an test event and passes data that can be accessed in the event handler</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">trigger</span><span class="p">(</span><span class="s2">&quot;test&quot;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">someData</span><span class="o">:</span> <span class="s2">&quot;data&quot;</span> <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here is an example Event being bound by a Backbone View class:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>   <span class="kd">var</span> <span class="nx">view</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Represents the actual DOM element that corresponds to your View (There is a one to one relationship between View Objects and DOM elements)</span>
</span><span class='line'>        <span class="nx">el</span><span class="o">:</span> <span class="s1">&#39;body&#39;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Constructor</span>
</span><span class='line'>        <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">//Setting the view&#39;s model property.  This assumes you have created a model class and stored it in the Model variable</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">model</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Model</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">//Event handler that calls the initHandler method when the init Model Event is triggered</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s2">&quot;test&quot;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">test</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Event Handlers</span>
</span><span class='line'>        <span class="nx">events</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="s2">&quot;click #example&quot;</span><span class="o">:</span> <span class="s2">&quot;testModelEvent&quot;</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Updates the text of the element with an ID attribute of example            </span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">$el</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="s2">&quot;#example&quot;</span><span class="p">).</span><span class="nx">text</span><span class="p">(</span><span class="s2">&quot;This is an example&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">promptUser</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="nx">prompt</span><span class="p">(</span><span class="s2">&quot;Isn&#39;t this great?&quot;</span><span class="p">,</span> <span class="s2">&quot;Yes, yes it is&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">testModelEvent</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">triggerEvent</span><span class="p">();</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">test</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">obj</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Just got &quot;</span> <span class="o">+</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">someData</span> <span class="o">+</span> <span class="s2">&quot; from my model!&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h5>Backbone.js Event Conclusion</h5>

<p>The basic functionality that a Backbone Event class object provides is a mechanism for using the <strong>pub/sub</strong> pattern to decouple an application&#8217;s codebase.  99.9% of applications could benefit from a design pattern that promotes decouplization (not sure if that is a real word).</p>

<p>A common jQuery design pattern is triggering and binding to <strong>jQuery special events</strong> on the HTML body element.  This pattern is extremely useful, but Backbone improves on this pattern, since it does not rely on the DOM for its pub/sub implementation.  This improves performance and flexibility, since it allows you to bind to custom events on a generic JavaScript object instead of just a jQuery object.</p>

<p>No matter the complexity of your application, the Backbone Events class object could very easily promote decoupling your code and consistent special event binding.</p>

<h3>Backbone.js Custom Builds</h3>

<p>Backbone.js does not support custom builds by default, so I looked at the Backbone codebase and split up all of the Backbone Class Objects into their own files. Since Backbone.js is not set up in a modular way and instead heavily uses local variables all scoped under one Immediately Invoked Function Expression (IIFE) like most libraries, I had to make a few changes to remove these local property dependencies so that they could be split into several files.</p>

<p>With Backbone.js custom builds, you can now use the Backbone Events class object as a standalone pub/sub solution, or only use Backbone Views to organize all of your app&#8217;s event handlers, or use Backbone Models to store all of your applications data client-side, etc (all while minimizing your file size).</p>

<p>Backbone.js is incredible, so I wanted to make it even easier for people who aren&#8217;t completely sold on using it, to only take what they want/need.  Start making <a href="http://gregfranko.com/backbone/customBuild/">Backbone.js Custom Builds</a> now!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Require.js 2.0 Shim Configuration]]></title>
    <link href="http://gregfranko.com/blog/require-dot-js-2-dot-0-shim-configuration/"/>
    <updated>2012-05-29T15:40:00-07:00</updated>
    <id>http://gregfranko.com/blog/require-dot-js-2-dot-0-shim-configuration</id>
    <content type="html"><![CDATA[<p>Require.js 2.0 was recently released by James Burke, and with it comes a bunch of bug fixes and enhancements.  The major enhancement that I wanted to shed light on includes the new <code>Shim</code> configuration.</p>

<!-- more -->


<p><img class="center" src="http://gregfranko.com/images/requirejs.png"></p>

<p>The <code>Shim</code> configuration is a much needed upgrade to the Require.js core that allows Require.js to load non-AMD compatible scripts.  In my previous post <a href="http://gregfranko.com/blog/using-backbone-dot-js-with-require-dot-js/">Using Backbone.js with Require.js</a>, I covered how Use.js, a Require.js plugin created by Backbone.js core contributor <a href="http://tbranyen.com/" target="_blank">Tim Branyen</a>, was necessary to load Backbone.js and Underscore.js (both AMD incompatible) with Require.js.  This was a good solution for integrating these two wonderful projects together, but it was still another project dependency that you needed to keep track of.</p>

<p>James Burke mentions Use.js as one of his inspirations for including the new Shim configuration.  Now, instead of including the Use.js plugin to load Backbone and Underscore, you can have a shim configuration in your main file like this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>  <span class="c1">// Sets the configuration for your third party scripts that are not AMD compatible</span>
</span><span class='line'>  <span class="nx">shim</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>      <span class="s2">&quot;backbone&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">deps</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;underscore&quot;</span><span class="p">,</span> <span class="s2">&quot;jquery&quot;</span><span class="p">],</span>
</span><span class='line'>          <span class="nx">exports</span><span class="o">:</span> <span class="s2">&quot;Backbone&quot;</span>  <span class="c1">//attaches &quot;Backbone&quot; to the window object</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span> <span class="c1">// end Shim Configuration</span>
</span></code></pre></td></tr></table></div></figure>


<p>The <code>Shim</code> configuration is also a replacement for the <strong>order</strong> plugin, which made sure certain scripts executed in a particular order.  Example use cases for this include loading jQuery and Backbone plugins, since Backbone must be executed before Backbone plugins are executed, and jQuery must be executed before jQuery plugins are executed.  Below is how you can load jQuery and Backbone plugins using Require.js 2.0 or greater:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>  <span class="c1">// Sets the configuration for your third party scripts that are not AMD compatible</span>
</span><span class='line'>  <span class="nx">shim</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="s1">&#39;jquery.selectBoxIt&#39;</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;jquery&#39;</span><span class="p">],</span>
</span><span class='line'>        <span class="s1">&#39;backbone.Validation&#39;</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;backbone&#39;</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span> <span class="c1">// end Shim Configuration</span>
</span></code></pre></td></tr></table></div></figure>


<p>For more documentation on all the new changes in Require.js 2.0, head over to the <a href="https://github.com/jrburke/requirejs/wiki/Upgrading-to-RequireJS-2.0">Require.js Github Wiki</a>.  Happy AMD&#8217;ing!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Using Backbone.js with Require.js]]></title>
    <link href="http://gregfranko.com/blog/using-backbone-dot-js-with-require-dot-js/"/>
    <updated>2012-05-24T17:30:00-07:00</updated>
    <id>http://gregfranko.com/blog/using-backbone-dot-js-with-require-dot-js</id>
    <content type="html"><![CDATA[<p><strong>Backbone.js</strong> is a great client-side MV* (not MVC) JavaScript framework that provides structure to JavaScript applications by providing View, Model, Collection, and Router classes.  Backbone also provides a pub sub (publish subscribe) mechanism, by allowing each of it&#8217;s objects to trigger and bind to events.</p>

<!-- more -->


<p><img class="center" src="http://gregfranko.com/images/backbone.png"></p>

<p>Backbone <strong>Views</strong> act as a combination of traditional MVC Views and Controllers, since they allow you to organize all of your JavaScript event handlers while also providing a mechanism for adding dynamic HTML to your page through the optional use of JavaScript templates.  Views will also often be where you set data on your Models.</p>

<p>Here is an example Backbone View class:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>   <span class="kd">var</span> <span class="nx">View</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Represents the actual DOM element that corresponds to your View (There is a one to one relationship between View Objects and DOM elements)</span>
</span><span class='line'>        <span class="nx">el</span><span class="o">:</span> <span class="s1">&#39;body&#39;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Constructor</span>
</span><span class='line'>        <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">//Setting the view&#39;s model property.  This assumes you have created a model class and stored it in the Model variable</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">model</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Model</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Event Handlers</span>
</span><span class='line'>        <span class="nx">events</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="s2">&quot;click #example&quot;</span><span class="o">:</span> <span class="s2">&quot;promptUser&quot;</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Updates the text of the element with an ID attribute of example            </span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">$el</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="s2">&quot;#example&quot;</span><span class="p">).</span><span class="nx">text</span><span class="p">(</span><span class="s2">&quot;This is an example&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">promptUser</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="nx">prompt</span><span class="p">(</span><span class="s2">&quot;Isn&#39;t this great?&quot;</span><span class="p">,</span> <span class="s2">&quot;Yes, yes it is&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Backbone <strong>Models</strong> store all of your applications business logic and data. This allows you to organize all of your application&#8217;s data validation inside of your Models.  In most cases, Models should not know about any of your Views, or the DOM.  There are certain design patterns (eg. modelbinding) where Models are aware of the DOM and set data on it, but most patterns do not implement this strategy since it is beneficial for Model&#8217;s to be completely decoupled from other pieces of the application.</p>

<p>Here is an example Backbone Model class:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>    <span class="kd">var</span> <span class="nx">Model</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Model</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Default properties</span>
</span><span class='line'>        <span class="nx">defaults</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="nx">example</span><span class="o">:</span> <span class="s2">&quot;I love having my data separated from the DOM&quot;</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Constructor</span>
</span><span class='line'>        <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Any time a Model attribute is set, this method is called</span>
</span><span class='line'>        <span class="nx">validate</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">attrs</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>If your application is complex, it is also helpful to use Backbone <strong>Collections</strong>, which provides a mechanism to interact with many different Model instances. Since Backbone has a hard dependency on Underscore.js, you are able to utilize many Underscore.js methods to interact with Collections.  Keep in mind that you may alternatively use <strong>lodash</strong>, a drop-in replacement library for Underscore.js that provides cross browser bug fixes and performance improvements for Underscore.js.  Lodash also allows custom builds, so you can only use a minimum number of Underscore.js functions if you like (reducing file size).</p>

<p>Here is an example Backbone Collection class:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">Collection</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Collection</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//Allows the Collection to work with User models</span>
</span><span class='line'>    <span class="nx">model</span><span class="o">:</span> <span class="nx">User</span>
</span><span class='line'>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Backbone <strong>Routers</strong> are typically used to define &#8220;routes&#8221; in your application. Routes are essentially a unique page in a traditional web application, but in a one page JavaScript application, they help organize your client-side logic without requiring a page refresh (traditionally appending a route as a hash tag to a browser&#8217;s url or using the new HTML5 push state api to silently track page state).</p>

<p>Here is an example Backbone Router class:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>    <span class="kd">var</span> <span class="nx">Router</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Router</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Constructor</span>
</span><span class='line'>        <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">//Required for Backbone to start listening to hashchange events</span>
</span><span class='line'>        <span class="nx">Backbone</span><span class="p">.</span><span class="nx">history</span><span class="p">.</span><span class="nx">start</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">routes</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Calls the home method when there is no hashtag on the url</span>
</span><span class='line'>            <span class="s1">&#39;&#39;</span><span class="o">:</span> <span class="s1">&#39;home&#39;</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="s1">&#39;home&#39;</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Gets called when there is no hashtag on the url</span>
</span><span class='line'>            <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;My very first Backbone route&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Backbone <strong>Events</strong> are an important concept in Backbone, since they provide you with an easy mechanism to use the pub sub pattern and decouple your code.  Backbone triggers certain events by default (eg. a Model change event is triggered after a Model property has been validated and saved), but Backbone also allows you to trigger and bind to custom events.  This is an extremely useful pattern, since it allows many different classes to listen to one class, without that one class knowing about any of its listeners.</p>

<p>Here is an example Event being triggered by a Backbone Model class:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>    <span class="kd">var</span> <span class="nx">Model</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Model</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Default properties</span>
</span><span class='line'>        <span class="nx">defaults</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="nx">example</span><span class="o">:</span> <span class="s2">&quot;I love having my data separated from the DOM&quot;</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Constructor</span>
</span><span class='line'>        <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Any time a Model attribute is set, this method is called</span>
</span><span class='line'>        <span class="nx">validate</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">attrs</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">triggerEvent</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Triggers an test event and passes data that can be accessed in the event handler</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">trigger</span><span class="p">(</span><span class="s2">&quot;test&quot;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">someData</span><span class="o">:</span> <span class="s2">&quot;data&quot;</span> <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here is an example Event being bound by a Backbone View class:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>   <span class="kd">var</span> <span class="nx">view</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Represents the actual DOM element that corresponds to your View (There is a one to one relationship between View Objects and DOM elements)</span>
</span><span class='line'>        <span class="nx">el</span><span class="o">:</span> <span class="s1">&#39;body&#39;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Constructor</span>
</span><span class='line'>        <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">//Setting the view&#39;s model property.  This assumes you have created a model class and stored it in the Model variable</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">model</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Model</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">//Event handler that calls the initHandler method when the init Model Event is triggered</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s2">&quot;test&quot;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">test</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Event Handlers</span>
</span><span class='line'>        <span class="nx">events</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="s2">&quot;click #example&quot;</span><span class="o">:</span> <span class="s2">&quot;testModelEvent&quot;</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Updates the text of the element with an ID attribute of example            </span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">$el</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="s2">&quot;#example&quot;</span><span class="p">).</span><span class="nx">text</span><span class="p">(</span><span class="s2">&quot;This is an example&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">promptUser</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="nx">prompt</span><span class="p">(</span><span class="s2">&quot;Isn&#39;t this great?&quot;</span><span class="p">,</span> <span class="s2">&quot;Yes, yes it is&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">testModelEvent</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">triggerEvent</span><span class="p">();</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">test</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">obj</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Just got &quot;</span> <span class="o">+</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">someData</span> <span class="o">+</span> <span class="s2">&quot; from my model!&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>Require.js</strong> serves two different purposes than Backbone.js. Require.js is an AMD (Asynchronous Module Definition) script loader that asynchronously loads your JavaScript to improve page load performance, while also providing you the ability to organize your JavaScript into self contained modules.  Each JavaScript file represents a module.</p>

<p><img class="center" src="http://gregfranko.com/images/requirejs.png"></p>

<p>Each module is enclosed in a define tag that lists the module&#8217;s file dependencies, and keeps the global namespace free (essentially acting as a JavaScript closure).  Since none of your modules are global, inside of each module, you need to declare which other modules are dependencies and pass them to your current module.  This provides a solution for limiting global variables and dependency management. This solution is much better then having many script tags in a single page, which can be cumbersome to keep track of which files depend on which other files.  It also encourages you to decouple your JavaScript logic (instead of the traditionally hard to read one page JavaScript application).</p>

<p>Here is a more advanced example of a Backbone View class used with Require.js:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">define</span><span class="p">([</span><span class="s1">&#39;jquery&#39;</span><span class="p">,</span> <span class="s1">&#39;use!backbone&#39;</span><span class="p">,</span><span class="s1">&#39;models/model&#39;</span><span class="p">],</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">,</span> <span class="nx">Backbone</span><span class="p">,</span> <span class="nx">Model</span><span class="p">){</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">self</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">View</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Represents the actual DOM element that corresponds to your View (There is a one to one relationship between View Objects and DOM elements)</span>
</span><span class='line'>        <span class="nx">el</span><span class="o">:</span> <span class="s1">&#39;body&#39;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// View constructor</span>
</span><span class='line'>        <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Storing the View context</span>
</span><span class='line'>            <span class="nx">self</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Setting the View&#39;s model property to the passed in Model</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">model</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Model</span><span class="p">({</span>
</span><span class='line'>                <span class="nx">message</span><span class="o">:</span> <span class="s2">&quot;You are now using Backbone, Require, and jQuery!&quot;</span>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">events</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="s2">&quot;click #example&quot;</span><span class="o">:</span> <span class="s2">&quot;promptUser&quot;</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Updates the text of the element with an ID attribute of example</span>
</span><span class='line'>            <span class="nx">self</span><span class="p">.</span><span class="nx">$el</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="s2">&quot;#example&quot;</span><span class="p">).</span><span class="nx">text</span><span class="p">(</span><span class="s2">&quot;This is an example&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">promptUser</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">prompt</span><span class="p">(</span><span class="s2">&quot;Isn&#39;t this amazing?&quot;</span><span class="p">,</span> <span class="s2">&quot;Yes, yes it is&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  
</span><span class='line'>    <span class="c1">// Returns the entire view (allows you to reuse your View class in a different module)</span>
</span><span class='line'>    <span class="k">return</span> <span class="k">new</span> <span class="nx">View</span><span class="p">();</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Backbone.js and Require.js perfectly complement each other, but there is one problem&#8230; Backbone.js is not AMD compatible.  To be AMD compatible, a script must declare itself as a module by calling the <strong>define()</strong> method if it exists and list it&#8217;s dependencies.  Backbone decided to not natively support AMD/Require.js, because it&#8217;s creater, Jeremy Ashkenas, felt it was unnatural to have to change Backbone&#8217;s source code so that it would work in Require.js and other AMD loaders.  Luckily for us, Backbone contributor, Tim Branyen, created <strong>Use.js</strong> for this exact reason.</p>

<p>Looking at the previous code example, you will notice that I am using the Use.js plugin to include Backbone as a dependency to my View class.  Use.js allows you to use (no pun intended) scripts that are not AMD compatible, by setting a one time configuration (typically in a main.js file or initialization file), and then prefixing dependencies with <code>use!</code>.</p>

<p>Here is a typical Use.js configuration with Backbone.js and Underscore.js:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>  <span class="c1">// Sets the use.js configuration for your application</span>
</span><span class='line'>  <span class="nx">use</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">backbone</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">deps</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;use!underscore&quot;</span><span class="p">,</span> <span class="s2">&quot;jquery&quot;</span><span class="p">],</span>
</span><span class='line'>      <span class="nx">attach</span><span class="o">:</span> <span class="s2">&quot;Backbone&quot;</span>  <span class="c1">//attaches &quot;Backbone&quot; to the window object</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">underscore</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">attach</span><span class="o">:</span> <span class="s2">&quot;_&quot;</span> <span class="c1">//attaches &quot;_&quot; to the window object</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span> <span class="c1">// end Use.js Configuration</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>Note</strong>: Require.js 2.0 added support for loading non-AMD compatible scripts by using the Shim configuration.  You can find a more detailed explanation of the Shim configuration in my next <a href="http://gregfranko.com/blog/require-dot-js-2-dot-0-shim-configuration/" target="_blank">blog post</a>. If you want more in-depth explanations and examples of how to setup Backbone.js, Require.js, and the Shim configuration, check out the <a href="https://github.com/gfranko/Backbone-Require-Boilerplate" target="_blank">Backbone-Require-Boilerplate</a> I recently created on Github.</p>

<p>An additional benefit of using Require.js is you can <strong>optimize</strong> (concat, minifiy) your entire project or single JavaScript files (depending on your preference) using <strong>r.js</strong>, a library written by James Burke that allows you to use the Require.js Optimizer.  All you need to do is install either node.js or rhino (both can be used as command line tools but node.js is recommended) and create a build file.</p>

<p>Here is an example of an app.build.js configuration file:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">//Install node.js, navigate to the js folder, and then run this command: &quot;node r.js -o app.build.js&quot;</span>
</span><span class='line'><span class="p">({</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Creates a js-optimized folder at the same folder level as your &quot;js&quot; folder and places the optimized project there</span>
</span><span class='line'>  <span class="nx">dir</span><span class="o">:</span> <span class="s2">&quot;../js-optimized&quot;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// 3rd party script alias names</span>
</span><span class='line'>  <span class="nx">paths</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Core Libraries</span>
</span><span class='line'>    <span class="nx">modernizr</span><span class="o">:</span> <span class="s2">&quot;libs/modernizr-2.5.3.min&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">jquery</span><span class="o">:</span> <span class="s2">&quot;libs/jquery-1.7.2.min&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">underscore</span><span class="o">:</span> <span class="s2">&quot;libs/lodash-0.2.0.min&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">backbone</span><span class="o">:</span> <span class="s2">&quot;libs/backbone-0.9.2.min&quot;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Require.js Plugins</span>
</span><span class='line'>    <span class="nx">use</span><span class="o">:</span> <span class="s2">&quot;plugins/use-0.3.0.min&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">text</span><span class="o">:</span> <span class="s2">&quot;plugins/text-1.0.8.min&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Sets the use.js configuration for your application</span>
</span><span class='line'>  <span class="nx">use</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">backbone</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">deps</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;use!underscore&quot;</span><span class="p">,</span> <span class="s2">&quot;jquery&quot;</span><span class="p">],</span>
</span><span class='line'>      <span class="nx">attach</span><span class="o">:</span> <span class="s2">&quot;Backbone&quot;</span>  <span class="c1">//attaches &quot;Backbone&quot; to the window object</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">underscore</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">attach</span><span class="o">:</span> <span class="s2">&quot;_&quot;</span> <span class="c1">//attaches &quot;_&quot; to the window object</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">},</span> <span class="c1">// end Use.js Configuration</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Modules to be optimized:</span>
</span><span class='line'>  <span class="nx">modules</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;mobile&quot;</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;desktop&quot;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">]</span>
</span><span class='line'>
</span><span class='line'><span class="p">})</span>
</span></code></pre></td></tr></table></div></figure>


<p>Obviously your app.build.js file will most likely be different, but hopefully this helps get you on the right track (note: I took this directly from my Backbone-Require-Boilerplate project).</p>

<p>Considering the many advantages of using Backbone.js and Require.js together, I hope I have convinced you to try out these great open source projects.  Happy coding!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[JavaScript Logical Operators]]></title>
    <link href="http://gregfranko.com/blog/javascript-logical-operators/"/>
    <updated>2012-04-19T23:03:00-07:00</updated>
    <id>http://gregfranko.com/blog/javascript-logical-operators</id>
    <content type="html"><![CDATA[<p>Have you ever written code like this?</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">something</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span><span class="p">(</span><span class="nx">somethingElse</span> <span class="o">===</span> <span class="kc">true</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">something</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="nx">somethingElse</span> <span class="o">===</span> <span class="kc">false</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">something</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<!-- more -->


<p>If you have, then you need to be using <strong>JavaScript logical operators</strong>.  The previous code can be rewritten like this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">something</span> <span class="o">=</span> <span class="nx">somethingElse</span> <span class="o">||</span> <span class="kc">false</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>




<br />


<h2>Logical OR Operator</h2>

<p>The logical OR operator <strong>returns the first true value</strong> it finds (looking from left to right).  If nothing is true in the statement, then it defaults to the last value (false in the previous code example).  This makes it <strong>perfect for setting default values</strong>.</p>

<p>It is also important to understand that JavaScript evaluates other variable types to boolean (true or false).  Below are examples of other JavaScript variable types that are evaluated to true or false:</p>

<p><code>""</code> - An empty string in JavaScript returns false.  All other string values return true.</p>

<p><code>undefined</code> - Returns false.</p>

<p><code>null</code> - Returns false</p>

<p><code>0</code> - Returns false.  All other numbers return true.</p>

<p>Here is a more advanced (and more common) use case for the logical OR operator.  You want to check if a certain string value is empty, and if it is, you want to set a variable to a default value of &#8220;test&#8221;</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">something</span> <span class="o">=</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">somethingElse</span> <span class="o">===</span> <span class="s2">&quot;string&quot;</span> <span class="o">&amp;&amp;</span> <span class="nx">somethingElse</span><span class="p">)</span> <span class="o">||</span> <span class="s2">&quot;test&quot;</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here is the breakdown of how the above code works:</p>

<p><strong>1.</strong>  If the somethingElse value is both a string and is true (is not empty), then set the something variable equal to the somethingElse value.  It is important to check that the somethingElse value <code>typeof</code> evaluates to <code>string</code>, because we want to make sure we are dealing with a string (and not an integer such as 0 which will evaluate to true).</p>

<p><strong>2.</strong>  If the somethingElse value is not a string and is false (is empty), then set the something variable equal to &#8220;test&#8221;.</p>

<br />


<h2>Logical AND Operator</h2>

<p>The <strong>JavaScript logical AND operator</strong> can also be used to set default values.  Instead of returning the first true value, the logical AND operator <strong>returns the first false value</strong> it finds (looking from left to right).  If there is no false value, then the last value is returned.  Let&#8217;s look at the first code example again, but instead with the logical AND operator.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">something</span> <span class="o">=</span> <span class="nx">somethingElse</span> <span class="o">&amp;&amp;</span> <span class="s2">&quot;something&quot;</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>If the somethingElse value evaluates to false, then the something variable gets set to the somethingElse value.  If the somethingElse variable evaluates to true, then the something variable gets set to &#8220;something&#8221;.  The logical AND operator uses the exact opposite logic of the logical OR operator.</p>

<p>JavaScript logical operators are an often misunderstood but powerful feature of the language.  Start using them today!</p>
]]></content>
  </entry>
  
</feed>
