dojo Configuring Dojo with dojoConfig Loader Configuration


Dojo received a new loader in Dojo 1.7 to accommodate for the toolkit's new AMD module format. This new loader added a few new configuration options that are crucial to defining packages, maps, and more. For details on the loader, see the Advanced AMD Usage tutorial. Important loader configuration parameters include:

baseUrl: The base URL prepended to a module identifier when converting it to a path or URL.

baseUrl: "/js"

packages: An array of objects which provide the package name and location:

packages: [{
    name: "myapp",
    location: "/js/myapp"

map: Allows you to map paths in module identifiers to different paths:

map: {
    dijit16: {
        dojo: "dojo16"

paths: a map of module id fragments to file paths:

var dojoConfig = {
    packages: [
    paths: {
        package1: "../lib/package1",
        package2: "/js/package2"

    // equivalent to:
var dojoConfig = {
    packages: [
        { name: "package1", location: "../lib/package1" },
        { name: "package2", location: "/js/package2" }

async: Defines if Dojo core should be loaded asynchronously. Values can be true, false or legacyAsync, which puts the loader permanently in legacy cross-domain mode.

async: true

parseOnLoad: If true, parses the page with dojo/parser when the DOM and all initial dependencies (including those in the dojoConfig.deps array) have loaded.

parseOnLoad: true

It is recommended that parseOnLoad be left at false (it defaults to false, so you can simply omit this property), and that developers explicitly require dojo/parser and call parser.parse().

deps: An array of resource paths which should load immediately once Dojo has loaded:

deps: ["dojo/parser"]

callback: The callback to execute once deps have been retrieved:

callback: function(parser) {
    // Use the resources provided here

waitSeconds: Amount of time to wait before signaling load timeout for a module; defaults to 0 (wait forever):

waitSeconds: 5

cacheBust: If true, appends the time as a querystring to each module URL to avoid module caching:

cacheBust: true

Now let's create a simple demo that puts the basic parameters to use. One very common scenario is using Dojo Toolkit from CDN with local modules.

Let's say we use Google CDN with modules in the /documentation/tutorials/1.10/dojo_config/demo space:

<!-- Configure Dojo first -->
    dojoConfig = {
        has: {
            "dojo-firebug": true,
            "dojo-debug-messages": true
        // Don't attempt to parse the page for widgets
        parseOnLoad: false,
        packages: [
            // Any references to a "demo" resource should load modules locally, *not* from CDN
                name: "demo",
                location: "/documentation/tutorials/1.10/dojo_config/demo"
        // Timeout after 10 seconds
        waitSeconds: 10,
        map: {
            // Instead of having to type "dojo/domReady!", we just want "ready!" instead
            "*": {
                ready: "dojo/domReady"
        // Get "fresh" resources
        cacheBust: true

<!-- Load Dojo, Dijit, and DojoX resources from Google CDN -->
<script src="//"></script>

<!-- Load a "demo" module -->

    require(["demo/AuthoredDialog", "dojo/parser", "ready!"], function(AuthoredDialog, parser) {
        // Parse the page

        // Do something with demo/AuthoredDialog...

By using the packages configuration, we've made all references to demo/* point to our local /documentation/tutorials/1.10/dojo_config/demo/ directory, while allowing any references to dojo, dijit, and dojox to come from Google CDN. Had the demo package not been defined, the request for demo/AuthoredDialog would have gone to // We also used alias, by associating ready with dojo/domReady.