2014-10-06 60 views
2

我想了解流行的r.js的好处。r.js真的做了什么?

它似乎...

  • 串联的手动选择 JavaScript文件列表
  • 丑化/最小化组合代码
  • 做CSS文件(将它们组合起来)
  • 一些类似的东西

另外,(是什么使它不同于通用组合/缩小工具)它似乎......

  • 转换节点式require()模块,AMD风格模块
  • 名匿名模块(例如。 define(['dependency'], function(){...}
  • 为加载器插件提供了一些支持,例如,内联CSS文件

似乎...

  • 分析,并自动解决文件(如,包括文件foo.js到包中发现的依赖只是因为r.js找到一个define(["foo"], ...)

这是正确的,还是我错过了什么?

+0

恩,是我的编辑不正确,你真的认为它应该“*包括文件'foo.js'到包中,只是因为r.js发现一个** define([”foo“],。 ..)'***“?如果代码已经存在('foo'被定义),我不明白你为什么要加载'foo.js'文件。 – Bergi 2014-10-06 20:15:41

+0

[RequireJS/Optimization](http://requirejs.org/docs/optimization.html):“[r.js]将相关脚本合并到构建图层并缩小它们”。依赖关系图本身*在运行时仍被解析*,所有模块都被简单地推在一起,因此不需要单独的资源提取。 – user2864740 2014-10-06 20:16:31

+0

@Bergi:不知道你的编辑,但是,我想确保r.js不会自动解决任何依赖关系是正确的。我不是说它*应该*这样做。在我看来,r.js会做一些沉重的JavaScript解析/处理,并且希望确保我理解该过程中的所有步骤。 – 2014-10-06 20:22:38

回答

4

你错了,因为r.js会自动解决依赖关系。如果你有一个main.js文件与此:

define(["foo"], function (foo) { 
}); 

然后,如果你问r.js创建生成优化模块出main.js,它包括模块foo到生成的代码。

一些注意事项:

  1. 它可以告诉r.js排除模块。因此,如果您认为某个模块应该位于优化包中,则该模块不存在,可能是它已被排除。 (你知道你是如何使用r.js但如果您使用别人产生了扎,你想知道,那么这可能是答案:他们明确排除从生成的依赖)

  2. r.js未找到嵌套依赖关系,除非你告诉它。例如:

    define(function() { 
        require(["foo"], function (foo) { 
        }); 
    }); 
    

    r.js不会发现,除非你在构建配置设置findNestedDepencenciestruefoo是必需的。

  3. r.js可以找到只有在放置在其中requiredefine调用将依赖位置的文本字符串列表的形式指定的依赖。所以,如果你这样做:

    define(function() { 
        var deps = ["foo"]; 
        require(deps, function (foo) { 
        }); 
    }); 
    

    然后r.js不会知道foo是一个依赖,因为在require(deps, ...你的依赖表现为一个符号参考,不作为字符串列表。您必须在构建配置中手动指定foo作为依赖项。没有任何标志可以让r.js找到这些情况。

+0

谢谢。这使事情变得清晰了。 – 2014-10-07 07:29:49