Как я могу исправить этот конфликт пути AMD?

Я пытаюсь использовать API Esri ArgGis JavaScript, который загружается Dojo, используя dojo.require. У меня есть существующее модульное приложение AMD/requirejs Typescript, в которое мне нужно интегрировать этот код. В верхней части моего исходного файла TS я импортирую несколько модулей:

import tracer = module('../classes/trace');
import pubsub = module('../classes/pubsub');
import masker = module('../classes/masker');
// etc.

Это работало нормально, но теперь, когда я добавил код ArcGis, вместо разрешения относительного пути в моем приложении, require.js получил baseUrl с сайта Esri и попытался загрузить:

http://serverapi.arcgisonline.com/jsapi/arcgis/3.3/js/esri/classes/trace.js
// etc.

Результатом является строка из 404 ответов и ошибок скрипта.

Как я могу это исправить?

Я попытался установить baseUrl requirejs в заголовке моего html-файла перед загрузкой первого документа, который загружает модули:

 <script src="http://serverapi.arcgisonline.com/jsapi/arcgis/3.3"></script>
 <script type="text/javascript" src="/content/client/libs/require.js"></script> <!-- data-main="/content/client/hop/hop.app" -->
 <script type="text/ecmascript">
        require.config({
            baseUrl: "/Content/client/hop/"
        });
 </script>
 <script src="~/Content/client/hop/hop.app.js"></script>

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

(Примечание. Если я изменю порядок в заголовке html-документа так, чтобы API-интерфейс arcgis был последним в последовательности загрузки, то я получу противоположную проблему: все мои локальные файлы работают нормально, но dojo и API-интерфейс сопоставления терпят неудачу, потому что они ищут пути относительно моего сайта, когда они должны искать на сервере argis).


person Jude Fisher    schedule 13.03.2013    source источник


Ответы (2)


Я работаю с Esri ArcGIS API, поэтому столкнулся именно с этой проблемой. Этот пост в блоге от додзё мне немного помог.

Первая проблема заключается в том, что dojo настроен не так, как requirejs. Он ищет ранее определенный dojoConfig для настройки. Во-вторых, загрузка модулей Esri настроена на один базовый путь, а вашему коду понадобится другой. Вам понадобится конфигурация додзё, которая выглядит примерно так:

dojoConfig = {
    baseUrl: location.pathname.replace(/\/[^/]+$/, '') + '/Content/client/hop/',  // magic!
    packages: [
        {
            name: 'dojo',
            location: "http://serverapi.arcgisonline.com/jsapi/arcgis/3.3compact/js/dojo/dojo/"
        },
        {
            name: 'dojox',
            location: "http://serverapi.arcgisonline.com/jsapi/arcgis/3.3compact/js/dojo/dojox"
        },
        {
            name: 'esri',
            location: "http://serverapi.arcgisonline.com/jsapi/arcgis/3.3compact/js/esri"
        }
    ]
};

Что это делает, так это устанавливает базовый путь обратно к текущему URL-адресу плюс ваши дополнительные данные, а затем сообщает dojo, где находятся материалы esri. Это все пакеты, с которыми я столкнулся, но если есть зависимость, которую я пропустил, потому что она просто никогда не загружалась для меня, для нее потребуется аналогичная запись.

Другая проблема, с которой вы можете столкнуться, заключается в том, что если вы привыкли загружать свой скрипт локально как file://, теперь dojo из другого домена попытается получить доступ к file://, и браузер закроет это право. С этого момента вам нужно будет протестировать на локальном http-сервере. В Windows я предпочитаю HFS, а в Linux python упрощает работу.

Надеюсь, это поможет.

person Jeffery Grajkowski    schedule 13.03.2013
comment
Спасибо Джеффри - это действительно полезно. Пока я поместил карту в iframe, чтобы уложиться в срок, но я попробую это на следующей неделе и соглашусь, если это сработает. - person Jude Fisher; 13.03.2013

У меня было несколько проблем с использованием dojo вместе с requirejs из-за require() конфликтов между ними. Вам следует взглянуть на ошибку додзё 15616. Вы можете просмотреть эту тред из групп Google, в котором Джеймс предлагает все додзё или все требуемые.

Я не уверен, какую версию dojo вы используете, но рекомендуется проверить из исходного кода, поскольку есть изменения, связанные с requirejs/dojo, которых нет в опубликованной версии 1.8.

Если ваша единственная проблема связана с ошибкой 404, вызванной конфликтом baseUrl, обходным путем может быть создание файла .d.ts, который использует псевдоним пути, например ../classes/trace, и заменяет его рабочим путем (абсолютным или нет).

person ryan    schedule 13.03.2013
comment
Спасибо, Райан - полезная информация. - person Jude Fisher; 13.03.2013