【问题标题】:r.js, almond: Is it possible for two .js files containing almond to share dependencies?r.js, almond:两个包含 almond 的 .js 文件是否可以共享依赖关系?
【发布时间】:2014-03-18 21:32:34
【问题描述】:

是否可以将杏仁与多页设置一起使用,如下所示:

common.js 已加载到所有页面并包含 almond、bootstrap 和 jquery

main1.js 仅在第 1 页加载并包含杏仁和需要 jquery 的 app/main1.js。 当我为 main1.js 运行构建时,我排除了 bootstrap 和 jquery,因为它们是共同的。

第 1 页 common.js 和 main1.js 已加载,但出现错误:Uncaught Error: app/main1 missing jquery

是否可以用杏仁来做这件事,还是我做错了什么?

更新: 我正在使用 django-require 它将 python 对象转换为 r.js 的命令行条目,此外,它将提供的模块重命名为“almond”并将命名模块添加到包含中(这可能是导致我的错误的原因?)。另请注意,django-require 不允许包含/排除 REQUIRE_STANDALONE_MODULES,我添加了此功能:

REQUIRE_STANDALONE_MODULES = {

    "common": {
        "out": "common.js",
        "include": ["bootstrap", "jquery"],
        "build_profile": "module.build.js"
    },
    "main1": {
        "out": "main1.js",
        "exclude": ["bootstrap", "jquery"],
        "build_profile": "module.build.js"
    }
}

Main1.js

require(['app/main1']);

这将转换为这样的构建文件条目:

modules = {
    "almond": {
        "out": "common.js",
        "include": ["common", "bootstrap", "jquery"],
        "build_profile": "module.build.js"
    },
    "almond": {
        "out": "main1.js",
        "include:"main1", 
        "exclude": ["bootstrap", "jquery"],
        "build_profile": "module.build.js"
    }
}

【问题讨论】:

    标签: javascript requirejs r.js almond


    【解决方案1】:

    这是可能的。你只需要清楚你的包含和排除。在以下设置中,所有模块都存储在js 子目录中,优化输出到build。为简单起见,jQuery 存储为js/jquery.js,因此无需调用require.config

    js 中的文件为:almond.jsjquery.jsmain1.jsmain2.js

    这是构建配置:

    ({
        baseUrl: "js",
        optimize: "none", // So that we can see what is going on in the bundles.
        dir: "build",
        removeCombined: true,
        skipDirOptimize: true,
        modules: [
            {
                name: "common",
                create: true,
                include: ["almond", "jquery"]
            },
            {
                name: "main1",
                exclude: ["jquery"],
                insertRequire: ["main1"]
            },
            {
                name: "main2",
                exclude: ["jquery"],
                insertRequire: ["main2"]
            }
        ]
    })
    

    公共模块的create: true 选项是必需的,以便优化器创建它。据推测,对require.config 的调用将被放入js/common.js,然后您将删除此选项。

    此优化的结果在第 1 页加载:

    <script type="text/javascript" src="build/common.js"></script>
    <script type="text/javascript" src="build/main1.js"></script>
    

    第 2 页将加载 build/main2.js

    加载 Bootstrap 需要一个与一般情况相同的 RequireJS 配置,否则在上面的代码中与 jQuery 完全一样。

    【讨论】:

    • 在原始问题中查看我的更新。我的构建设置和你一样。另请注意,我的 common 模块实际上以 common.js 存在,因此我不需要 create=true 并且 require 调用是在 common、main1 和 main2 中进行的,因此不需要插入 require。 @路易斯
    • main1.js 调用require(['app/main1']),这是未找到的模块。但是,此模块的代码确实存在于构建文件中。那么可能将 main1 重命名为 almond 是导致问题的原因吗?
    • 又救了我!谢谢@Louis。
    • @louis 嘿,看来我忘了接受这个出色的答案。对于延误,我深表歉意。
    • @arctelix 很高兴能提供帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 2011-02-23
    • 2014-08-07
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多