如何使用r.js获取单个javascript页面

时间:2013-12-22 12:37:53

标签: requirejs

我正在尝试使用requireJS并且效果很好! 我现在想使用优化器,我在浏览器中运行代码时遇到了一些问题。

我有这些JS文件:

  • /public/javascripts/build.js
  • /public/javascripts/main.js
  • /public/javascripts/lib/jquery.min.js
  • /public/javascripts/lib/require.min.js
  • /public/javascripts/a.js
  • /public/javascripts/b.js
  • /public/javascripts/c.js

a.js,b.js和c.js是我使用requireJS为我的应用程序定义的模块。

main.js:

require.config({
    paths: {
        'jQuery': 'lib/jquery.min.js'
    },
    shim: {
        'jQuery': {
            exports: '$'
        }
    }
});
require(['a.js'], function(A){
    var Entity = new A();
});

build.js

({
    baseUrl: ".",
    paths: {
        requireLib: "lib/require.min",
        jquery: "lib/jquery.min"
    },
    name: "main",
    out: "main-built.js",
    include: ["requireLib"]
})

此外,我想知道为什么我们必须将库的路径指定为build.js而不是其他javascript文件。

当我不使用优化器并仅加载文件时 <script src="/javascripts/lib/require.min.js" data-main="/javascripts/main"></script> 它工作得很好,但是当我运行r.js -o ./public/javascripts/build.js并且只加载时 <script src="/javascripts/main-built.js"></script>我在缩小的代码中收到错误Uncaught TypeError: undefined is not a function

如何解释?

以下是运行r.js时获得的日志

Tracing dependencies for: main
Uglifying file: /public/javascripts/main-built.js

/public/javascripts/main-built.js
----------------
/public/javascripts/lib/require.min.js
/public/javascripts/a.js
/public/javascripts/b.js
/public/javascripts/lib/jquery.min.js
/public/javascripts/c.js
/public/javascripts/main.js

2 个答案:

答案 0 :(得分:1)

这绝对是错误的:

require(['a.js'], function(A){
    var Entity = new A();
});

您不应在向requiredefine提供的依赖项列表中使用扩展程序。模块应该没有扩展名。所以这里'a',而不是'a.js'。使用'a.js'将导致RequireJS在优化程序运行后无法加载您真正想要的内容。假设您有一个名为a.js的文件,其中包含:

define(function () {
    return function () {};
});

优化器会将其包含在您的main-built.js文件中,如下所示:

define("a", function () {
    return function () {};
});

注意define的第一个参数现在是"a"。这已由r.js添加。这是模块的名称。加载main-built.js时,会定义名为"a"的模块。当您将require"a.js"一起使用时,您告诉RequireJS您想要一个名为a.js文件中的内容,因此RequireJS将会查找并忽略其中的内容main-built.js

此外,jQuery 1.8或更高版本不需要垫片。

答案 1 :(得分:-1)

我刚刚添加了

shim: {
    'jQuery': {
        exports: '$'
    }
}

进入build.js文件,它完美无缺!

谢谢!