图 - 将依赖关系建模为并行/序列

时间:2013-03-30 22:55:22

标签: javascript

如何获取一组依赖关系并将其建模为串行和并行操作?

例如:

U1取决于U2

可以是

的连续表示
S: [U1, U2]

U1和U2不依赖是并行表示。

P: [U1, U2]

S表示串行,P表示并行。在此示例中,U指的是指向资源的URL。

在并行资源中,排序无关紧要。在串行资源中,排序很重要。

我正在尝试构建资源加载器。

它只需要与本地服务器一起使用。此外,它只使用Ajax get请求来加载资源。

但我想用一种语言/语法来模拟依赖资源的复杂性。

澄清和示例

这是为了学习/以后的实施。没有外部库,除非您可以将它们用于加载的语法与问题联系起来。

示例1

Jqueryui依赖于jquery。这将表示为......

S: [U-jquery, U-jqueryui]

示例2

jquery.js不依赖于underscore.js。这将表示为......

P: [U-jquery, U-underscore]

示例3

backbone.js取决于underscore.js和jquery.js

P:[U-underscore, U-jquery] // group1
S:[some_notation to represent group1, U-backbone.js]

2 个答案:

答案 0 :(得分:1)

  

除非您可以将用于加载的语法与问题相关联,否则不要使用外部库。

您可能希望查看require.js以及它如何指定其依赖项。 MediaWiki的ResourceLoader也很有趣,虽然JS依赖关系图是由PHP脚本动态生成的,但它的结构可能是相关的。

  

Jqueryui依赖于jquery。这将表示为......

S: [U-jquery, U-jqueryui]

可能,为什么不呢。但是我不确定你是否想发明自己的DSL用于依赖管理;如果您更愿意坚持使用标准的JSON /对象文字,我建议使用对象的键来表示您声明其依赖关系的模块,然后将其列为值:

deps = {
    "U-jqueryui": /*depends on*/ ["U-jquery" /*and nothing else*/]
};
  

jquery.js不依赖于underscore.js。这将表示为......

P: [U-jquery, U-underscore]

我不明白。为什么需要明确声明?所有不相关的东西(不会[明确地]以某种方式相互依赖)应默认为无序加载/执行。否则,您将拥有指数量的独立模块的P声明;如果你错过了会发生什么?

  

backbone.js取决于underscore.js和jquery.js

P:[U-underscore, U-jquery] // group1
S:[some_notation to represent group1, U-backbone.js]

我只会使用与示例#1中相同的形式:

deps = {
    "U-backbone.js": /*depends on*/ ["U-underscore", /*and*/ "U-jquery"]
};

如果你确实需要某些组,你可以创建它们就像一个没有主体的模块,它只是加载它的所有依赖项并提供它们。在你的加载器代码中然后为它们做一些例外(基于不以U-开头的名称?)因此它们不会触发实际的ajax请求。您的最终依赖对象将看起来像

deps = {
    "U-jqueryui": ["U-jquery"],
    "group1": ["U-underscore", "U-jquery"],
    "U-backbone.js": ["group1"]
};

答案 1 :(得分:-1)

检查Modernizr.load

  

你很可能对自己并不十分不满   脚本下载速度现在,但你会很高兴知道   Modernizr.load不会减慢任何速度,有时可以提供   通过异步加载脚本来提高性能   平行。这个领域有很多变量需要权衡,所以我们   建议你尝试一些事情来确保你获得最大化   针对您的具体情况的表现。

http://modernizr.com/docs/