Visual Studio 2010: Publikuj minifikowane pliki javascript zamiast oryginalnych

Mam folder Scripts, który zawiera wszystkiePliki JS używane w projekcie. Korzystając z zadania Ajax Minifier, generuję ./ min.Pliki js dla każdego z nich. W zależności od tego, czy aplikacja działa w trybie debugowania czy wydania, dołączam oryginał .plik js, lub minifigurkę.

Folder Scripts wygląda tak:

Scripts/script1.js
Scripts/script1.min.js   // Outside the project, generated automatically on build
Scripts/script2.js
Scripts/script2.min.js   // Outside the project, generated automatically on build

The ./ min.Pliki js znajdują się poza projektem (choć w tym samym folderze co oryginalne pliki) i nie są kopiowane do folder docelowy kiedy publikujemy projekt.

Nie mam żadnego doświadczenia w korzystaniu z zadań build (cóż, poza włączeniem zadania minifier), więc byłbym wdzięczny, gdyby ktoś mógł mi doradzić, który byłby prawidłowy sposób:

  • skopiuj ./ min.Pliki js do folderu docelowego po opublikowaniu aplikacji z Visual Studio.
  • Usuń / nie kopiuj oryginalnych plików js (nie jest to istotne, ale wolałbym nie kopiować plików, które nie będą używane w app).

Dzięki,

Edit: po odpowiedziach widzę, że pominąłem kilka szczegółów i że może Szukam niewłaściwego rozwiązania problemu. Dodam następujące szczegóły do pytania:

  • jeśli to możliwe, wolimy nie tworzyć skryptów kopiujących w procesie budowania rozwiązania. Oczywiście, rozważaliśmy to, ale do tej pory korzystaliśmy z projektów wdrażania sieci Web i wolelibyśmy zacząć korzystać z nowej funkcji publikowania w VS2010 (która ma zastąpić te projekty) niż ręczne dodawanie poleceń kopiowania do zadania budowania.
  • *./ min.Pliki js nie są zawarte w projekcie, ponieważ nie mogą być w systemie kontroli źródła (TFS w tej chwili). Są to pliki generowane podczas kompilacji i byłoby to podobne do włączenia folderu 'bin' do TFS (w tym problemów, które spowodowałyby). Może powinniśmy utworzyć pliki min w innym folderze i traktować je jak 'bin'? (Czy to w ogóle możliwe?)
Author: salgiza, 2010-03-02

5 answers

edycja (2012 październik): ASP.NET 4.5 obejmuje teraz łączenie i minifikację . Aktualna wersja nie obsługuje dynamicznego generowania javascript bardzo dobrze, ale poza tym jest całkiem użyteczna i na przykład ogląda system plików na żywo zmian, jak opisano poniżej; przed włączeniem własnej kompresji, spróbuj tego!

stara odpowiedź:

Zamiast implementować to w czasie kompilacji, sugeruję zrobić to w czasie wykonywania. To ma liczba zalet:

  • można włączyć parametry debugowania, które wyłączają łączenie i minifikację, aby umożliwić łatwiejszą identyfikację błędów. Pozwala to również na uruchamianie z mniejszą różnicą między środowiskiem programistycznym a produkcyjnym.
  • Zyskujesz elastyczność. Dwa razy udało mi się naprawić błędy za pomocą poprawki tylko w skrypcie, która może zostać uruchomiona bezpośrednio. W przypadku prostych, ale krytycznych błędów jest to dobra opcja.
  • jest to dość prostsze do wdrożenia-ty posiadam już doświadczenie w implementacji odpowiedzi http, co tu się dobrze sprawdza.
  • Możesz śledzić datę ostatniej modyfikacji zaangażowanych skryptów i nie tylko używać jej do ustawiania odpowiednich Etagów i innych rzeczy (co IIS też może zrobić), ale raczej ustawić odległą datę wygaśnięcia. Następnie, zamiast linkować rzeczywisty scipt (czy minified, czy nie), możesz połączyć skrypt z jakimś krótkim tokenem w querystring - w ten sposób klienci nie muszą sprawdzać, czy js zaktualizował. Kiedy ma, Strony będą linkować do "nowego" pliku skryptu, który musi być osobno wymagane w każdym razie. (Jest to możliwe w skryptach budowania, ale trudniejsze).
  • złożony proces budowania często wiąże się z ukrytymi kosztami. Nie tylko trwa to dłużej, ale co się dzieje, gdy chcesz zaktualizować narzędzie do automatyzacji budowania? Po zmianie wersji IIS lub windows? Kiedy migrować do VS 2010? Jak łatwo jest wprowadzić nowych deweloperów w życie?

