On Monday the 4th of October Chris Coyier of CSS Tricks wrote on Twitter:
What they call themselves: jQuery = Library YUI = Library ExtJS = Library MooTools = Framework Prototype = Framework Dojo = Toolkit [cite]
I just got some crap for “not knowing the difference” – which I don’t. It’s just semantics (literally) as far as I know. [cite]
While I think it’s absolutely bad form for people to attack him on his use of those terms synonymously, it connected two apparently opposite ideas in my mind. It resonated with some ideas I had about a debate that’s been going on in the last few months since Rebecca Murphey suggested that jQuery was not up to the task of being used as a framework in a browser based web application [cite]. Then there’s the jQuery forum discussion of adding JavaScriptMVC as an enterprise branch of the jQuery project [cite]. But here’s the big “revolutionary” idea: jQuery is just a library. It is not a framework. It goes well beyond a simple toolkit, but it is an excellent library.
Now, let’s get down to brass tacks. In the first 10 years of web development there was a lack of craftsmanship and instead a lot of do it yourself or self-directed education by the community as we all learned the emerging web technologies. I learned my first bits of HTML from HTML Goodies. I then spent time on other sites and read a few JavaScript for Dummies type books when I got started over a decade ago. Terms like Library, Toolkit and Framework were never discussed. However, from an academic level these terms imply things about the code’s purpose and therefore are a critical part of the discussion.
- Toolkit
- A toolkit is a combination of classes or functions that do not define or limit the design of an application. A toolkit may have a small handful of functions that allow you to do rollover events (see also: Dreamweaver’s JavaScript tricks).
- Library
- A library is a collection of classes or functions designed specifically to interface with one particular complex task. Examples of a library might be an image manipulation library or a canvas manipulation library. jQuery is a library because it was fundamentally a DOM manipulation library.
- Framework
- A framework is a collection of classes or functions designed to implement a certain pattern for a specific class of software. A framework is for specific domains or types of applications such as web applications. JavaScriptMVC is a framework for developing Model-View-Controller based web interfaces.
Did you see what I did there? I just diffused a bomb. OK, not really. Rebecca Murphey’s direct problem with jQuery (and she has stated this) is not that it is a bad library, it is that it is not a complete framework. That’s OK, because John and the rest of the jQuery developers have not been trying to make a framework. John Resig doesn’t want an MVC framework as a direct branch of the jQuery library because JavaScriptMVC goes well beyond the purpose of the jQuery library. However, the work done to build JavaScriptMVC as a framework that uses the jQuery library is really, really cool and powerful.
Across the spread of the web horizon lies the Dojo toolkit, which has expanded beyond just being a toolkit and really has taken on a multi-tiered approach: it has a toolkit presentation due to its name, but it really is a library (for the DOM like jQuery), but it also has a framework for creating MVC styled applications and taking on the details of a larger built application (See the Dojo Builder for Eclipse or the dojo toolbox). The purpose of the build tools is to allow you to compile the appropriate libraries from within the larger Dojo framework into a final, smaller file (or files) for inclusion in your project.
So fundamentally you need to ask yourself what your project needs: does it need a toolkit? I would suggest it just might given that there may only be a handful of tasks that you really need to accomplish. Does it need a library? If there is very much DOM manipulation you should evaluate the various libraries and confirm that one of them meets your needs (or has the smallest learning curve, or whatever specifications you have) . Does it need a framework? Are you making a website or a web application? If you’re making a web application you probably need a server side framework such as CakePHP or Ruby on Rails. You probably want to consider what client side framework you’ll need. Having rolled my own I can confidently say that rolling your own won’t kill you, but you should absolutely consider the frameworks that do exist because it could save you time and be very extensible in the future when your project goes for another iteration that needs more meat.
This hasn’t been a journey down the yellow brick road to the emerald city, but whether you see lions, toolkits, or bears be aware that the terms do have a technical implication and your use of them may help clear up confusion. And it could help you in that next interview when the project lead asks you if you prefer to use one religious war starting technology over another more holy religious war starting technology 😉 I’m going to stick with using my new favorite library: vapor.js.
Interesting points… I myself think the distinction between toolkit, library, and framework is a bit silly, but our main reason at Dojo for calling ourselves a toolkit is that we view a framework as doing the work for you (e.g. code generation or compiling like GWT), and we like to think of ourselves as people providing great tools and libraries for developers, and making is easy for frameworks to use our tools and libraries.
Dylan,
Thanks for your comment! I certainly can’t disagree with your approach to the dojo toolkit, but I’m just pointing out that technically the parts and pieces that are part of the toolkit (and the tools and frameworks that are part of the setup) make it more robust than just simply a toolkit or library. When I rolled my own framework I didn’t set out to build a framework and I didn’t technically know what one was. I suspect in 5 years more design patterns will be more native to the way we think about web development. Thanks for all you do!
Randy