2015-05-19 15 views
8

Pobiegłem Google Page Speed ​​i sugeruje, ściskając moje .js i .cssJak mogę skompresować/zgasować moje zmimifikowane pliki .js i .css przed opublikowaniem w AWS S3?

Eliminowanie renderowania blokowania JavaScript i CSS w ponad-the-krotnej zawartości Pokaż, jak naprawić

Enable compression 
Compressing resources with gzip or deflate can reduce the number of bytes sent over the network. 
Enable compression for the following resources to reduce their transfer size by 210.9KiB (68% reduction). 
Compressing http://xx.com/content/bundles/js.min.js could save 157.3KiB (65% reduction). 
Compressing http://xx.com/content/bundles/css.min.css could save 35.5KiB (79% reduction). 
Compressing http://xx.com/ could save 18.1KiB (79% reduction). 

Podczas publikowania I Zrób krok, który używa Windows Powershell, aby przenieść zmimifikowany pakunek .js i .css do S3, a to trafia do chmury.

Czy jest jakiś krok, który mógłbym dodać w skrypcie PowerShell, który kompresowałby pliki .js i .css?

Również po skompresowaniu plików muszę zrobić coś więcej niż zmienić nazwę, aby powiedzieć przeglądarce, że będzie musiała spróbować zaakceptować plik gzip?

+0

Ręcznie kompresować? Nie, ale może je automatycznie skompresować. Czy próbowałeś czegoś? Szybkie wyszukiwanie w Google dało mi funkcję, która skompresuje plik za ciebie, zajęło mi 15 sekund lub więcej, aby znaleźć wyszukiwanie "powershell gzip" Daj nam znać, jeśli dostaniesz jakiś kod i napotkasz błędy, możemy pomóc z błędami =) – TheMadTechnician

+0

Czy słyszałeś o 'gulp'? zazwyczaj kompresuję pliki zasobów (js, css i obraz) i automatycznie przesyłam je do s3. wystarczy uruchomić polecenie 1 gulp. –

+0

@AryWibowo - Czy możesz dać mi przykład, w jaki sposób można go użyć z Powershell? – Melina

Odpowiedz

6

Możesz dodać do swojego skryptu przesyłania potrzebny kod do kompresowania plików przez gzip.

Niektóre przykładowy kod może być w ten sposób:

function Gzip-FileSimple 
{ 
    param 
    (
     [String]$inFile = $(throw "Gzip-File: No filename specified"), 
     [String]$outFile = $($inFile + ".gz"), 
     [switch]$delete # Delete the original file 
    ) 

    trap 
    { 
     Write-Host "Received an exception: $_. Exiting." 
     break 
    } 

    if (! (Test-Path $inFile)) 
    { 
     "Input file $inFile does not exist." 
     exit 1 
    } 

    Write-Host "Compressing $inFile to $outFile." 

    $input = New-Object System.IO.FileStream $inFile, ([IO.FileMode]::Open), ([IO.FileAccess]::Read), ([IO.FileShare]::Read) 

    $buffer = New-Object byte[]($input.Length) 
    $byteCount = $input.Read($buffer, 0, $input.Length) 

    if ($byteCount -ne $input.Length) 
    { 
     $input.Close() 
     Write-Host "Failure reading $inFile." 
     exit 2 
    } 
    $input.Close() 

    $output = New-Object System.IO.FileStream $outFile, ([IO.FileMode]::Create), ([IO.FileAccess]::Write), ([IO.FileShare]::None) 
    $gzipStream = New-Object System.IO.Compression.GzipStream $output, ([IO.Compression.CompressionMode]::Compress) 

    $gzipStream.Write($buffer, 0, $buffer.Length) 
    $gzipStream.Close() 

    $output.Close() 

    if ($delete) 
    { 
     Remove-Item $inFile 
    } 
} 

Z tej strony: Gzip creation in Powershell

6

Powershell community extensions ma scriptlet dla gZipping pliki, a to jest bardzo łatwy w użyciu:

Write-Gzip foo.js #will create foo.js.gz 
mv foo.js.gz foo.js -Force 

You nie musisz zmieniać nazw plików, po prostu dodaj nagłówek Content-Encoding i ustaw go na gzip.

+1

MatteoSp - Czy możesz podać przykład użycia tej metody. Czy możesz potwierdzić, czy to samo zrobi to samo, co funkcja Gzip-FileSimple w drugiej odpowiedzi? – Melina

+0

Zmieniono moją odpowiedź. Ale nie rozumiem, co masz na myśli, mówiąc: "potwierdź, czy zrobi to samo, co". Pytasz, czy używają tego samego algorytmu kompresji, czy co? – MatteoSp

0

Od Amazon S3 ma jedynie służyć pliki statyczne, nie kompresować pliki (aktywa), dlatego trzeba je samemu kompresji:

  • Kompresja .js i .css z gzip: Nie wiem jak to zrobić z PowerShellem, ale robię to z Pythonem, sugeruję wykonanie skryptu do pisania Pythona (jeszcze lepiej fabfile) i zintegrowanie z nim kodu kompresji i push.

  • "Również po skompresowaniu plików muszę zrobić coś więcej niż zmienić nazwę, aby powiedzieć przeglądarce, że będzie musiała spróbować zaakceptować plik gzip?" : Dobre pytania! Nie jest konieczna zmiana nazwy skompresowanego pliku, sugeruję, aby nie zmieniać nazwy. Jednak:

  • MUST zestaw również nagłówek "Content-Encoding: gzip" inaczej przeglądarek nie wiem plik.

  • musi ustawić nagłówków 'Content-Type': typ (type = 'application/javascript' lub 'text/css')

  • musi ustawić nagłówek 'X-AMZ-ACL': „publicznego -read ": aby była publicznie dostępna.

  • Proponuję również, aby ustawić nagłówek "Cache-Control: max-age = Time" (przykład: czas = 31104000, do 360 dni): Aby pomóc przeglądarek buforowania go (lepszą wydajność)

To zadziała, niezależnie od tego, czy jest obsługiwane od początku czy z chmurą.Pamiętaj jednak, że jeśli serwujesz je w chmurze, będziesz musiał unieważnić wszystkie pliki po każdym naciśnięciu, w przeciwnym razie stara wersja będzie działać do 24 godzin od naciśnięcia. Mam nadzieję, że to pomaga, mogę dostarczyć rozwiązanie Pythona, jeśli jest to konieczne.