can
Version:
MIT-licensed, client-side, JavaScript framework that makes building rich web applications easy.
104 lines (103 loc) • 3.56 kB
HTML
<html>
<head>
<title>loader-only</title>
<script type="text/javascript" data-dojo-config="async:true" src="../../../dojo.js"></script>
<script type="text/javascript">
function loadProvidePlugin(){
define("dojo/provide", ["dojo", "./text"], function(dojo, textPlugin){
// summary:
// Plugin for loading legacy dojo modules (that use dojo.provide/dojo.require)
// with the async loader. For example:
// | define(["dojo/dojo-require!dojox.cometd"], function(){
// | dojox.cometd.init("/cometd");
// | ...
// | });
// This will load dojox.cometd and all it's dependencies asynchronously.
dojo.require = function(id){
// this is mainly for top level, it should be do nothing once a module is loaded
var loadedModule;
require(["dojo/provide!" + id], function(module){
loadedModule = module;
});
return loadedModule; // return the loaded module if it is synchronously available
};
dojo.provide = function(id){
dojo.getObject(id, true);
};
return {
load: function(id, parentRequire, loaded, config){
id = id.replace(/\//g, '.');
var existing = dojo.getObject(id);
if(existing){
return loaded(existing);
}
textPlugin.load(id.replace(/\./g, '/') + ".js", parentRequire, function(text){
var deps = 0, done;
var commentFree = text.replace(/\/\*[\s\S]*?\*\//g, '');
if(!/dojo\.provide\s*\(\s*['"]([^'"]*)['"]\s*\)/.test(commentFree)){
// doesn't look like a dojo module after all, revert back to script loading (hopefully the request should be cached)
return parentRequire([id.replace(/\./g, '/')], function(module){
loaded(module);
});
}
addDependencies(/dojo\.require\s*\(\s*['"]([^'"]*)['"]\s*\)/g, function(moduleId, loaded){
parentRequire(["dojo/provide!" + moduleId], loaded);
});
addDependencies(/dojo\.cache\s*\(\s*['"]([^'"]*['"]\s*,\s*['"][^'"]*)['"]\s*\)/g, function(moduleId, loaded){
var parts = moduleId.split(/['"]\s*,\s*['"]/);
parts[0] = parts[0].replace(/\./g, '/');
textPlugin.load(parts.join('/'), require, loaded, config);
});
done = true;
if(deps == 0){
ready();
}
function addDependencies(regex, handler){
commentFree.replace(regex, function(t, moduleId){
deps++;
handler(moduleId, function(){
deps--;
if(done && deps == 0){
ready();
}
});
});
}
function ready(){
eval(text + "\r\n//@ sourceURL=" + id);
loaded(dojo.getObject(id));
}
});
}
};
});
}
</script>
<script type="text/javascript">
var mid = "dojo/tests/_base/loader/syncFromAsyncModule"
if(location.search=="?provide!"){
// this just keeps the plugin out of the repo until we decide which way to go
loadProvidePlugin();
mid = "dojo/provide!" + mid;
}else{
// dojo must be loaded for legacy modes to work
require({async:"sync"}, ["dojo"]);
// now we can switch to legacy async mode
require({async:"legacyAsync"});
}
require(["dojo", "doh", mid], function(dojo, doh, syncModule) {
dojo.ready(function() {
doh.register("asyncWithDojoRequire", [function loadSyncModule(t){
t.is(syncModule.status, "OK");
}]);
doh.runOnLoad();
});
});
</script>
</head>
<body>
<h1>Description: Async Dojo loading 1.6 module</h1>
</body>
</html>