9

W programie Visual Studio 2013, jak zminimalizować JavaScript i CSS w kroku po kompilacji? Chciałbym, aby każdy plik css i js kompresował do pliku .min.js lub .min.css w tym samym folderze.W programie Visual Studio 2013, jak zminimalizować JavaScript i CSS w kroku po kompilacji

Nie chcę sprawdzać zminimalizowanych plików, ale po prostu je generować po kompilacji.

+0

W tym celu dostępny jest bezpłatny dodatek do galerii Visual Studio: https://visualstudiogallery.msdn.microsoft.com/059bdfb0-9111-47c7-805c-5d51bba7d0d4 – TylerH

+0

B & M jest wbudowany. Skonfiguruj bundleconfig i upewnij się, że istnieją referencje WebGrease i Antlr. Runtime użyje dołączonych i minifikowanych plików w oparciu o twój debug = "false" w web.config. – Abhitalks

+2

Nie pracujesz nad aplikacją MVC, prawda? Jeśli to nastąpi, zminimalizuje pliki zasobów. – im1dermike

Odpowiedz

3

Za pomocą Microsoft Ajax Minifier można utworzyć skrypt programu Power Shell, aby utworzyć minified wersje wszystkich plików w danym folderze i dodać go do zdarzeń Post-build.

Przykład plików js (będzie podobny do CSS):

Get-ChildItem *.js -Exclude *.min.js | 
    Foreach-Object{ 
    $file = [io.fileinfo]$_.Name 
    ajaxmin $file.Name -out "$($file.Name).min$($file.Extension)" 
} 

Sprawdź również stronę z pełną listą command line switches np .: -map tworzy źródłowy plik mapy.

3

Wszystkie znalezione rozwiązania wymagały użycia różnych nazw plików dla zminimalizowanych wersji i wiele dodatkowych czynności, aby przełączać się między używaniem wersji normalnej/minifikowanej.

Zamiast tego chciałem, aby skompresowane pliki JavaScript miały oryginalne nazwy, więc nie musiałem zmieniać odniesień w moim znaczniku HTML. Mogłem używać normalnych plików Javascript w moim środowisku programistycznym, a następnie zminimalizowane wersje byłyby automatycznie wdrażane podczas publikowania.

Znalazłem proste rozwiązanie, które właśnie to robi. Najpierw zainstaluj .

Następnie w pliku projektu Visual Studio, tuż przed tagiem zamykającym </Project> dodać następujące:

<Import Project="$(MSBuildExtensionsPath)\Microsoft\Microsoft Ajax Minifier\ajaxmin.tasks" /> 
<Target Name="AfterBuild" Condition="'$(ConfigurationName)'=='Release'"> 
    <ItemGroup> 
    <JS Include="**\*.js" Exclude="**\*.min.js;obj\**\*.*" /> 
    <CSS Include="**\*.css" Exclude="**\*.min.css;obj\**\*.*" /> 
    </ItemGroup> 
    <AjaxMin 
    JsSourceFiles="@(JS)" JsSourceExtensionPattern="\.js$" JsTargetExtension=".jsMIN" 
    CssSourceFiles="@(CSS)" CssSourceExtensionPattern="\.css$" CssTargetExtension=".cssMIN" /> 
</Target> 
<PropertyGroup> 
    <CopyAllFilesToSingleFolderForPackageDependsOn> 
    CustomCollectFiles; 
    $(CopyAllFilesToSingleFolderForPackageDependsOn); 
    </CopyAllFilesToSingleFolderForPackageDependsOn> 
</PropertyGroup> 
<Target Name="CustomCollectFiles"> 
    <ItemGroup> 
    <MinJS Include="**\*.jsMIN" /> 
    <FilesForPackagingFromProject Include="%(MinJS.Identity)"> 
     <DestinationRelativePath>%(RecursiveDir)%(Filename).js</DestinationRelativePath> 
    </FilesForPackagingFromProject> 
    <MinCSS Include="**\*.cssMIN" /> 
    <FilesForPackagingFromProject Include="%(MinCSS.Identity)"> 
     <DestinationRelativePath>%(RecursiveDir)%(Filename).css</DestinationRelativePath> 
    </FilesForPackagingFromProject> 
    </ItemGroup> 
</Target> 

Co powyższy kod zrobić? Po opublikowaniu w Visual Studio ten kod znajdzie każdy plik .js i .css w Twoim źródle i utworzy zminimalizowaną kopię przy użyciu rozszerzenia .jsMIN i .cssMIN. Zignoruje pliki, które są już zminimalizowane. Następnie skopiuje te zminimalizowane pliki do folderu wdrażania przy użyciu oryginalnych nazw plików.

Voilà! Właśnie opublikowaliście zminimalizowane pliki JS/CSS, podczas gdy oryginalne pliki pozostają nienaruszone w środowisku programistycznym.

Opcjonalnie:
Chcesz Miniznik Ajax do spakowania z projektem? Z folderu instalacji Ajax Minifier można przenieść AjaxMin.dll i AjaxMinTask.dll bezpośrednio do katalogu źródłowego. Umieszczam je w folderze App_Data. Gdy znajdą się gdzieś w źródle, w Visual Studio kliknij je prawym przyciskiem myszy, wybierz Include in Project, a także zmień ich właściwość Build Action na None.

Następnie w kodzie I zawarte powyżej, zmiana
<Import Project="$(MSBuildExtensionsPath)\Microsoft\Microsoft Ajax Minifier\ajaxmin.tasks" />
do
<UsingTask TaskName="AjaxMin" AssemblyFile="$(MSBuildProjectDirectory)\App_Data\AjaxMinTask.dll" />
Gotowe.

Końcówka rozwiązywanie problemów:
Główny kod powyżej wykonuje AfterBuild i tylko wtedy, gdy konfiguracja jest Release. To tak, że będzie działać tylko podczas publikowania.Jeśli twoja konfiguracja nazywa się coś innego lub chcesz, aby działała w innych okolicznościach, zmodyfikuj kod w razie potrzeby.

+0

Proszę nie zamieszczać dokładnie tej samej odpowiedzi na wiele pytań ([1] (http://stackoverflow.com/a/33591146), [2] (http://stackoverflow.com/a/33591166), [3 ] (http://stackoverflow.com/a/33591169), [4] (http://stackoverflow.com/a/33591179), [5] (http://stackoverflow.com/a/33591185)). Jeśli pytania są rzeczywiście duplikatami, powinieneś opublikować pojedynczą odpowiedź na najlepsze pytanie i flagę/głosowanie, aby zamknąć pozostałe jako duplikaty. Jeśli nie są to duplikaty, musisz dopasować każdą odpowiedź do konkretnego pytania. –

+0

@ArtjomB. Odpowiedź jest poprawna i właściwa dla każdego z pytań. Pytania są na tyle podobne, że nie jest konieczne dostosowanie odpowiedzi. Jeśli uważasz, że pytania są oszustwa, możesz podjąć działania. Nigdy nie opublikowałbym tej samej odpowiedzi dwa razy, jednak to pytanie zostało zadane w kilku różnych odmianach, bez kompletnej prostej odpowiedzi. Odpowiedź ta stanowi o tym, więc teraz każdy OP ma odpowiedź, wraz z każdym, kto szuka odpowiedzi, która natknie się na jeden z wariantów pytania. –

+0

Głosowałem, aby zamknąć jako duplikat prawie wszystkie pytania, na które odpowiedziałeś. Jeden z nich był zamknięty. –

Powiązane problemy