我有两个从同一域加载的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加载模块。在下面的示例中,
text1
和text2
是不同的模块实例,即使它们本质上是同一文件。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.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"
模块。