query
On this page

compressDrvWeb

pkgs.compressDrvWeb

Functor
Docs pulled from | This Revision | 10 minutes ago


compressDrvWeb compresses a derivation for common web server use.

Useful when one wants to pre-compress certain static assets and pass them to the web server.

Inputs

formats ([String])

List of file extensions to compress.

Defaults to common formats that compress well.

extraFindOperands (String)

See compressDrv for details.

extraFormats ([ String ])

Extra extensions to compress in addition to formats.

compressors ( { ${fileExtension} :: String })

Map a desired extension (e.g. gz) to a compress program.

Type

compressDrvWeb :: Derivation -> { formats :: [ String ]; extraFormats :: [ String ]; compressors :: { ${fileExtension} :: String; } } -> Derivation

Examples

pkgs.compressDrvWeb full usage example with pkgs.gamja and a webserver


For example, building `pkgs.gamja` produces the following output:

  /nix/store/2wn1qbk8gp4y2m8xvafxv1b2dcdqj8fz-gamja-1.0.0-beta.9/
  ├── index.2fd01148.js
  ├── index.2fd01148.js.map
  ├── index.37aa9a8a.css
  ├── index.37aa9a8a.css.map
  ├── index.html
  └── manifest.webmanifest

With `pkgs.compressDrvWeb`, one can compress these files:

```nix
pkgs.compressDrvWeb pkgs.gamja {}
=>
«derivation /nix/store/...-gamja-compressed.drv»
/nix/store/f5ryid7zrw2hid7h9kil5g5j29q5r2f7-gamja-1.0.0-beta.9-compressed
├── index.2fd01148.js -> /nix/store/2wn1qbk8gp4y2m8xvafxv1b2dcdqj8fz-gamja-1.0.0-beta.9/index.2fd01148.js
├── index.2fd01148.js.br
├── index.2fd01148.js.gz
├── index.2fd01148.js.map -> /nix/store/2wn1qbk8gp4y2m8xvafxv1b2dcdqj8fz-gamja-1.0.0-beta.9/index.2fd01148.js.map
├── index.2fd01148.js.map.br
├── index.2fd01148.js.map.gz
├── index.37aa9a8a.css -> /nix/store/2wn1qbk8gp4y2m8xvafxv1b2dcdqj8fz-gamja-1.0.0-beta.9/index.37aa9a8a.css
├── index.37aa9a8a.css.br
├── index.37aa9a8a.css.gz
├── index.37aa9a8a.css.map -> /nix/store/2wn1qbk8gp4y2m8xvafxv1b2dcdqj8fz-gamja-1.0.0-beta.9/index.37aa9a8a.css.map
├── index.37aa9a8a.css.map.br
├── index.37aa9a8a.css.map.gz
├── index.html -> /nix/store/2wn1qbk8gp4y2m8xvafxv1b2dcdqj8fz-gamja-1.0.0-beta.9/index.html
├── index.html.br
├── index.html.gz
├── manifest.webmanifest -> /nix/store/2wn1qbk8gp4y2m8xvafxv1b2dcdqj8fz-gamja-1.0.0-beta.9/manifest.webmanifest
├── manifest.webmanifest.br
└── manifest.webmanifest.gz

When the -compressed derivation is passed to a properly configured web server, it enables direct serving of the pre-compressed files.

$ curl -I -H 'Accept-Encoding: br' https://irc.example.org/
<...>
content-encoding: br
<...>

For example, a caddy configuration snippet for gamja to serve the static assets (JS, CSS files) pre-compressed:

{
  virtualHosts."irc.example.org".extraConfig = ''
    root * ${pkgs.compressDrvWeb pkgs.gamja {}}
    file_server browse {
        precompressed br gzip
    }
  '';
}

This feature is also available in nginx via ngx_brotli and ngx_http_gzip_static_module.


Noogle detected

This is a Functor

Learn about functors

Implementation

The following is the current implementation of this function.

drv:
{
  formats ? [
    "css"
    "eot"
    "htm"
    "html"
    "js"
    "json"
    "map"
    "otf"
    "svg"
    "ttf"
    "txt"
    "webmanifest"
    "xml"
  ],
  extraFormats ? [ ],
  compressors ? {
    br = "${lib.getExe brotli} --keep --no-copy-stat {}";
    gz = "${lib.getExe zopfli} --keep {}";
    # --force is required to not fail on symlinks
    # for details on the compression level see
    # https://github.com/NixOS/nixpkgs/pull/332752#issuecomment-2275110390
    zstd = "${lib.getExe zstd} --force --keep --quiet -19 {}";
  },
  extraFindOperands ? "",
}:
compressDrv drv {
  formats = formats ++ extraFormats;
  compressors = compressors;
  inherit extraFindOperands;
}