RequireJS Support
*****************
.. note::
experimental
It is possible to use the generator to build a `RequireJS `_ compatible library using %{qooxdoo}. Here is the description of RequireJS taken from the project's website:
"RequireJS is a JavaScript file and module loader. It is optimized for in-browser use, but it can be used in other JavaScript environments, like Rhino and Node. Using a modular script loader like RequireJS will improve the speed and quality of your code."
-- `http://requirejs.org/ `_
A couple of steps are necessary to accomplish this:
* You need a class which represents the common interface you want to offer as a require.js module
* and a customized generator config file to build your library.
Representable interface
-----------------------
Let's assume you've implemented a class like the following:
::
qx.Bootstrap.define("my.super.Dog", {
extend : Object,
members : {
bark : function() {
alert("BARK!");
}
}
});
You want to export this class as a module usable with RequireJS. Usage could look something like this:
::
require("dog.js", function(dog) {
dog.bark();
});
That's all you need to take care of on the JavaScript side.
Config file
-----------
There is some more work to be done on the config side (this might change at some point). Here is a sample config:
::
{
"let" :
{
"APPLICATION" : "library",
"QOOXDOO_PATH" : "../..",
},
"build" :
{
"library" : [{
"manifest" : "${QOOXDOO_PATH}/framework/Manifest.json"
}],
"include" : [
"my.super.Dog"
],
"environment" : {
"qx.export" : {"dog" : "my.super.Dog"}
},
"compile-options" :
{
"paths" :
{
"file" : "dog.js",
"app-root" : ".",
"loader-template" : "${QOOXDOO_PATH}/tool/data/generator/require.loader.tmpl.js"
},
"uris" :
{
"script" : ".",
"resource" : "."
},
"code" :
{
"format" : true,
"optimize" : [ "variants", "base", "string", "privates", "variables" ],
"except" : []
}
},
"compile" : { "type" : "build" }
}
}
}
We won't go much into detail here because most of this is covered by the :doc:`Generator Config Keys ` page and others. But there are two things you should be aware of. First, a new loader template is set for the compile step. There's a special loader template for RequireJS which uses the other important thing: The ``qx.export`` environment key. It holds a map specifying which class should be exported as a module. Running the ``build`` job will then generate a RequireJS-compatible file named ``dog.js`` which exposes the ``dog`` class as a module.