2015-09-21 2 views
0

У меня есть скрипты под двумя доменами:RequireJS: как загрузить js из нескольких доменов?

main.mydomain.com 
- /scripts/ 
    - entry.js 
    - userManager.js 


user.mydomain.com 
- /scripts/ 
    - user.js 
    - admin/ 
     - superUser.js 

В entry.js:

requirejs.config({ 
    baseUrl: '/scripts/', 
    paths: { 
     'userManager': 'userManager.js', 
     'user': 'http://user.mydomain.com/scripts/user' 
    }, 
    deps: ['userManager'] 
}); 

Когда я раскрываю их все под одним доменом, все отлично работает. Но когда они находятся под двумя доменами, /admin/superUser.js не загружается.

Причина, по которой я вижу: браузер пытается загрузить /admin/superUser.js с main.mydomain.com, но предполагается, что js будет загружаться с user.mydomain.com.

user.js выглядит, как показано ниже

define(['./admin/superUser'], function(superUser) { 
.... 
}) 

Как я могу конфиг requirejs сделать загрузку файла из второго домена?

ответ

2

Это не работает так, как вы делаете это потому, что относительные пути в зависимости интерпретируются относительно названия модуля, а не на пути модуля.

Вы загружаете http://user.mydomain.com/scripts/user.js как user. Поэтому, когда RequireJS интерпретирует ./admin/superUser, он принимает часть каталога user, которая пуста, и добавляет к ней admin/superUser, поэтому вы получите имя модуля admin/superUser, которое не определено в paths, и поэтому RequireJS создает для него путь, привязывая baseUrl к он и добавляет .js в конце.

Один из способов сделать это, который должен работать, чтобы получить доступ к иерархии модулей в http://user.mydomain.com/scripts в директории на ваше имя модуля пространства, так что вы могли бы поставить это в ваших путях вместо пути у вас есть для user прямо сейчас:

'userlib': 'http://user.mydomain.com/scripts' 

И затем заменить запросы модуля user на запросы . Таким образом, теперь user.js будет доступен под именем модуля . Когда этот модуль запрашивает ./admin/superUser, часть каталога имени модуля составляет userlib, а окончательное имя модуля для запроса - userlib/admin/superUser. Полное имя модуля не определено в paths, но префикс userlib определен, поэтому RequireJS использует префикс для построения конечного URL-адреса, который равен http://user.mydomain.com/scripts/admin/superUser.js.

+0

Спасибо, вы спасли меня много времени! – Zach