为什么我的RequireJS忽略了优化的main.js中的代码?

时间:2014-01-28 04:03:06

标签: javascript build requirejs optimization

我最近一直在使用RequireJS,但我是优化器的新手,我正在尝试将其添加到我的构建步骤中,但我遇到了一个问题。在它运行并将我的JS文件合并为一个之后,我的“main”的主体不再执行(在优化之前工作正常)。所有依赖JS都正确加载,但我的主define()中的实际代码没有(尽管我可以在最终的输出文件中看到它。这就是我的意思:

假设我的 main.js的简化版

console.log("This statement outputs to console");
define(["jquery", "modernizr", "jquery.joyride"], function($) {
    console.log("This statement does not");
}

正如我所提到的,我将在输出文件的内联中看到jquery,modernizer,joyride和两个console.log()语句,所以我相信它是正确生成的。我的猜测是它与我的require配置有关:

这是我的 app.js 的简化版:

requirejs.config({
    "baseUrl": "/assets/js",
    "paths": {
        "jquery": "jquery"
    },
    "shim": {
        "jquery.joyride": ["jquery"]
    }
});

requirejs(["app/main"]);

我的假设是第二次requirejs()调用没有被执行。那可能吗?会导致这种情况发生的原因以及适当的解决办法是什么?

基本上, main.js 的优化版本如下所示:

(function(e,t){ ..jquery code.. };

define("jquery.joyride", function(){});
(function(a){ ...code here... });

console.log("This statement outputs to console");
define('main',["jquery", "modernizr", "jquery.joyride"], function($) {
    console.log("This statement does not");
};

这是build config:

({
    appDir: '../../',
    baseUrl: "assets/js",
    mainConfigFile: '../../assets/js/app.js',
    dir: '../../../BUILD/',
    optimizeCss: 'default',
    modules: [
        {
            name: "main"
        }
    ],
    removeCombined: true,
    preserveLicenseComments: false,
    optimize: 'none' // I Disabled this to help me try and debug
})

它也有帮助,这是我用来包含我的JS的行(在我优化文件之前和之后的相同行):

<script data-main="/assets/js/app" src="/assets/js/require.js"></script>

1 个答案:

答案 0 :(得分:0)

所以仔细观察上面分享的代码......问题是main.js的优化版本没有添加正确的模块名称(define("main"[应该是define("app/main"[。我怀疑这与两件事之一有关:

  1. r.js配置文件中的错误模块名称
  2. app.js中的错误模块引用
  3. 首先,测试/证明我的假设: manualy 编辑main.js的优化版本以匹配我上面提到的(“app / main”代替“main”)。如果有效,那么尝试这些东西(一次一个,而不是同时):

    1. 用于解决#1,在您的r.js配置文件中...将name:"main"更改为name:"app/main"
    2. for#2,在您的app.js中,将requirejs(["app/main"]);更改为requirejs(["main"]);