Files
wasm-encoding-tool/README.md

172 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Wasm Encoding Tool
![Static Badge](https://img.shields.io/badge/Powered%20by-csasq-blue)
![Static Badge](https://img.shields.io/badge/Python-3.9%2B-blue)
![Static Badge](https://img.shields.io/badge/License-CC%20BY--NC%204.0-blue)
Утилита для сжатия файлов WebAssembly (Wasm) с использованием наиболее распространенных кодировок, поддерживаемых браузерами. Данный подход позволяет заранее подготовить сжатые файлы для отдачи их веб-сервером.
## Преимущества
Ниже приведено сравнение размера Wasm без сжатия и с применением максимального уровня сжатия каждым из поддерживаемых алгоритмов.
Размер исходного файла Wasm — 8.0M.
| Алгоритм сжатия | Размер | Коэффициент сжатия | Степень сжатия |
|-----------------|-------:|-------------------:|---------------:|
| Brotli | 2.5M | 3.2 | 68.75% |
| Zstandard | 2.6M | 3.08 | 67.5% |
| Gzip | 3.1M | 2.58 | 61.25% |
| Deflate | 3.1M | 2.58 | 61.25% |
Как следует из таблицы, в лучшем случае сжатый файл имеет размер приблизительно в 3,2 раза меньше, чем исходный.
## Рекомендации
1. Следите за пересечением относительных путей, если меняете предустановленные значения конфигурации.
2. Протестируйте работу утилиты с различным количеством параллельных потоков. Зачастую, вы можете запускать сжатие с неограниченно большим значением параметра `max_threads`. В лучшем случае получится добиться сжатия каждого файла каждым алгоритмом в отдельном потоке. В худшем случае процесс будет убит средствами OOM Killer.
## Конфигурация
Файл конфигурации следует расположить в `./config.ini` относительно рабочей директории утилиты.
Ниже приведен пример конфигурации со всеми возможными разделами и параметрами. Все пути за исключением параметра `Main.base_path` можно указывать как абсолютными, так и относительными.
```ini
[Main]
base_path = /opt/my-project
max_threads = 4
log_level = info
[Input]
path = ./source
[Output]
path = ./public
dir_mode = 755
file_mode = 644
[Output.Wasm.Source]
enabled = true
path = ./wasm/src
[Output.Wasm.Brotli]
enabled = true
path = ./wasm/br
level = 11
[Output.Wasm.Zstandard]
enabled = true
path = ./wasm/zstd
level = 22
[Output.Wasm.Gzip]
enabled = true
path = ./wasm/gzip
level = 9
[Output.Wasm.Deflate]
enabled = true
path = ./wasm/deflate
level = 9
[Output.Other]
enabled = true
path = .
[Backup]
enabled = true
path = ./backup
```
### Раздел `Main`
Содержит основные параметры утилиты.
- `base_path` — базовый путь для построения относительных путей;
- `max_threads` — максимальное количество параллельных потоков;
- `log_level` — уровень логирования (`critical`, `fatal`, `error`, `warn`, `warning`, `info`, `debug`, `notset`).
### Раздел `Input`
Содержит параметры входной директории. Относительные пути строятся от `Main.base_path`.
- `path` — путь до исходников веб-приложения.
### Раздел `Output`
Содержит параметры выходной директории. Относительные пути строятся от `Main.base_path`.
- `path` — путь до исходников веб-приложения после сжатия;
- `dir_mode` — режим доступа к директориям;
- `file_mode` — режим доступа файлам.
### Раздел `Output.Wasm.Source`
Содержит параметры копирования исходников Wasm. Относительные пути строятся от `Output.path`.
- `enabled` — включить копирование исходников Wasm;
- `path` — путь до исходников Wasm.
### Разделы `Output.Wasm.Brotli`, `Output.Wasm.Zstandard`, `Output.Wasm.Gzip`, `Output.Wasm.Deflate`
Содержит параметры сжатия исходников Wasm. Относительные пути строятся от `Output.path`.
- `enabled` — включить сжатие исходников Wasm алгоритмом;
- `path` — путь до сжатых исходников;
- `level` — уровень сжатия:
- Brotli — с `1` по `11`,
- Zstandard — с `1` по `22`,
- Gzip — с `1` по `9`,
- Deflate — с `1` по `9`.
### Раздел `Output.Other`
Содержит параметры копирования прочих исходников. Относительные пути строятся от `Output.path`.
- `enabled` — включить копирование прочих файлов;
- `path` — путь до прочих файлов.
### Раздел `Backup`
Содержит параметры резервной копии. Относительные пути строятся от `Main.base_path`.
- `enabled` — включить создание резервной копии;
- `path` — путь до резервной копии.
## Конфигурация Nginx
Ниже приведен пример конфигурации Nginx для корректной отдачи файлов Wasm с указанием заголовков `Content-Type` и `Content-Length`.
Обратите внимание на порядок элементов в `map $http_accept_encoding $wasm_accept_encoding`. Изменив этот порядок, вы можете повлиять на приоритет применения алгоритмов сжатия.
```nginx
map $http_accept_encoding $wasm_accept_encoding {
"~br" "br";
"~zstd" "zstd";
"~gzip" "gzip";
"~deflate" "deflate";
default "src";
}
map $wasm_accept_encoding $wasm_content_encoding {
"br" "br";
"zstd" "zstd";
"gzip" "gzip";
"deflate" "deflate";
default "";
}
root /opt/my-project/public;
location / {
try_files $uri /index.html;
}
location ~* \.wasm$ {
try_files /wasm/$wasm_accept_encoding/$uri =404;
default_type application/wasm;
add_header "Content-Encoding" $wasm_content_encoding;
}
```