Interesuje mnie, jak wolisz zautomatyzować minifikację JavaScript w swoich aplikacjach internetowych Java. Oto kilka aspektów, które szczególnie mnie interesują:
- Jak to się integruje? Czy jest to część twojego narzędzia do budowania, filtr serwletów, samodzielny program przetwarzający dalej plik WAR, czy coś innego?
- Czy łatwo jest włączać i wyłączać ? Próba debugowania zminimalizowanego skryptu jest bardzo niezręczna, ale programista może również sprawdzić, czy minifikacja niczego nie psuje.
- Czy działa przejrzyście , czy też ma jakieś skutki uboczne (poza tymi nieodłącznymi od minifikacji), które muszę brać pod uwagę w codziennej pracy?
- Którego minifier używa?
- Czy brakuje mu jakichś funkcji , o których możesz pomyśleć?
- Co w tym lubisz?
- Co ci się w nim nie podoba?
Będzie to głównie służyć jako punkt odniesienia dla moich przyszłych projektów (i mam nadzieję, że inni SOer również uznają to za przydatne), więc wszelkiego rodzaju narzędzia są interesujące.
(Zwróć uwagę, że to nie jest kwestia tego, który minifier jest najlepszy . Mamy już ich wielu).
java
javascript
automation
minify
gustafc
źródło
źródło
Odpowiedzi:
Post podsumowujący
Jeśli opublikujesz coś nowego w tym wątku, edytuj ten post, aby połączyć go z Twoim.
apply
Zadanie Ant (przy użyciu kompresora YUI)exec
Zadanie Ant przy użyciu Terseraźródło
Używamy zadania Ant, aby zminimalizować pliki js za pomocą YUICompressor podczas kompilacji produkcyjnej i umieścić wynik w oddzielnym folderze. Następnie przesyłamy te pliki na serwer WWW. Na tym blogu możesz znaleźć kilka dobrych przykładów integracji YUI + Ant .
Oto przykład:
źródło
script src
kompilacje deweloperskie, czy po prostu kopiujesz niezminifikowane pliki do katalogu skompresowanego / js?<fileset dir="${generatedScriptsDir}" includes="**/*.js"/>
ale to nie działa. Jak mogę zrobić, aby wygenerować plik w${generatedScriptsDir}
?Myślę, że jednym z najlepszych i odpowiednich narzędzi do tego zadania jest wro4j Sprawdź https://github.com/wro4j/wro4j
Robi wszystko, czego potrzebujesz:
Może działać zarówno w trybie debugowania, jak i produkcyjnym. Po prostu określ wszystkie pliki, które ma obsługiwać / wstępnie przetwarzać, a on zajmie się resztą.
Możesz po prostu dołączyć scalone, zminimalizowane i skompresowane zasoby w następujący sposób:
źródło
wro
serwer aplikacji) zapache
serwera WWW?Napisałem makra Ant dla kompilatora Google Closure i kompresora Yahoo i dołączam ten plik do różnych projektów internetowych.
Integracja:
<import file="build-minifier.xml" />
w pliku build.xml, a następnie jak zwykle wywołaj zadania Ant:<gc-js dir="${build.js.dir}" src="prototype" />
<yc-js-all dir="${build.js.dir}" />
Do wyboru dwa minifier: kompilator Google Closure i kompresor Yahoo, należy je pobrać ręcznie i umieścić w pobliżu pliku xml
Minifier pomijają już skompresowane pliki (kończące się na
-min*
)Zwykle tworzę trzy wersje skryptu: nieskompresowaną (np.
prototype.js
) Do debugowania, skompresowaną za pomocą kompilatora zamknięcia (prototype-min-gc.js
) dla serwera produkcyjnego, skompresowaną za pomocą Yahoo (prototype-min-yc.js
) do rozwiązywania problemów, ponieważ kompilator zamknięcia używa ryzykownych optymalizacji i czasami tworzy nieprawidłowy skompresowany plik, a kompresor Yahoo jest bezpieczniejszyKompresor Yahoo może zminimalizować wszystkie pliki w katalogu za pomocą jednego makra, kompilator Closure nie może
źródło
Próbowałem na dwa sposoby:
Oczywiście to drugie rozwiązanie jest lepsze, ponieważ nie zużywa zasobów w czasie wykonywania (moja aplikacja internetowa korzysta z silnika aplikacji Google) i nie komplikuje kodu aplikacji. Więc przyjmijmy ten drugi przypadek w następujących odpowiedziach:
za pomocą maven
aktywujesz go tylko podczas kończenia wojny; w trybie programowania widzisz nieskompresowaną wersję swoich zasobów
absolutnie
Sprężarka YUI
nie, jest bardzo kompletny i łatwy w użyciu
jest zintegrowany z moim ulubionym narzędziem (maven), a wtyczka znajduje się w centralnym repozytorium (dobry obywatel-maven)
źródło
Myślę, że potrzebujesz biblioteki kompresji, na przykład znacznika Granule.
http://code.google.com/p/granule/
Wykonuje gzip i łączy javascripts opakowane tagiem g: compress przy użyciu różnych metod, ma również zadanie Ant
przykładowy kod to:
źródło
Jestem naprawdę zaskoczony, że nikt nie wspomniał o JAWR - https://jawr.github.io
Jest dość dojrzały i obsługuje wszystkie standardowe funkcje, których można się spodziewać, i trochę więcej. Oto, jak to się ma do doskonałych kryteriów PO.
Początkowo przetwarzanie / podnoszenie ciężarów podczas uruchamiania aplikacji było oparte na serwlecie . Począwszy od 3.x dodali obsługę integracji w czasie kompilacji .
Obsługa JSP i Facelets jest zapewniana przez niestandardową bibliotekę znaczników JSP do importowania przetworzonych zasobów. Oprócz tego zaimplementowano moduł ładujący zasoby JS, który obsługuje ładowanie zasobów ze statycznych stron HTML .
debug=on
Opcja jest dostępna do wykorzystania przed uruchomieniem aplikacji, a zwyczajGET
parametr może być określony w poszczególnych żądań w produkcji do przełączania trybu debugowania selektywnie w czasie wykonywania do wspomnianego wniosku.W przypadku JS obsługuje kompresor YUI i JSMin, w przypadku CSS nie jestem pewien.
SASS
przychodzi na myśl wsparcie. To powiedziawszy, obsługujeLESS
.źródło
Nasz projekt poradził sobie z tym na wiele sposobów, ale nadal używaliśmy kompresora YUI przez różne iteracje.
Początkowo mieliśmy serwlet obsługujący kompresję dla JavaScript przy pierwszym dostępie do tego konkretnego pliku; był następnie buforowany. Mieliśmy już system do obsługi plików niestandardowych właściwości, więc po prostu zaktualizowaliśmy nasze pliki konfiguracyjne, aby obsługiwały włączanie lub wyłączanie kompresora w zależności od środowiska, w którym pracowaliśmy.
Obecnie środowiska programistyczne nigdy nie używają skompresowanego kodu JavaScript do celów debugowania. Zamiast tego zajmujemy się kompresją w naszym procesie kompilacji podczas eksportowania naszej aplikacji do pliku WAR.
Nasz klient nigdy nie zgłaszał obaw dotyczących kompresji, a programiści nie zauważają tego, dopóki nie zdecydują się debugować JavaScript. Więc powiedziałbym, że jest raczej przezroczysty z minimalnymi, jeśli w ogóle, efektami bocznymi.
źródło
To zadziałało dla mnie: https://bitbucket.org/m6_russell_francis/yui-compressor-ant-task/wiki/Home
źródło
Piszę framework do zarządzania zasobami internetowymi, zwany humpty . Ma być prostszy i nowocześniejszy niż jawr czy wro4j przy użyciu WebJars i ServiceLoaders.
W trakcie programowania serwlet przetwarza zasoby w razie potrzeby. Zasoby byłyby następnie wstępnie kompilowane przed rozpoczęciem produkcji i umieszczane w folderze publicznym, tak aby jedyną używaną częścią było generowanie poprawnych dołączeń w HTML.
Można to zrobić, przełączając się między trybami rozwoju i produkcji.
Uważam, że jest przejrzysty, ale zdecydowanie sprzyja korzystaniu z WebJars.
Niezależnie od tego, którego używa wtyczka, którą umieścisz w ścieżce klas. Obecnie rozważam napisanie wtyczki do Google Closure Compiler.
Wciąż przedpremierowy, chociaż używam go w produkcji. Wtyczka maven nadal wymaga dużo pracy.
Prostota dodania zależności w celu skonfigurowania struktury
To moje kochanie, kocham to wszystko;)
źródło
Naprawdę spóźniłem się na imprezę tutaj, ale pomyślałem, że może to pomóc komuś, kto wciąż szuka innej odpowiedzi:
Po próbie użycia YUI Compressor byłem rozczarowany, że był on niekompatybilny z nowszymi wersjami jQuery i Prism (dwie główne biblioteki JS innych firm, których potrzebowałem do mojego projektu, które chciałem skompresować do jednego pliku). Zdecydowałem się więc na Terser , który jest rozwidleniem Uglify-JS obsługującym ES6 +. Nie byłem w stanie uruchomić go bezpośrednio przy użyciu
<exec>
zadania, ale użycie metody wiersza poleceń systemu Windows działa przynajmniej dla Win 10 (nie mówiąc, że nie może działać inaczej, ale było to bardzo łatwe obejście). Nie ma potrzeby dodawania niczego więcej do zmiennej systemowej Path (ponieważ Node.JS jest zwykle dodawany podczas instalacji). Najpierw używam<concat>
zadania ANT, aby utworzyć duży, nieskompresowany plik. Użyj,<fileset>
ponieważ zachowa porządek (jeśli to ważne, w każdym razie).Następnie użyj tego
<exec>
zadania, aby uruchomić dowolny program NPM, taki jak Terser. Strona podręcznika Apache dotycząca tego zadania wskazała, że jest to obejście systemu Windows do uruchamiania plików .bat, ale tak naprawdę pozwala na uruchomienie prawie każdej aplikacji wiersza poleceń (nawet tych, których w<exec>
tajemniczy sposób nie można znaleźć inaczej).Zintegrować? Jest częścią skryptu budowania ANT (wtyczka DITA Open Toolkit obsługująca między innymi niestandardowy JavaScript - nie jest to aplikacja internetowa Java jako taka, ale używanie Javy do tworzenia wyjścia HTML5), więc integracja nie była czymś więcej niż dodaniem tych zadania do nowego celu (jest więcej kodu dotyczącego ustawiania wartości domyślnych i sprawdzania parametrów wejściowych!).
Łatwe do włączenia / wyłączenia? W moim przypadku mam parametr, który przekazuję do kompilacji ANT, aby uwzględnić kompilację i minifikację pliku JS. Więc tak, osiąga ten cel tylko wtedy, gdy ustawię parametr na „Tak”. To dość łatwa rzecz do skonfigurowania w kompilacji ANT.
Przezroczysty Jak dotąd wydaje się, że nie ma to wpływu na żaden z kilku plików JS, które dołączam. Niektóre z nich są moimi własnymi (i w żadnym wypadku nie jestem ekspertem od JS), a niektóre, jak wspomniałem, są popularnymi bibliotekami JS.
Minifier Terser, ale przy użyciu tej metody możesz użyć prawie dowolnego zminimalizowania z danymi wejściowymi wiersza poleceń.
Brakuje funkcji? Terser działa tylko z JavaScriptem. Jeśli chcę zrobić to samo z moimi plikami CSS (co robię), używam YUI Compressor.
Jak to jest obecnie aktywny projekt i ma dobre wsparcie. Ponadto obecna implementacja (wywołanie jej tylko przez
<exec>
cel ANT ) pozwala mi na wymianę minifier, jeśli będę musiał użyć czegoś innego w przyszłości.Nie podoba mi się, że wymaga Node.JS. Nie ma nic przeciwko Node.JS, pamiętaj tylko, że ten konkretny projekt nie potrzebuje go inaczej. Wolałbym użyć do tego pliku Java .jar, takiego jak YUI Compressor (w razie potrzeby mogę go łatwo rozpowszechnić za pomocą wtyczki).
źródło