RequireJS път с JS разширение не се разрешава

Използвам библиотека, която (много егоистично, IMHO) предполага, че baseUrl ще сочи към CDN на компанията:

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

Първо си помислих, че просто ще копирам съдържанието на горния Url в моята собствена папка (като /scripts/wijmo/amd-js), но това не работи, защото добрите хора от Wijmo твърдо кодират препратки към пътя в техния AMD дефинирайте изявления като това:

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

Това, което означава горното (ако разбирам правилно нещата), е, че ако имате други модули, различни от Wijmo AMD, тогава трябва или:

(a) поставете ги под amd-js пътя, може би в подпапка, наречена "myScripts" (b) използвайте твърдо кодирани препратки към RequireJS път към вашите собствени AMD, като това:

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

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

(b) вид работа и ето моят проблем: Ако използвам синтаксис myAMD_1, тогава всичко е наред. Но това не ми позволява да тествам на моята локална машина за разработка, която използва localhost. (Не искам да се занимавам с откриване на кой сървър работя и да персонализирам стойността на пътищата... Искам пътят да остане същият преди и след като публикувам на моя http сървър.)

Сега, според документацията на RequireJS:

Може да има моменти, когато искате да препратите директно към скрипт и да не спазвате правилата „baseUrl + paths“ за намирането му. Ако идентификационният номер на модул има една от следните характеристики, идентификационният номер няма да бъде предаден през конфигурацията „baseUrl + paths“ и просто ще бъде третиран като обикновен 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, защото не трябва да мислим толкова креативно, за да използваме Wijmo AMD заедно с други (не-Wijmo) AMD в нашите корпоративни приложения. - person Jazimov; 22.07.2014