2009-08-22 135 views
2

问题是这样的,我包括一个脚本,它使用另一个,但如果该依赖性还需要另一个脚本准备好了吗?这意味着加载它是不够的,但我也需要确保在执行之前调用它的初始化回调。如果允许依赖关系需要更多依赖关系并在加载后显示它们,则DOM中脚本标记的顺序不可能是正确的。JavaScript依赖解决方案与任意订购包括

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

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

我已经写了一个加载器来处理这个,完全异步,这实际上似乎是工作。但我不能动摇以前解决过的事情的直觉,或者不能那么复杂。

回答

2

如果允许依赖关系需要更多依赖关系并在加载后显示它们,则DOM中脚本标记的顺序无法正确。

那么,这些脚本试图加载自己的依赖关系,究竟是什么?这不是JavaScript的标准功能,所以没有一个答案。你如何处理它是特定于试图包含依赖关系的脚本。

对于同步加载的脚本(通过document.write包含或在加载时将脚本元素添加到DOM),您至少可以确定自己是否适合下载。对于异步加载(延迟脚本,AJAX包含或由超时触发的就绪回调),必须有一个回调机制。如果你正在混合具有不同依赖和准备回调系统的各种脚本,那将是一个痛苦。

我写了一个加载器来处理这个,完全异步,这实际上似乎是工作。但我不能动摇以前解决过的事情的直觉,或者不能那么复杂。

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

+0

他们是GUI组件。有些是抽象的,其他的很像应用程序,对话框等。我的目标是让它们尽可能地孤立,并缩短页面加载时间。 但是在阅读你的答案后,我认为即使不让脚本添加依赖关系也不会让它变得更简单,因为我需要用于追踪包含组件状态的机制,即使列表不会更新后的内容。 – 2009-08-22 12:18:11

2

有几种方法可以解决您的问题几乎所有的方法都在这个Javascript Dependency Management演示文稿中。

更好地解决您的问题的是使用jingo库。对于引用

jingo.declare({ 
    require: [ 
     'hallmart.Greeter' 
    ], 
    name: 'hallmart.Store', 
    as: function() { 
     hallmart.Store = function() { 
     var greeter = new hallmart.Greeter(); 
     this.admit = function(customer) { 
      greeter.welcome(customer.name); 
     }; 
     }; 
    } 
}); 

见code.google.com/p/jingo/wiki/GettingStarted:

基本上与jingo¹你可以做这样的事情来声明具有相关性的模块。

¹code.google.com/p/jingo/

0

我有偏见,但我最近创建一个JavaScript依赖经理叫Pyramid。它看起来与其他依赖管理器类似(除了一些关键特性外,它可能与您创建的那个类似)。

  1. 它可以加载任何文件,而不仅仅是JavaScript,让我们来定义文件如何包含在您的网页中。在开发过程中,我使用它来加载不仅我的JavaScript和CSS文件,而且还将html插入到我的主页面。这使我可以单独存储我的html视图(这对于像淘汰赛这样的库非常适用)
  2. 当发布时间结合您的文件。
  3. 完全用JavaScript编写,所以设置很简单。您不必担心外部工具。
  4. 您只需设置所有html文件的包含脚本一次。在此之后,所有的文件都可以在一个单一的依赖加载程序文件被更新(而不是当脚本被重命名,删除了所有的头不断更新的包含文件,或添加)

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>