Javascript 确保在r.js优化的应用程序中调用RequireJS模块

Javascript 确保在r.js优化的应用程序中调用RequireJS模块,javascript,optimization,requirejs,r.js,Javascript,Optimization,Requirejs,R.js,我有一个模块,它只是执行一些代码来覆盖一些现有的功能。模块不返回任何值。看起来有点像这样: // module "patch.js" define(function (require) { var lib = require("lib"); lib.foo = function () { // overwrite foo function here } }); // main.js require.config({ shim: {

我有一个模块,它只是执行一些代码来覆盖一些现有的功能。模块不返回任何值。看起来有点像这样:

// module "patch.js"
define(function (require) {
    var lib = require("lib");
    lib.foo = function () {
        // overwrite foo function here
    }
});
// main.js
require.config({
    shim: {
        "app": {
            deps: ["patch"]
        }
    }
});
// main.js
require(["app"],function (app) {
    app.start();
});
然后我将其定义为我的主应用程序模块的依赖项,如下所示:

// module "patch.js"
define(function (require) {
    var lib = require("lib");
    lib.foo = function () {
        // overwrite foo function here
    }
});
// main.js
require.config({
    shim: {
        "app": {
            deps: ["patch"]
        }
    }
});
// main.js
require(["app"],function (app) {
    app.start();
});
然后我像这样启动应用程序模块:

// module "patch.js"
define(function (require) {
    var lib = require("lib");
    lib.foo = function () {
        // overwrite foo function here
    }
});
// main.js
require.config({
    shim: {
        "app": {
            deps: ["patch"]
        }
    }
});
// main.js
require(["app"],function (app) {
    app.start();
});
当运行未优化的版本时,这可以正常工作。“补丁”模块在应用程序启动之前加载,并调用其中的代码。一切都很好

当我使用r.js进行优化时,问题就开始了。我注意到“补丁”模块的代码被拉入优化文件,但从未被调用

我可以通过在我的应用程序代码中的某个地方显式调用
require(“patch”)
来强制调用它,但我宁愿在配置中定义这个依赖项

未优化模块和优化模块之间行为差异的原因是什么?为什么自动调用未优化的模块,而优化的模块包含在构建文件中,但从未调用?我可以用配置选项解决这个问题吗?我可以改变我定义“补丁”模块的方式来获得我想要的行为吗

==编辑:添加r.js配置==

我正在使用grunt contrib requirejs。配置非常简单

{
    baseUrl: "site/js",
    mainConfigFile: "site/js/main.js",
    out: "build/js/main.js",
    name: "main",
    optimize: "uglify2",
    removeCombined: false
}

有几件事需要指出

  • 垫片配置应仅用于非AMD模块。例如,您试图集成一个未在
    define
    函数中定义的jQuery插件。因此,这段代码不是必需的,甚至可能破坏您的应用程序:

    require.config({
        shim: {
            "app": {
                deps: ["patch"]
            }
        }
    });
    
  • 其次,尝试在r.js优化器中定义应用程序中的模块

    {
        baseUrl: "site/js",
        mainConfigFile: "site/js/main.js",
        out: "build/js/main.js",
        name: "main",
        optimize: "uglify2",
        removeCombined: false,
        modules : [
            {
                name : 'site/js/main.js'
            }
        ]
    }
    
  • 通过这种方式,r.js将知道如何正确绑定main.js模块及其所有依赖项


    希望这有帮助

    有几件事需要指出

  • 垫片配置应仅用于非AMD模块。例如,您试图集成一个未在
    define
    函数中定义的jQuery插件。因此,这段代码不是必需的,甚至可能破坏您的应用程序:

    require.config({
        shim: {
            "app": {
                deps: ["patch"]
            }
        }
    });
    
  • 其次,尝试在r.js优化器中定义应用程序中的模块

    {
        baseUrl: "site/js",
        mainConfigFile: "site/js/main.js",
        out: "build/js/main.js",
        name: "main",
        optimize: "uglify2",
        removeCombined: false,
        modules : [
            {
                name : 'site/js/main.js'
            }
        ]
    }
    
  • 通过这种方式,r.js将知道如何正确绑定main.js模块及其所有依赖项


    希望这有帮助

    你能提供你的r.js优化器配置吗?谢谢,刚刚添加。你能提供你的r.js优化器配置吗?谢谢,刚刚添加。谢谢,伙计,这让我走上了正确的道路。我认为关键信息与你的第一点有关。仅对非AMD模块的配置使用垫片,不用于AMD模块的引导DEP,尤其是我的主“应用”模块。我将“app”移出了shim,并在“app”本身中明确定义了它的主要dep。现在情况似乎好多了。再次感谢,谢谢,伙计,这让我走上了正轨。我认为关键信息与你的第一点有关。仅对非AMD模块的配置使用垫片,不用于AMD模块的引导DEP,尤其是我的主“应用”模块。我将“app”移出了shim,并在“app”本身中明确定义了它的主要dep。现在情况似乎好多了。再次感谢。