【问题标题】:Graphs - Implementing ordered, asynchronous script loads?图表 - 实现有序的异步脚本加载?
【发布时间】:2013-04-05 18:09:36
【问题描述】:

为了提高性能,有很多方法可以异步加载 JavaScript,如 SO post. 所示

但是,一般来说,如果您需要,这些方法不会保留顺序,比如依赖关系。

您可以通过哪些方式获得异步加载的好处,同时在需要时保持排序。

主干依赖是一个很好的例子。

(require.js, jquery.js) -> 主干.js

是否有实现这一点的库中可用的承诺或队列的实现?

看起来head.js 还没有使用承诺或队列。

【问题讨论】:

标签: javascript head.js


【解决方案1】:

简单的解决方案:使用Promises。 jQuery 中的 .ajax 从 1.5 版本开始提供 Promise。

如果你不能使用第三方库,你可以这样做:

var resourceData = {};
var resourcesLoaded = 0;

function loadResource(resource, callback) {
    var xhr = new XMLHttpRequest();
    xhr.onload = function() {
        var state = this.readyState;
        var responseCode = request.status;

        if(state == this.DONE && responseCode == 200) {
            callback(resource, this.responseText);
        }
    };

    xhr.open("get", resource, true);
    xhr.send();
}

//Assuming that resources is an array of path names
function loadResources(resources) {
    for(var i = 0; i < resources.length; i++) {
        loadResource(resources[i], function(resource, responseText) {

            //Store the data of the resource in to the resourceData map,
            //using the resource name as the key. Then increment the
            //resource counter.
            resourceData[resource] = responseText;
            resourcesLoaded++;

            //If the number of resources that we have loaded is equal
            //to the total number of resources, it means that we have
            //all our resources.
            if(resourcesLoaded === resources.length) {
                //Manipulate the data in the order that you desire.
                //Everything you need is inside resourceData, keyed
                //by the resource url. 
                ...
                ...
            }                    
        });
    }
}

【讨论】:

  • @livingston_mechanical 如果您触发多个异步请求,则无法保证每个请求何时完成。您想在每个都完成加载后解决依赖关系,还是在它们都完成加载后解决?
  • @livingston_mechanical 你知道依赖树吗?
  • @livingston_mechanical 我已经更新了我的答案。您可以触发所有请求,但将实际工作推迟到所有内容都加载完毕。
  • @livingston_mechanical 不,很遗憾。但是您可以查看 n-ary/generic 树,因为这基本上就是依赖树。我有一个 Java 实现 here 可能会有所帮助。但是您可能甚至不需要在解决方案中处理依赖关系树;您可以一个接一个地触发所有请求,然后等待它们全部完成,然后再进行任何工作。
  • ...回到这一点,我认为 DAG / 邻接列表更相关。找到后我会发布解决方案。
【解决方案2】:

尝试实现和使用 Combres 库。

https://www.nuget.org/packages/combres

加载顺序只是众多好处之一。缩小、css 变量、路径中的 tilda 使用(如在 asp.net 中)等只是其中的一些好处,以及组合和缓存。

【讨论】:

  • 无论您将它们放入什么顺序,在配置中,它们的加载顺序都是如此。你也可以有组。
  • 您可以按照自己的要求来放置脚本。您可以创建 CSS 和 JS 文件组并根据需要加载它们。但是对于我当前的项目,我们决定加载所有需要的 CSS 和 JS 文件,无论实际页面是否需要。这样,点击仅在第一个页面加载时,然后被压缩、最小化并缓存到单个 CSS 和 JS 资源文件中。然后,应用程序通过 Combres 使用缓存文件,而不是在每次请求时重新加载所有文件。这是一个做得很好的插件,而且很容易实现。
猜你喜欢
  • 2011-12-04
  • 1970-01-01
  • 2016-07-09
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-26
  • 2019-06-29
相关资源
最近更新 更多