# Генераторы статических сайтов

В последнее время заинтересовался текущим состоянием генераторов статических сайтов, попробовал в работе [Pelican](http://blog.getpelican.com "Pelican Static Site Generator"), [Hugo](http://gohugo.io "Static Website Engine") и [Hakyll](https://jaspervdj.be/hakyll/ "Static Sites on Haskell"). К чему в итоге пришел?

## Jekyll

Для сравнения производительность сборки мого сайта с использованием Jekyll:

```shell
$ time jekyll b
Configuration file: /Users/juev/Projects/juev.org-test/_config.yml
            Source: source
    Destination: public
Incremental build: enabled
    Generating...
                    done in 29.819 seconds.
Auto-regeneration: disabled. Use --watch to enable.

real	0m32.001s
user	0m30.792s
sys	0m0.940s
```

Это при условии того факта, что отключена генерация списка похожих статей. Если включить данную функцию, время генерации сайта возрастает до нескольких минут.

## Pelican

Генератор статических сайтов, написанный на питоне. Имеет очень развесистую систему плагинов и тем оформления. Предельно гибкий и функциональный. На генерацию сайта уходит немного времени, гораздо быстрее, чем jekyll:

```shell
$ time pelican content
Done: Processed 312 articles, 0 drafts, 3 pages and 1 hidden page in 6.01 seconds.

real	0m7.511s
user	0m5.896s
sys	0m1.052s
```

В качестве темплейтов файлов использует [Jinja](http://jinja.pocoo.org "Jinja2 is a full featured template engine for Python"). Очень функциональный, по синтаксису очень похож на используемый мной Liquid. Глубоко в его изучение не погружался, но в достаточно короткое время переписал используемые темплейты для Jinja.

Из проблем с данным генератором, у меня так и не заработал плагин по использованию yaml-заголовков в статьях, а заниматься обработкой своих статьей мне уже не хотелось.

## Hugo

Генератор статических сайтов, написанный на Go. Работает предельно быстро:

```shell
$ time hugo
Started building sites ...
Built site for language en:
0 draft content
0 future content
0 expired content
313 regular pages created
127 other pages created
1 non-page files copied
0 paginator pages created
0 articles created
124 tags created
total in 447 ms

real	0m0.489s
user	0m1.127s
sys	0m0.296s
```

Как видно, разница составляет порядки. Несколько секунд или минут потратить на генерацию сайта или же всего секунду. Генератор очень хорошо документирован. В качестве темплейтов использует стандартную систему go-template.

Из недостатков, в генератор жестко записана генерируемая структура сайта. Я потратил несколько дней для того, чтобы разобраться, как реализовать отдельную страницу со списком статей, которая не связана с главной страницей сайта, но безрезультатно. Может быть я чего-то не понял в предоставленной документации, но увы. Это единственный момент, который остался нереализованным при миграции сайта на Hugo.

## Hakyll

Одним из последних генераторов, что попробовал в работе, оказался Hakyll, написанный на Haskell. Его оказалось очень сложно устанавливать. Предоставленной на официальном сайте документации не достаточно. Если быть более точным, при ее использовании возникают ошибки с неразрешенными зависимостями.

Через cabal установка у меня так и не прошла, сколько не бился. Удалось поставить с помощью stack. Для этого ставим сам stack:

```shell
$ curl -sSL https://get.haskellstack.org/ | sh
```

Установить с помощью stack просто так тоже не получиться, необходимо выкачать репозиторий с hakyll и только затем провести установку:

```shell
$ git clone https://github.com/jaspervdj/hakyll.git
$ cd hakyll
$ stack build
$ stack install
```

Сборка занимает довольно много времени, у меня на моем макбуке потребовалось более 10 минут на то, чтобы провести установку. Но, если вы думаете, что на этом все, вы ошибаетесь. Необходимо провести подготовку окружения для работы и сборки сайта. Для этого создаем новую директорию для нашего сайта и используем команды:

```shell
$ hakyll-init mysite
$ cd mysite
$ stack init
$ stack build
$ stack exec site build
```

На всю операцию подготовки локальной директории для сборки сайта у меня ушло более получаса времени. В результате получил бинарный файл, размером в 123 мегабайта:

```shell
$ la .stack-work/dist/x86_64-osx/Cabal-1.24.0.0/build/site/site
-rwxr-xr-x  1 juev  staff   123M Dec 27 14:07 .stack-work/dist/x86_64-osx/Cabal-1.24.0.0/build/site/site
```

Но, что приятно, Hakyll без проблем воспринял мои статьи, используется очень простой язык темплейтов, позволяющий бысто задавать оформление своего сайта.
Но на полную генерацию сайта у меня ушло более одинадцати секунд:

```shell
$ rm -rf _cache/ _site/
$ time stack exec site build
Initialising...
Creating store...
Creating provider...
Running rules...
Checking for out-of-date items
Compiling
updated templates/default.html
updated index.html
Success

real	0m11.738s
user	0m9.646s
sys	0m1.373s
```

Почти час времени на подготовку, и 11 секунд на сборку?? На мой взгляд это излишне.

## Выводы

Что имеем в итоге? Есть целый ряд генераторов:

* Jekyll, использующий ruby в качестве основного языка программирования. Четкую систему версионирования зависимостей и очень большую пользовательскую базу людей, которые не просто создают сайты, но и пишут новые расширения для jekyll. Есть устоявшаяся система сборки, используемая в системах continues integration (CI).
* Pelican, который рекомендую использовать для сборки, если есть опыт программирования в Python. И это позволит вам создавать невероятные системы.
* Hugo, который предельно просто устанавливать (достаточно скачать бинарник) и использовать. Время генерации достаточно больших сайтов занимает секунды. Но в данном генераторе имеем нетривиальную систему построения правил генерации.
* Hakyll, написанный на странном языке, и требующий массу времени и энергии только на то, чтобы заставить его нормально работать.

