requirejs负载脚本进度(requirejs load script progress)

2019-07-22 19:31发布

冒着问一个愚蠢的问题,我会试试看,虽然的。

是否有可能同时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源,如果有一些插件,在那里它并没有在我的谷歌搜索显示出来。

感谢你的帮助。

Answer 1:

不,这是不可能的。 RequrieJs创建DOM中的新的脚本加载模块和监听加载事件。 有在起点和终点之间的负载不更新事件。 因此,这不是requireJs但DOM的限制。



Answer 2:

它可以显示一个旋转器或进度指示器,但不是杆本身。 我能得到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 {


    }


};

一个问题是:我们不能以某种方式找出很多模块是如何需要加载,因此我们无法计算的加载进度的实际%。 但是,至少,我们可以发现,无论是我们正在加载的东西或没有(和事件获取当前加载模块的名称),并将其展示给紧张的用户



Answer 3:

由于诉2.1.19 RequireJS已onNodeCreated config属性。 如果分配一个函数,即函数将每一个时间称为<script>元件被附加到文档加载的模块。

该功能将提供nodeconfigmoduleNameurl参数。 通过事件侦听器连接到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 。 某些触发onXhronXhrComplete虽然,这样你就可以处理它们太:

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');
      }
    }
  }
});


文章来源: requirejs load script progress
标签: requirejs