Путь RequireJS с расширением JS не разрешается

Я использую библиотеку, которая (очень эгоистично, ИМХО) предполагает, что baseUrl будет указывать на CDN компании:

baseUrl: "[http protocol slash slash]cdn.wijmo.com/amd-js/"

Сначала я подумал, что просто скопирую содержимое вышеуказанного URL-адреса в свою собственную папку (например, /scripts/wijmo/amd-js), но это не сработает, потому что хорошие ребята из Wijmo жестко запрограммировали ссылки на пути в своих AMD. определить операторы, такие как это:

define(["./wijmo.widget"], function () { ... });

Вышеизложенное означает (если я правильно понимаю), что если у вас есть какие-либо другие модули AMD, отличные от Wijmo, вы должны:

(а) поместите их по пути amd-js, возможно, в подпапку с именем «myScripts» (б) используйте жестко закодированные ссылки пути RequireJS на ваши собственные AMD, например:

paths: {
  "myAMD_1": "http://www.example.com/scripts/myScripts/myAMD_1",
  "myAMD_2": "/scripts/myScripts/myAMD_2.js"
}

(a) работает, но это означает, что baseUrl не может указывать на CDN Wijmo, потому что у меня нет доступа к сайту CDN Wijmo, поэтому я должен переместить файлы, опубликованные под amd-js, на свой собственный сервер.

(b) вид работы, и вот моя проблема: если я использую синтаксис myAMD_1, то все хорошо. Но это не позволяет мне тестировать на моей локальной машине разработки, которая использует localhost. (Я не хочу определять, на каком сервере я работаю, и настраивать значение пути... Я хочу, чтобы путь оставался неизменным до и после публикации на моем http-сервере.)

Теперь, согласно документации RequireJS:

Могут быть случаи, когда вы хотите напрямую сослаться на сценарий и не соответствовать правилам «baseUrl + пути» для его поиска. Если идентификатор модуля имеет одну из следующих характеристик, идентификатор не будет передаваться через конфигурацию «baseUrl + пути», а будет рассматриваться как обычный URL-адрес, относящийся к документу: * Заканчивается на «.js». * Начинается с «/». * Содержит протокол URL, например "http:" или "https:".

Когда я пытаюсь завершить (завершить) свою ссылку на путь с помощью .js (как показано в AMD_2 выше), RequireJS не находит мой AMD и потому, что в конечном итоге ищет myAMD_2.js.js (обратите внимание на два суффикса .js). Таким образом, похоже, что RequireJS больше не соблюдает то, что, как говорится в документации, он использует в качестве алгоритма разрешения пути. Поскольку суффикс .js не работает должным образом, я не могу легко исправить ссылки на свои собственные AMD, потому что я точно не знаю, какое имя сервера или структуру физического пути они будут публиковать — я действительно хочу использовать относительные пути. .

Наконец, я не хочу менять модули AMD Wijmo не только потому, что их десятки, но и потому, что мне нужно будет повторно применять свои настройки каждый раз, когда они выпускают обновление Wijmo.

Итак, если мой baseUrl должен указывать на жестко запрограммированный путь Wijmo, то как я могу использовать свои собственные AMD, не помещая их в подпапку пути Wijmo и не делая никаких предположений о фиксированном пути или URL о том, где опубликованы мои собственные AMD?


person Jazimov    schedule 19.07.2014    source источник


Ответы (1)


Я могу предложить несколько подходов для рассмотрения здесь - оба имеют некоторые недостатки, но могут работать.

Первый подход заключается в предоставлении пути для каждого модуля Wijmo, который необходимо загрузить. Это будет работать, но вы затронули очевидные недостатки этого подхода в описании вопроса: у Wijmo много модулей, на которые нужно будет ссылаться, и поддержание списка модулей при обновлениях в будущем может быть проблематичным.

Если вы можете смириться с этими недостатками, вот как будет выглядеть конфигурация RequireJS:

require.config({
    paths: {
        'wijmo.wijgrid': 'http://cdn.wijmo.com/amd-js/wijmo.wijgrid',
        'wijmo.widget': 'http://cdn.wijmo.com/amd-js/wijmo.widget',
        'wijmo.wijutil': 'http://cdn.wijmo.com/amd-js/wijmo.wijutil',
        // ... List all relevant Wijmo modules here
    }
});

require(['wijmo.wijgrid'], function() { /* ... */ });

Второй подход заключается в первоначальной настройке RequireJS baseUrl для загрузки модулей Wijmo. Затем, как только модули Wijmo будут загружены, перенастройте RequireJS, чтобы иметь возможность загружать модули вашего локального приложения. Недостаток этого подхода заключается в том, что все модули Wijmo должны быть загружены заранее, поэтому вы теряете возможность требовать модули Wijmo по мере необходимости в своих собственных модулях. Этот недостаток необходимо будет сбалансировать с неприятным перечислением явных путей для всех модулей Wijmo, как это было сделано в первом подходе.

Например:

require.config({
    baseUrl: 'http://cdn.wijmo.com/amd-js',
    paths: {
        // ... List minimal modules such as Jquery and Globalize as per Wijmo documentation
    }
});

require(['wijmo.wijgrid'], function() { 
    require.config({
        baseUrl: '.'
    });

    require(['main'], function() {
        /* ... */
    });
});
person chrisg    schedule 21.07.2014
comment
Спасибо, но я не понимаю, как вы загружаете модули Wijmo, прежде чем переключать baseUrl на другое значение... - person Jazimov; 22.07.2014
comment
Второй приведенный пример показывает, как это сделать. Он выполняет require(['wijmo.wijgrid'], ...), а затем в функции обратного вызова из этого требования (которая вызывается после успешной загрузки модулей Wijmo) сбрасывает baseUrl на другое значение, прежде чем запрашивать ваши локальные модули приложения. - person chrisg; 22.07.2014
comment
Хорошо понял. Я думаю, вы предложили отличную идею, которая состоит в том, чтобы изменить baseUrl после загрузки модулей Wijmo. Несмотря на то, что они предварительно загружаются, вы все равно получаете меньший след Wijmo, чем при загрузке скриптов для всей коллекции Wijmo (как в случае, если вы не используете RequireJS). Я очень надеюсь, что ребята из Wijmo исправят свои AMD, потому что нам не нужно так творчески мыслить, чтобы использовать AMD Wijmo вместе с другими (не Wijmo) AMD в наших корпоративных приложениях. - person Jazimov; 22.07.2014