Как я могу сжать / gzip мой mimified.js and.css-файлы перед публикацией в AWS S3?

Я запустил Google pagespeed, и он предлагает сжать мой .js and .в CSS

устранить код JavaScript и CSS в верхней части страницы Показать, как исправить

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).

во время публикации у меня есть шаг, который использует Windows Powershell для перемещения .js and .УСБ mimified bundle для S3 и это идет с CloudFront.

есть ли какой-то шаг, который я мог бы добавить в сценарий PowerShell, который будет сжимать .js and .файлы css?

тоже как-то файлы сжимаются тогда мне нужно сделать что-то большее, чем изменить имя, чтобы сказать моему браузеру, что ему нужно будет попробовать и принять файл gzip?

3 ответов


вы можете добавить в свой скрипт загрузки необходимый код для сжатия файлов gzip.

пример может быть такой:

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
    }
}

С этого сайта: создание Gzip в Powershell


расширения сообщества Powershell имеет скриптлет для gZipping файлов, и он очень прост в использовании:

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

вам не нужно переименовывать файлы, просто добавьте Content-Encoding заголовок и установите его в gzip.


поскольку Amazon S3 предназначен только для обслуживания статических файлов, он не сжимает файлы (активы), поэтому вам нужно сжимать их самостоятельно:

  • сжать .js and .css с gzip: я не знаю о howto с PowerShell, но я делаю с Python, я предлагаю сделать скрипт развертывания python (еще лучше fabfile) и интегрировать сжатие и нажмите код на нем.

  • " также после сжатия файлов затем должен ли я сделать что-то большее, чем изменить имя, чтобы сообщить моему браузеру, что ему нужно будет попробовать и принять файл gzip?": Хорошие Вопросы ! Не нужно менять имя сжатого файла, предлагаю не переименовывать. Однако, вы:

  • должны установите также заголовок "Content-Encoding: gzip", иначе браузеры не будут знать файл.

  • необходимо установить заголовки 'Content-Type': type (type = 'application / javascript' или 'text / css')

  • необходимо установить заголовок "x-amz-acl": "public-read": чтобы сделать его общедоступным.

  • Я предлагаю также установить заголовок "Cache-Control: max-age=TIME" (пример: TIME=31104000, в течение 360 дней): чтобы помочь браузерам кэшировать его (лучшая производительность)

Это будет работать независимо от того, подается ли из origin или с cloudfront. Но помните, что если вы обслуживаете их с cloudfront, вам нужно будет аннулировать все файлы после каждого толчка, в противном случае старая версия будет жить до 24 часов от толчка. Надеюсь, это поможет, я могу предоставить решение python, если это необходимо.