0

几天前我遇到了一个问题,这意味着我需要 JS 加载器。

我有以下文件:

#c.js
var c = {//something};

#b.js
var b = Object.create(c);

#main.js
var a = Object.create(b);
a.foo = 'bar';

我需要从“c.js”开始按顺序加载这些文件。

我对 js 加载器进行了一些快速研究,发现它们中的许多不能工作(或者工作但以丑陋的方式)具有像我的示例这样的深层依赖关系,并且只要它们加载给定依赖关系就启动一个回调函数,而不必担心给定依赖项中的依赖项(如果您现在是我的意思)。

尽管像 requireJs 这样的一些严肃的加载器可以做到这一点,但我发现它们在这种情况下有点烦人:

define([
  'jQuery',
  'Underscore',
  'Backbone',
  'views/projects/list',
  'views/users/list'
], function($, _, Backbone, Session, projectListView, userListView){

...太多的代码,只有很少的依赖。

我也不喜欢我应该修改一些脚本,所以当它应该返回 $ 时,它们会返回类似于 jQuery 的东西。

太节省我的时间并避免尝试所有加载程序,我创建了这个问题。

所以,最大的问题是,哪个 JS 加载器可以执行以下操作:

  1. 加载“深度”依赖项,就像我的示例一样,只有在加载所有依赖项和依赖项的所有依赖项(...等)时才会启动 callback() 。
  2. 占用空间小,就像拥有一个 reuqire 函数,带有依赖列表和回调,并且不需要“回调”来返回和传递一些东西(因为通常我有自己的命名空间,比如 ga、gb、gc)。

我希望看到的一些例子:

#c.js
require([], function(){
var c = {//something};
});

#b.js
require(['c.js'], function(){
var b = Object.create(c);
});

#main.js
require(['b.js'], function(){
var a = Object.create(b);
a.foo = 'bar';
});

*对不起我的英语不好。

Ps - 实际上我写了我自己的加载器,它确实给出了一些东西,并且比 $script.js 更小(580 字节),虽然,当需要一些东西时,应该传递当前脚本的文件名,就像这样require('main.js', ['b.js'], function(){});- 但我没有想靠我的悟性。

4

2 回答 2

0

这是如何通过以下方式实现您的要求的一种方法require.js

// c.js
define(
    {/*something*/}
);

// b.js
define(['c.js'], function(c) {
    return Object.create(c);
});

// main.js
require(['b.js'], function(b) {
    var a = Object.create(b);
    a.foo = 'bar';
});

对我来说,这似乎非常接近你想要看到的,不是吗?

如果您有多个依赖项,例如 jQuery、Backbone 等,并且想要解耦所有内容,您最终会得到第二个清单。但是,另一种方法可能是全局加载“全局”库(如 jQuery),而不使用加载器,require.js只处理您自己的类和代码部分。

于 2012-05-05T22:18:20.670 回答
0

已经有一段时间了,因为我已经问过这个问题了。问题的解决方案只是使用 requireJs,但以另一种方式定义模块:

define(require){
  var dep1 = require("dep1"),
  dep2 = require("dep2");

  var MyModule = {//define something};

  return MyModule;
};
于 2013-10-28T13:18:01.010 回答