我有两个从同一域加载的Javascript文件。每个JS执行不同的功能,为此,我使用了requirejs模块加载器。
我的问题是,我在js和下都使用了require.config调用baseUrl 对于两种配置都不同。
JS1

require.config({
                baseUrl : server + "js/", // server is 192.168.1.10:3000/
                paths :
                {
                    jquery : "jquery",
                    moment : "moment.min"
                },
                waitSeconds: 20
            });
            require(["jquery","moment"], function(jQuery,moment)
            {
                jQuery.noConflict();
                window.moment = moment;
                jQuery(function($)
                {
                    window.$191 = $;
                    callback($191);
                });
            });

JS2
require.config({
                baseUrl: "http://192.168.1.9:6060/App/resources",
                paths:
                {
                    moment: "js/moment.min",
                    ejs :  "js/ejs"
                }
            });
require(["moment","ejs"],function()
{
        callback("OK");
});

我先加载 JS1 ,然后再加载 JS2 ,但是当我加载JS2时,它的baseUrl改变了第一个,即从 JS1 (服务器+“js /”)开始!这是完全错误的。如果我做错了事,可以有人指出我吗。

最佳答案

Nikos Paraskevopoulos对于一种方法(多版本)具有正确的想法,但我认为有两种方法。

1.使用多版本

将两个配置传递给require.config()将返回两个独特的require函数。

// It is important to give the config objects a "context" name.
// This is what keeps them unique.
var r1 = require.config({
    context: "r1",
    baseUrl: "//rawgithub.com/requirejs/text/2.0.10/"
});
var r2 = require.config({
    context: "r2",
    baseUrl: "//cdnjs.cloudflare.com/ajax/libs/require-text/2.0.10/"
});

此外,即使您在上面的示例中的每个配置中使用了相同的baseUrl,由于多版本支持的性质,每个text模块也将是唯一的实例。

这些可用于从不同的URL加载模块。在下面的示例中,text1text2是不同的模块实例,即使它们本质上是同一文件。
r1(["require", "text"], function(r, text1) {
    // ...
});
r2(["require", "text"], function(r, text2) {
    // ...
});

如果您在模块主体中使用"require"语法,则需要var myModule = require("...");模块作为依赖项。

如果在依赖项数组中声明了所有依赖项,则不需要此。

(this jsfiddle上有一个简单的示例)

但是回到您的示例,您可以为每个文件分配本地需求功能,并通过该本地需求功能加载模块。

JS1
(function () {
    var r = require.config({
        context: "JS1",
        baseUrl: server + "js/", // server is 192.168.1.10:3000/
        paths: {
            jquery: "jquery",
            moment: "moment.min"
        },
        waitSeconds: 20
    });
    r(["jquery", "moment"], function (jQuery, moment) {
        jQuery.noConflict();
        window.moment = moment;
        jQuery(function ($) {
            window.$191 = $;
            callback($191);
        });
    });
}());

JS2
(function () {
    var r = require.config({
        context: "JS2",
        baseUrl: "http://192.168.1.9:6060/App/resources/",
        paths: {
            moment: "js/moment.min",
            ejs: "js/ejs"
        }
    });
    r(["moment", "ejs"], function () {
        callback("OK");
    });
}());

在旁边

但是,模块不以对define()函数的调用开头就很不寻常了。通常,config和模块位于单独的文件中。所以你可能有:
  • JS1-config.js和JS1.js
  • JS2-config.js和JS2.js

  • JS1.js和JS2.js的形式为:
    define(["array", "of", "dependencies"], function(array_, of_, dependencies_) {
    });
    

    2.使用整合的require配置

    单个模块加载程序配置文件可能会更好地为内聚应用程序提供服务。您对所有必需模块都具有可见性,并且如果要使用r.js优化器,它可能会更好地发挥作用。

    因此,我建议将您的配置合并为应用程序的单个配置。这样,您就不会将模块加载器配置与实际使用模块的代码混合在一起。

    如果您无法修改某些代码,那么这样做可能会很棘手。

    例如。:
    var baseUrl1 = server + "js/";
    var baseUrl2 = "http://192.168.1.9:6060/App/resources/";
    require.config({
        paths: {
            jquery: baseUrl1 + "jquery",
            moment: baseUrl1 + "moment.min",
            //moment: baseUrl2 + "js/moment.min",
            ejs: baseUrl2 + "js/ejs"
        },
        waitSeconds: 20
    });
    

    假设两个JS文件都可以使用相同的"moment"模块。

    09-17 16:33