Có thể hiển thị chỉ báo xoay hoặc chỉ báo tiến trình, nhưng không thể hiển thị chính thanh đó. Tôi có thể nhận được trạng thái của requirejs (hiện đang tải hoặc nhàn rỗi), nhưng không phải là% của nạp/cần thiết để được nạp mô-đun, bởi vì phụ thuộc của họ được phân tích cú pháp khi tải từng mô-đun, nhưng không phải lúc đầu.
Tuy nhiên, dù sao, trang có, ít nhất, một trình quay tròn đơn giản, tốt hơn nhiều so với trang trống, trong khi người dùng đợi.
Không có thay đổi đối với requirej cần thiết! Vì vậy ..
Giả sử chúng ta có require.conf.js tập tin với
require.config({...})
require(["app"], function() {
// main entry point to your hugde app's code
});
và nó được nạp bởi html sử dụng
<script data-main="require.conf" type="text/javascript" src="bower_components/requirejs/require.js"></script>
Đây là kịch bản requirejs chuẩn. Hãy thêm chỉ báo vào số
<div id="requirejs-loading-panel">
<div id="requirejs-loading-status"></div>
<div id="requirejs-loading-module-name"></div>
</div>
Ok, hãy bắt kịp chức năng của requirejs được gọi là require.onResourceLoad và thực hiện tất cả các điều cần thiết. Nó sẽ được gọi bởi requirejs khi tải từng mô-đun, chuyển ngữ cảnh của requirejs với cây dep và tất cả các nhân viên khác. Chúng tôi sẽ sử dụng ngữ cảnh để tìm hiểu, cho dù requirejs đang tải một cái gì đó hay không. Tôi đã làm nó trong cuộc gọi hẹn giờ theo lịch trình, bởi vì onResourceLoad() được gọi chỉ trong khi tải, không phải khi nó được thực hiện tải. Mã này cần phải được thêm vào 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 {
}
};
Một vấn đề là: chúng tôi không thể tìm ra số lượng mô-đun cần tải, vì vậy chúng tôi không thể tính% tiến trình tải thực tế. Nhưng, ít nhất, chúng ta có thể tìm hiểu, cho dù chúng ta đang tải thứ gì đó hay không (và sự kiện hiện đang tải tên mô-đun) và hiển thị nó cho người dùng hồi hộp
@explunit: Nếu bạn có một cái gì đó để thêm, nhận xét về câu trả lời này. Không chỉnh sửa câu trả lời. –
Nếu bạn kiểm tra vùng đầu html trong công cụ Firebug hoặc Chrome dev, bạn có thể xem những gì RequireJs thực hiện với thẻ script và hiểu tại sao nó không thể có chỉ báo tiến trình. – explunit
Cảm ơn sự giúp đỡ của bạn. Nó làm cho suy nghĩ của một cách tiếp cận tốt hơn - thay vì dựa vào sự kiện 'kịch bản nạp' tôi sẽ thực hiện điều này trong logic ứng dụng. – crissdev