具有任意有序包含的Javascript依赖解决方案

时间:2009-08-22 11:01:34

标签: javascript dependencies

问题在于,我包含一个脚本,它使用另一个脚本,但如果该依赖项还需要另一个脚本准备好怎么办?这意味着加载它是不够的,但我还需要确保在执行之前调用了它的初始化回调。如果允许依赖关系需要更多依赖关系并在加载后将它们显示出来,那么DOM中脚本标记的顺序可能不正确。

当脚本和依赖项需要多个依赖项或文件满足多个组件时,问题会变得更加复杂。

使用.js似乎有一个很好的方法,但首先,依赖关系应该在加载之前知道,其次作者声明一些测试不再适用于Firefox。我怀疑这是阻止执行的事情,这看起来有点神奇。

我已经编写了一个加载器来处理这个,完全异步,实际上似乎是有效的。但我无法撼动做某事的直觉,以前已经解决了,或者不能那么复杂。

3 个答案:

答案 0 :(得分:2)

  

如果允许依赖项需要更多依赖项并在加载后显示它们,那么DOM中脚本标记的顺序可能不正确。

那么,这些脚本试图加载自己的依赖项究竟是什么呢?这不是JavaScript的标准功能,因此没有一个答案;你如何应对它是特定的尝试包含依赖的脚本。

对于同步加载的脚本(通过document.write包含或在加载时将脚本元素添加到DOM),您至少可以确保自己很好地上传。对于异步加载(延迟脚本,AJAX包含或由超时触发的ready-callbacks),必须有一个回调机制。如果您正在混合具有不同依赖性和就绪回调系统的各种脚本,那将会非常痛苦。

  

我已经编写了一个加载器来处理这个,完全异步,实际上似乎是有效的。但我无法撼动做某事的直觉,以前已经解决了,或者不能那么复杂。

不,不是真的。依赖性处理和动态脚本插入总是有点复杂。唯一“解决”的标准方法是完全静态脚本,手动以依赖顺序编写它们。

答案 1 :(得分:2)

答案 2 :(得分:0)

我有偏见但我最近创建了一个名为Pyramid的javascript依赖关系管理器。它似乎与其他依赖管理器类似(并且可能与您创建的相似),除了一些关键功能。

  1. 它可以加载任何文件,而不仅仅是javascript,让你定义文件如何包含在你的网页中。在开发过程中,我使用它不仅加载我的javascript和css文件,还将html插入我的主页面。这让我可以单独存储我的html视图(这对像淘汰这样的库来说很棒)
  2. 在发布时将文件合并。
  3. 完全用javascript编写,因此设置很简单。您无需担心外部工具。
  4. 您只需为所有html文件设置一次包含脚本。之后,可以在单个依赖项加载器文件中更新所有文件(而不必在重命名,删除或添加脚本时不断更新所有标头中的包含文件)
  5. Pyramid Dependency Manager documentation

    一些示例代码,用于说明它在开发过程中的工作原理。

    文件: dependencyLoader.js

    //Set up file dependencies
    Pyramid.createOrUpdate({
        name: 'standard',
        files: [
        'standardResources/jquery.1.6.1.min.js'
        ]
    });
    
    Pyramid.createOrUpdate({
    name:'lookAndFeel',
    files: [
        'styles.css',
        'customStyles.css'
        ]
    });
    
    Pyramid.createOrUpdate({
    name:'main',
    files: [
        'createNamespace.js',
        'views/buttonView.view', //contains just html code for a jquery.tmpl template
        'models/person.js',
        'init.js'
        ],
        dependencies: ['standard','lookAndFeel']
    });
    

    Html文件

    <head>
        <script src="standardResources/pyramid-1.0.1.js"></script>
        <script src="dependencyLoader.js"></script>
        <script type="text/javascript">
            Pyramid.load('main');
        </script>
    </head>