JS加载器具有最小的代码占用空间

时间:2012-05-05 20:09:12

标签: javascript loader amd

几天前我遇到了问题,这意味着我需要JS loader。

我有以下文件:

#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这样的一些严重的加载器可以做到这一点,但我发现它们有点令人讨厌的b / c这样的情况:

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

......代码过多,只有少数依赖。

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

我节省了时间,避免尝试所有的装载机,我创造了这个问题。

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

  1. 加载“深层”依赖项,就像我的例子一样,只有当所有依赖项和依赖项的所有依赖项(......等等)被加载时才会启动callback()。
  2. 占用空间小,就像拥有一个reuqire函数一样,具有依赖列表和回调,并且不需要“回调”来返回并传递一些东西(因为通常我有自己的命名空间,如ga,gb,gc)。
  3. 我希望如何看待它的一些例子:

    #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';
    });
    

    *对不起我的英语。

    P.S。 - 实际上我写了自己的加载器,它确实给了东西,并且更小(580bytes)甚至然后$ script.js,但是,当需要某些东西时,应该传递当前脚本的文件名,就像这样require('main.js', ['b.js'], function(){}); - 但是我不想依靠我的实现。

2 个答案:

答案 0 :(得分: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只处理自己的类和代码部分。

答案 1 :(得分:0)

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

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

  var MyModule = {//define something};

  return MyModule;
};