Skip to content

Commit

Permalink
Add support for Brotli compression (#2273)
Browse files Browse the repository at this point in the history
  • Loading branch information
clupprich authored and gauravtiwari committed Sep 18, 2019
1 parent c4d69a1 commit 92b75e4
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 2 deletions.
16 changes: 14 additions & 2 deletions docs/deployment.md
Expand Up @@ -42,7 +42,7 @@ We're essentially doing the following here:

Webpacker doesn't serve anything in production. You’re expected to configure your web server to serve files in public/ directly.

Some servers support sending precompressed versions of files with the `.gz` extension when they're available. For example, nginx offers a `gzip_static` directive.
Some servers support sending precompressed versions of files when they're available. For example, nginx offers a `gzip_static` directive that serves files with the `.gz` extension to supported clients. With an optional module, nginx can also serve Brotli compressed files with the `.br` extension (see below for installation and configuration instructions).

Here's a sample nginx site config for a Rails app using Webpacker:

Expand Down Expand Up @@ -79,12 +79,25 @@ server {
location ^~ /packs/ {
gzip_static on;
brotli_static on; # Optional, see below
expires max;
add_header Cache-Control public;
}
}
```

### Installing the ngx_brotli module

If you want to serve Brotli compressed files with nginx, you will need to install the `nginx_brotli` module. Installation instructions from source can be found in the official [google/ngx_brotli](https://github.com/google/ngx_brotli) git repository. Alternatively, depending on your platform, the module might be available via a pre-compiled package.

Once installed, you need to load the module. As we want to serve the pre-compressed files, we only need the static module. Add the following line to your `nginx.conf` file and reload nginx:

```
load_module modules/ngx_http_brotli_static_module.so;
```

Now, you can set `brotli_static on;` in your nginx site config, as per the config in the last section above.

## CDN

Webpacker out-of-the-box provides CDN support using your Rails app `config.action_controller.asset_host` setting. If you already have [CDN](http://guides.rubyonrails.org/asset_pipeline.html#cdns) added in your Rails app
Expand Down Expand Up @@ -115,4 +128,3 @@ namespace :deploy do
end
end
```

12 changes: 12 additions & 0 deletions package/environments/production.js
Expand Up @@ -18,6 +18,18 @@ module.exports = class extends Base {
})
)

if ('brotli' in process.versions) {
this.plugins.append(
'Compression Brotli',
new CompressionPlugin({
filename: '[path].br[query]',
algorithm: 'brotliCompress',
cache: true,
test: /\.(js|css|html|json|ico|svg|eot|otf|ttf|map)$/
})
)
}

this.plugins.append(
'OptimizeCSSAssets',
new OptimizeCSSAssetsPlugin({
Expand Down

0 comments on commit 92b75e4

Please sign in to comment.