Tworząc część kliencką wszelkiej maści aplikacji, dość często wykorzystuje się JavaScript i różnego rodzaju biblioteki i narzędzia oparte na nim. Osobiście jestem przeciwnikiem korzystania z “jedynej słusznej” technologii (jaka by ona nie była) i lubię eksperymentować z nowymi narzędziami. Ostatecznie nawet papier toaletowy wie, że należy się rozwijać. Tym razem postanowiłem się trochę mocniej wgłębić w bibliotekę Dojo, która prawdopodobnie jest w stanie zastąpić wiele innych bibliotek, które dotychczas wykorzystywałem.

Jedną z największych zalet stosowania Dojo jest modularność i zarządzanie zależnościami. Biblioteka składa się z całego mnóstwa modułów, których liczbę można rozszerzać o własne i wstrzykiwać w zależności od potrzeb. Ponadto zarządzanie zależnościami opiera się o AMD, czyli asynchroniczne ładowanie zależności, co ułatwia pisanie samodzielnego i wydajnego kodu bez potrzeby dołączania ogromnej liczby skryptów, które koniec końców, nie zawsze zostaną użyte. Składnia jest tożsama z tą wykorzystywaną przez RequireJS i inne tego typu biblioteki:

require(["moduleFirst", "moduleSecond", "moduleThird"],
		function(moduleFirst, moduleSecond, moduleThird) {
	moduleFirst.doSomething();
	moduleSecond.doSomething();
	moduleThird.doSomething();
});

Chcąc uniknąć zduplikowanego kodu, przydaje się możliwość rozszerzania istniejących klas, modułów itp. Dotychczas korzystałem przede wszystkim z Underscore.js oraz Prototype.js, okazuje się jednak, że Dojo jest w stanie całkiem zręcznie zastąpić je:

define(["dojo/_base/declare", "example/Person"], function(declare, Person) {
	return declare(Person, {
		doSomething: function() {
			return console.log("do something...");
		}
	});
});

Bardzo ciekawą funkcjonalnością dostarczaną przez Dojo są aspekty. Przenoszą one na grunt języka JavaScript programowanie aspektowe, znane chociażby z AspectJ. Upraszcza programowanie zdarzeniowe i sprawia wrażenie prostego w użyciu:

define(["dojo/aspect"], function(aspect) {
	aspect.after(module, "method", function(argFirst, argSecond) {
		console.log("do something with " + argFirst + " and " + argSecond);
	});
});

Oczywiście nie brakuje również wsparcia dla modelu danych oraz zunifikowanego obiektu XHR do obsługi żądań AJAX.

Dojo zapewnia sporo dodatkowych narzędzi wspierających pracę:

  • D.O.H. - platformę wspierającą testy jednostkowe i wydajnościowe,
  • system budowania Dojo - pozwalający m.in. na minifikację kodu wynikowego, kopiowanie zasobów, skanowanie zależności i raportowanie procesu budowania,
  • Dijit - bibliotekę UI z pokaźnym zestawem widżetów,
  • oraz dużo innych ciekawych udogodnie, których wymienianie nie ma większego sensu, a które dobrze opisuje dokumentacja.

W najbliższym czasie postaram się zgłębić temat poszczególnych elementów Dojo i napisać o nich coś więcej.