冒着问一个愚蠢的问题,我会试试看,虽然的。
是否有可能同时RequireJs加载依赖性显示进度指标?
例如:
require(['jquery'], function($) {
// Well, jQuery loaded in quite some time due to a low-speed connection
//
// Or maybe I wanted to show an overlay to prevent user of clicking on UI widgets until the load is complete
});
我不想开始修改RequireJS源,如果有一些插件,在那里它并没有在我的谷歌搜索显示出来。
感谢你的帮助。
不,这是不可能的。 RequrieJs创建DOM中的新的脚本加载模块和监听加载事件。 有在起点和终点之间的负载不更新事件。 因此,这不是requireJs但DOM的限制。
它可以显示一个旋转器或进度指示器,但不是杆本身。 我能得到requirejs(目前加载或空闲)状态,但不是装的%/需要加载的模块,因为他们的依赖关系后,每一个模块加载解析,而不是在开头。
但是,不管怎样,用,页面至少,简单的微调,不仅仅是空白页好得多,而用户等待。
无需更改requirejs需要! 所以..
假设我们有文件require.conf.js与
require.config({...})
require(["app"], function () {
// main entry point to your hugde app's code
});
它是由使用HTML装
<script data-main="require.conf" type="text/javascript" src="bower_components/requirejs/require.js"></script>
这是标准的requirejs场景。 让我们的指标添加到
<div id="requirejs-loading-panel">
<div id="requirejs-loading-status"></div>
<div id="requirejs-loading-module-name"></div>
</div>
好吧,让我们赶上requirejs的函数调用require.onResourceLoad,做所有的魔法需要的。 它会通过在每个模块负载requirejs被调用,传递requirejs的情况下与DEP树和所有其他工作人员。 我们将使用方面找出来,requirejs是否加载一些与否。 我这样做是在计划的计时器调用,因为onResourceLoad()被调用时只加载,而不是当它完成加载。 此代码需要添加到require.js.conf:
require.onResourceLoad = function (context, map, depMaps) {
var loadingStatusEl = document.getElementById('requirejs-loading-status'),
loadingModuleNameEl = document.getElementById('requirejs-loading-module-name');
var panel = document.getElementById('requirejs-loading-panel');
if (loadingStatusEl && loadingModuleNameEl) {
if (!context) { // we well call onResourceLoad(false) by ourselves when requirejs is not loading anything => hide the indicator and exit
panel.style.display = "none";
return;
}
panel.style.display = ""; // show indicator when any module is loaded and shedule requirejs status (loading/idle) check
clearTimeout(panel.ttimer);
panel.ttimer = setTimeout(function () {
var context = require.s.contexts._;
var inited = true;
for (name in context.registry) {
var m = context.registry[name];
if (m.inited !== true) {
inited = false;
break;
}
} // here the "inited" variable will be true, if requirejs is "idle", false if "loading"
if (inited) {
require.onResourceLoad(false); // will fire if module loads in 400ms. TODO: reset this timer for slow module loading
}
}, 400)
if (map && map.name) { // we will add one dot ('.') and a currently loaded module name to the indicator
loadingStatusEl.innerHTML = loadingStatusEl.innerHTML += '.'; //add one more dot character
loadingModuleNameEl.innerHTML = map.name + (map.url ? ' at ' + map.url : '');
}
} else {
}
};
一个问题是:我们不能以某种方式找出很多模块是如何需要加载,因此我们无法计算的加载进度的实际%。 但是,至少,我们可以发现,无论是我们正在加载的东西或没有(和事件获取当前加载模块的名称),并将其展示给紧张的用户
由于诉2.1.19 RequireJS已onNodeCreated
config属性。 如果分配一个函数,即函数将每一个时间称为<script>
元件被附加到文档加载的模块。
该功能将提供node
, config
, moduleName
和url
参数。 通过事件侦听器连接到node
,你可以检测脚本时已经加载或无法加载。
现在,你可以检测时加载过程的启动和停止,并可以使用这些信息来通知用户:
require.config({
/* ... paths, shims, etc. */
onNodeCreated: function(node, config, moduleName, url) {
console.log('module ' + moduleName + ' is about to be loaded');
node.addEventListener('load', function() {
console.log('module ' + moduleName + ' has been loaded');
});
node.addEventListener('error', function() {
console.log('module ' + moduleName + ' could not be loaded');
});
},
});
对于IE <9你需要额外的代码添加事件侦听器。
注:通过直接RequireJS要求的模块里,才能工作。 插件(requirejs /文本和这样),分别使用各自的加载机制,也不会触发onNodeCreated
。 某些触发onXhr
和onXhrComplete
虽然,这样你就可以处理它们太:
require.config({
/* ... paths, shims, etc. */
config: {
text: {
onXhr: function(xhr, url) {
console.log('file ' + url + ' is about to be loaded');
},
onXhrComplete: function(xhr, url) {
console.log('file ' + url + ' has been loaded');
}
}
}
});