2013-08-21 16 views
5

Pracuję nad aplikacją internetową MVC, która korzysta z edytora kodu Ace w przeglądarce dostarczanego przez Cloud9. Skrypt ace.js i skrypt, który konfiguruje edytor asa, znajdują się razem w pakiecie ScriptBundle na moim pakiecie BundleConfig. Pakiet jest ładowany idealnie dobrze. Na moim lokalnym serwerze z ustawieniem debugowania na true w pliku web.config, skrypt działał idealnie dobrze. Jednak po uruchomieniu na serwerze z ustawionym debugowaniem na false w pliku web.config pojawiło się kilka błędów.Jak uniknąć problemów z tematami i trybami w bieżącym katalogu?

Po naprawieniu kilku drobnych usterków pozostają dwa błędy, które nie mogą zrozumieć przyczyny. Te dwa błędy wydają się bardzo podobne, ponieważ są to zarówno błędy 404 nie znalezione dla motywów chrome Ace'a, jak i skórki trybu Ace'a. W skrypcie, który ustawia się edytor, nazywane są następująco:

editor.setTheme("ace/theme/chrome"); 
editor.getSession().setMode("ace/mode/html"); 

na moim komputerze lokalnym, z debugowania ustawiony na true, tematem i tryb są ustawione idealnie w porządku i wszystko działa zgodnie z planem. Jednak, jak już powiedziałem, na serwerze na żywo z debugowaniem ustawionym na wartość false, a więc minimalizującym wszystkie skrypty w moim pakiecie ScriptBundles, pojawia się błąd 404 zarówno w motywie, jak iw trybie.

Po uruchomieniu konsoli JavaScript w przeglądarce Google Chrome mówiono mi o dwóch błędach 404. Zabawną rzeczą w błędach 404 jest to, że łączą się one z bieżącym katalogiem wyświetlanej strony, a następnie odpowiednio "theme-chrome.js" i "mode-html.js". Nigdy nie byli w tym katalogu, a wciąż nie są.

Moje pytanie brzmi: dlaczego skrypty zaczynają wyglądać w bieżącym katalogu dla swoich plików po ich minifikacji? Co mogę zrobić, aby rozwiązać ten problem, aby móc je zminimalizować, w pakietach i sprawić, by działały? A może jest jakiś sposób?

Dziękuję za pomoc przed czasem.

Odpowiedz

12

Znajduję przy pakietowaniu i minimalizacji asów i MVC, muszę ustawić basePath w konfiguracji as, używając bezwzględnego odwołania.

ace.config.set("basePath", "/Scripts/FullPathToMy/AceEditorDirectory"); 

Prawdopodobnie nie jest to najlepsze rozwiązanie, ale powinno Cię w to uwierzyć.

+0

Perfect! To działało jak czar. Wiedząc, zaoszczędziłoby to dużo czasu. – NoahWillCrow

+1

@Paul, to _jest_ najlepszym rozwiązaniem. –

3

Powód, dla którego As nie rozwiązuje ścieżki podstawowej podczas minialenia, jest spowodowany tym, że minified wersja jest nową unikalną nazwą, która nie pasuje do tego wzoru: ^(.*)\/ace(\-\w+)?\.js(\?|$)/. Ace używa tego wzoru, aby znaleźć element skryptu, który go utworzył, i używa atrybutu src do określenia ścieżki.

@ odpowiedzi Pawła jest najlepszy, ale jeśli z jakiegoś powodu nie można zrobić to w ten sposób, Ace sprawdza również dla opcji w atrybutach, które rozpoczynają się data-ace- że część tagu dowolny skryptu.

W System.Web.Optimization v 1.10 można wykorzystać Scripts.RenderFormat(format, script) do renderowania tag skryptu, aby określić ścieżkę bazową.

UWAGA: W innych odpowiedzi przepełnienie stosu mówią używać Microsoft.AspNet.Web.Optimization, ale to już nie jest to przypadek. Być może będziesz musiał użyć nuget, aby zaktualizować swoją wersję.

wersja MVC

@Scripts.RenderFormat(@"<script src=""{0}"" data-ace-base=""/Scripts/ace/""></script>", "~/bundlepath") 

Web Forms wersji

<%: Scripts.RenderFormat(@"<script src=""{0}"" data-ace-base=""/Scripts/ace/""></script>", "~/bundlepath") %>