r.js到底做了什么?

时间:2014-10-06 20:07:33

标签: javascript requirejs amd r.js

我试图了解热门r.js的好处。

似乎......

  • 连接手动选择的 JavaScript文件
  • 列表
  • uglify /最小化组合代码
  • 为CSS文件做一些类似的事情(合并它们)

此外,(它与通用组合/缩小工具的不同之处)似乎......

  • 将节点式require()模块转换为AMD样式模块
  • 命名匿名模块(例如define(['dependency'], function(){...}
  • 为装载程序插件提供一些支持,例如:内联CSS文件

似乎......

  • 分析并自动解决文件中的依赖关系(例如,将文件foo.js包含到包中),因为r.js找到define(["foo"], ...)

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

1 个答案:

答案 0 :(得分:5)

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

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

然后,如果您要求r.js使用main.js生成优化模块,将模块foo的代码包含在构建中。< / p>

一些警告:

  1. 可以告诉r.js排除模块。因此,如果您认为应该在优化捆绑中的模块不存在,则可能是它已被排除。 (您知道如何使用r.js,但如果您使用别人生成的捆绑包并且您想知道,那么这可能就是答案:它们明确地排除了构建中的依赖项。)

  2. 除非您告知,否则
  3. r.js找不到嵌套依赖项。例如:

    define(function () {
        require(["foo"], function (foo) {
        });
    });
    
    除非您在构建配置中将r.js设置为foo,否则

    findNestedDepencencies将无法找到true

  4. r.js只能找到以requiredefine调用期望依赖关系的位置放置为文字的字符串列表形式指定的依赖项。所以如果你这样做:

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

    然后r.js将不知道foo是依赖项,因为在require(deps, ...中,您的依赖项显示为符号引用,而不是字符串列表。您必须在构建配置中手动指定foo作为依赖项。没有标记可以让r.js找到这些案例。