To jest szorstki zarys proces, za którym podążam:

  1. podaję dwa katalogi jako zawierające tylko skompresowalne css i js. W appdomain instantiation lub krótko po tym przez statyczny konstruktor, Klasa znajduje zawartość tych katalogów i tworzy FileSystemWatcher aby obserwować zmiany.
  2. wszystkie pliki są odczytywane w kolejności nazw plików (przy użyciu prefiksów takich jak 00_jquery.js 10_init.js itd. pomaga kontrolować kolejność tutaj). Lista nazw plików jest przechowywana do celów debugowania.
  3. wszystkie pliki są łączone przez string concatenation, następnie minifikowane przez YUI, a następnie skompresowane przez GZipStream. Token specyficzny dla wersji jest obliczany według najnowszej daty ostatniej modyfikacji lub przez hash wyniku.
  4. wynik kompresji (tablica bajtów, nazwy plików i token specyficzny dla wersji) jest przechowywany w statycznej zmiennej klasy (chronionej przez lock). Jeśli kontrola systemu plików wykryje aktualizację, Krok 2 rozpocznie się ponownie i będzie działał w tle do momentu zakończenia kompresji - stąd blokowanie.
  5. Dowolna strona chęć włączenia połączonego javascript (i / lub css) wywołuje współdzieloną zmienną statyczną. Jeśli jesteśmy w trybie debugowania, generuje to znacznik skryptu (lub łącza) dla każdej nazwy pliku zapisanej w kroku drugim, w przeciwnym razie generuje to pojedynczy znacznik skryptu (lub łącza) do Uri obsługiwanego przez niestandardową IHttpHandler. Wszystkie Uri zawierają token specyficzny dla wersji w zapytaniu-jest to ignorowane zarówno przez statyczny program obsługi plików IIS, jak i niestandardowy program obsługi http dla połączonej minifigurowanej wersji, ale powoduje buforowanie spokojnie.
  6. w niestandardowym Ihttphandlerze, gdy odbierane jest żądanie dla połączonego javascript( lub css), ustawiany jest nagłówek Content-Encoding: gzip i odległa data wygaśnięcia. Następnie wstępnie skompresowana tablica bajtów jest zapisywana bezpośrednio do strumienia http poprzez context.Response.OutputStream.

Używając tego podejścia, nie będziesz musiał bawić się w sieć.opcje konfiguracji za każdym razem, gdy dodajesz lub usuwasz plik skryptu; możesz aktualizować Skrypty, gdy aplikacja jest uruchomiona, a klienci będą żądać ich na następnej stronie widok-ale nadal uzyskasz optymalne zachowanie pamięci podręcznej, ponieważ przeglądarki nie wysyłają nawet żądania, jeśli-nie-zmodyfikowanego ze względu na nagłówek expiry. Zwykle kompresja skryptów powinna zająć około sekundy, a skompresowany wynik powinien być tak mały, że narzut pamięci zmiennej statycznej jest znikomy (co najwyżej kilka 100 KB dla naprawdę dużej ilości skryptów / css).

 20
Author: Eamon Nerbonne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-11 13:04:42

Jeśli chcesz zrobić minifikację Javascript przez Visual Studio, to na początek: http://encosia.com/2009/05/20/automatically-minify-and-combine-javascript-in-visual-studio/

W przeciwnym razie polecam narzędzie, które może automatycznie łączyć i minifikować Javascript. Dwa narzędzia, na które spojrzałem to Justin Etheredge 'S Bundler i Combres . Używam Bundlera w moim obecnym projekcie, a jeden z moich kolegów z pracy używa Combres. Bundler jest trochę prostszy w użyciu, ale robi mniej niż Combres. Z Bundler jeśli debug jest wyłączony w web.config nie minifikuje i nie łączy, co oznacza, że możesz debugować javascript w swoim środowisku deweloperskim.

P. S. Bundler został przemianowany na SquishIt.

 7
Author: Daniel Lee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-08 17:19:07

Prawdopodobnie chcesz przyjrzeć się zdarzeniom Build, za pomocą których możesz określić wiersz poleceń do wykonania post-build. Twoje pytanie jest dodatkowo podobne do tych pytania .

Do rzeczywistego kopiowania można w prosty sposób użyć polecenia COPY.

 3
Author: James B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:56

Nie jestem do końca pewien, czy takie podejście byłoby przydatne w tej sytuacji, ale mogę to sobie wyobrazić... Możesz modyfikować pliki csproj, aby np. wpływać na to, jakie pliki powinny być zawarte w danym typie kompilacji.

Z pewnym typem odnoszę się do Menedżera konfiguracji.

Debug i Release są domyślne, ale nic nie stoi na przeszkodzie, aby tworzyć nowe. Na podstawie wybranej konfiguracji można mieć różne pliki będące częścią konfiguracji I przypuszczam, że w ten sposób możesz publikować różne pliki. Opisałem tę strategię na moim blogu tutaj: http://realfiction.net/go/130

 2
Author: flq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-19 20:14:01

Ten artykuł o " automatycznie Minifiguruj, łącz, Kompresuj i pamięć podręczną *.js i *.pliki css w Twoim ASP.NET projekt " może Ci pomóc

Http://www.codeproject.com/KB/aspnet/CssAndJavaScriptOptimizer.aspx?display=Print

 1
Author: Ivo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-19 14:56:47