Advertisement
  1. Code
  2. Web Development

Создание статических сайтов с Jekyll

Scroll to top
Read Time: 12 min

() translation by (you can also view the original English article)

Полномасштабная CMS редко бывает необходима. Иногда вам нужно создать всего лишь легкий, статический веб-сайт ... но у вас слишком много страниц, чтобы их постоянно копировать из шаблона в шаблон. Сегодня я продемонстрирую простое решение - Jekyll - он очень облегчит процесс создания небольших веб-сайтов.


Шаг 0: Встречаем Jekyll

Jekyll - простой, основанный на блогах, статический генератор сайта.

Jekyll - простой, основанный на блогах, статический генератор сайта. Об этом говорит нам официальный сайт. Но что именно это значит? Статический генератор сайтов - это программа, которая принимает набор файлов и генерирует ваш сайт с ними. Как вы увидите, мы сможем использовать набор шаблонов, создавать файлы контента отдельно, а затем использовать Jekyll для создания нашего сайта. Часть, посвященная блогу, означает, что мы можем использовать его для создания блога или любого веб-сайта, на котором есть серия каких-либо постов (например, портфолио). Давайте попробуем!


Шаг 1: Установка Jekyll

См. Дополнительную информацию о Ruby Gems.

Мы начнем с установки Jekyll; это gem Ruby, поэтому сделать это довольно просто.

1
gem install jekyll # use `sudo` if your setup requires it

Да, это так просто. Есть еще несколько штук, которые мы могли бы установить, если планируем сделать более сложную настройку, однако в нашем уроке этого не будет, поэтому двигаемся дальше.


Шаг 2. Создание нашего первого шаблона

Каждый файл или папка, которая не начинается с подчеркивания, будет скопирована на сгенерированный сайт.

Затем создадим папки для Jekyll. Создайте папку с именем example-app для этого урока; мы создадим небольшой портфолио для фотографа. Это отличный пример того, где Jekyll сияет: это небольшой сайт, который не будет обновляться слишком часто, но достаточно велик, чтобы вы не хотели открывать каждую страницу, когда вам необходимо будет внести изменения разметки.

Внутри example-app создайте папку с именем _layouts. Обратите внимание на подчеркивание в начале этой папки: любая папка или файл, начинающийся с символа подчеркивания, не будет частью сайта, создаваемого Jekyll. Если у них есть имя, которое распознает Jekyll (например, _config.yml или _layouts), их содержимое будет использоваться при генерации сайта, но сами файлы не будут отображаться на сайте. Помните: каждый файл или папка, которая не начинается с подчеркивания, будет скопирована на сгенерированный сайт (который, кстати, по умолчанию относится к подпапке _site).

Итак, давайте создадим макет. Мы начнем с общего макета сайта, который включает весь «хром» для нашего сайта. Создайте новый файл под именем default.html внутри папки _layouts (имя не имеет значения) и добавьте к нему следующий код:

1
<!DOCTYPE html>
2
<html>
3
<head>
4
  <meta charset=utf-8 />
5
  <title> {% if page.title %} {{ page.title }} | {% endif %} John Doe, Photographer </title>
6
  <link rel="stylesheet" href="/css/styles.css" />
7
</head>
8
<body>
9
10
  <div id="main">
11
12
    <header>
13
      <h1> John Doe Photograghy </h1>
14
    <header>
15
16
    <nav role="navigation">
17
      <ul>
18
        <li><a href="/">Home</a></li>
19
        <li><a href="/portfolio/">Portfolio</a></li>
20
        <li><a href="/about">About</a></li>
21
        <li><a href="/contact">Contact</a></li>
22
      </ul>
23
    </nav>
24
25
    {{ content }}
26
27
    <footer>
28
      <p>@copy; John Doe Photography 2011 | All Rights Reserved. </p>
29
    </footer>
30
31
  </div>
32
</body>
33
</html>

Здесь следует иметь в виду несколько вещей ...

Во-первых, Jekyll использует систему шаблонов Liquid (по умолчанию). Это означает, что все, что вы можете сделать с Liquid, вы можете сделать в шаблоне в Jekyll. Например, в теге <title> мы используем оба типа разметки Liquid: разметка вывода и разметка тега. Разметка вывода может выводить текст (если существует ссылка на переменную), в то время как разметка тега нет. Разметка вывода разделяется двойными фигурными скобками, а разметка тегов разделена фигурной фигурной скобкой / процентом.

Следующее, что нужно заметить выше, - это то, что находится внутри тегов Liquid: такие вещи, как page.title и content. Это переменные, предоставленные Джекилом; вы можете увидеть список доступных данных шаблона в документах. Мы также можем создавать пользовательские данные шаблона, как мы вскоре рассмотрим.

Наконец, обратите внимание на CSS, который мы используем: создаем папку css в корне вашего проекта и бросаем этот стиль в файл style.css:

1
body {
2
  font: 16px/1.5 verdana, helvetica-neue, helvetica, arial, san-serif;
3
  background: black;
4
  color: #ececec;
5
  padding: 0;
6
  margin: 0;
7
}
8
ul {
9
  margin: 0;
10
  padding: 0;
11
}
12
a {
13
  color: #ccc;
14
  text-decoration: none;
15
}
16
17
a:hover {
18
  color: #ececec;
19
  text-decoration: underline;
20
}
21
22
#main {
23
  width: 960px;
24
  margin: 0 auto;
25
  background: rgba(255, 255, 255, 0.4);
26
}
27
header {
28
  padding: 0 10px;
29
  overflow: hidden;
30
}
31
h1 {
32
  margin: 0;
33
}
34
35
nav ul, ul.entries {
36
  list-style-type: none;
37
}
38
nav li a {
39
  float: left;
40
  margin: 5px; 
41
}
42
.content {
43
  padding: 10px;
44
}
45
46
ul.entries li {
47
  position: relative;
48
  margin: 20px auto;
49
  padding: 20px;
50
  background: #ececec;
51
  width: 600px;
52
}
53
54
ul.entries img {
55
  width: 600px;
56
}
57
58
ul.entries li h3 {
59
  position: absolute;
60
  bottom: -18px;
61
  left: 17px;
62
  font-size: 2em;
63
}
64
ul.entries a {
65
  color: #ececec;
66
}
67
ul.entries a:hover {
68
  color: #fff;
69
}
70
71
footer {
72
  font-size: 0.65em;
73
  text-align: center;
74
}

Кроме того, создайте папку img и добавьте изображение с именем banner.jpg; мы будем использовать его в ближайшее время. И так же для любого изображения: просто обрезайте его до 960px на 300px ;.

Возможно, вам интересно, почему мы используем оператор if выше, если переменная page.title просто не отображается, если она существует? Ну, если он существует, я хочу включить в него вертикальную полосу; Другой способ написать это будет следующим:

1
{{ page.title }}{% if page.title %} | {% endif %}

Итак, как мы используем этот шаблон? Ну, нам нужно создать страницу, которая будет использовать этот шаблон. В корневом каталоге нашего проекта создайте файл index.html. Вот его содержимое:

1
---
2
layout: default
3
---
4
<section role="banner">
5
  <img src="/img/banner.jpg" />
6
</section>
7
8
<section class="content">
9
  <p>
10
  Welcome to John Doe Photography! Please, check out my <a href="/portfolio/">Portfolio</a> to see my work.
11
  </p> 
12
</section>

Вот содержимое нашего файла index.html. Обратите внимание на то, что находится в верхней части файла: Jekyll называет это передним YAML. Любой файл (который не начинается с подчеркивания), который имеет переднюю грань YAML, будет создан Jekyll перед тем, как быть помещен в папку _site (если у него нет подчеркивания или YFM, тогда он будет просто скопирован в _site). В этом случае передняя часть YAML просто сообщает Jekyll, какой шаблон мы хотим использовать.

Теперь откройте терминал, cd в каталог вашего проекта и запустите jekyll. Вы должны увидеть что-то вроде этого:

1
WARNING: Could not read configuration. Using defaults (and options).
2
  No such file or directory - /Users/andrew/Desktop/example-app/_config.yml
3
Building site: /Users/andrew/Desktop/example-app -> /Users/andrew/Desktop/example-app/_site
4
Successfully generated site: /Users/andrew/Desktop/example-app -> /Users/andrew/Desktop/example-app/_site

Проигнорируйте предупреждение; мы скоро придем к этому. Пока вы можете видеть, что сайт был создан в недавно созданном каталоге _site. Если вы открываете файл _site/index.html в своем браузере на выбор, вы должны увидеть ... сбой. Проблема в том, что наши пути (URL-адреса и таблицы стилей) начинаются с косой черты. Это означает, что мы не можем просто просматривать их как файлы, мы должны просматривать их на сервере. Конечно, вы могли бы начать W/MAMP, но зачем брать на себя труд? Jekyll имеет встроенный сервер. Итак, запустите jekyll --server и перейдите на localhost:4000, чтобы увидеть что-то вроде изображения ниже:

Tutorial ImageTutorial ImageTutorial Image

Если изображения выше недостаточно, посмотрите код _site/index.html. Вы увидите, что указанный нами шаблон был смешан с содержимым, которое мы предоставили, и-voila! - у нас есть наша страница.

Я хочу напомнить вам, что это первый блок YAML делает всю эту магию; если файл не начинается с тремя тире, одной или несколькими строками свойств и другой линией из трех тире, файл будет просто скопирован в папку _site, без генерации.


Шаг 3: Создание шаблона портфолио

Теперь, когда мы будем закончили с основами, давайте создадим портфолио для нашего вымышленного фотографа. Помните, как я заметил, что Jekyll «для блогов»? Итак, мы будем использовать эту функцию для работы с блогом: вместо постов у нас будут записи портфолио.

Сообщения находятся в папке, называемой _posts, поэтому создайте ее сейчас. Шаблон имени файла для сообщений также должен быть конкретным: year-month-day-title.ext. Сообщения - ну, любой файл на вашем сайте Jekyll, действительно - может быть либо Markdown, либо HTML.

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

_posts/2010-03-04-bikes.md

1
---
2
layout: portfolio_entry
3
image: /img/bikes.jpg
4
title: Bikes, Black and White
5
---
6
Bikes are used by almost everyone in downtown Amsterdam. These ones are chained to a bike rack.

_posts/2010-10-01-wing.md

1
---
2
layout: portfolio_entry
3
title: Wing and a Prayer
4
image: /img/wing.jpg
5
---
6
The wing of the AirBus I rode to England.

_posts/2011-06-05-bridge.md

1
---
2
layout: portfolio_entry
3
title: Stone Bridge
4
image: /img/bridge.jpg
5
---
6
An old stone bridge in London.

_posts / 2011-07-09-road.md

1
---
2
layout: portfolio_entry
3
title: Road and Curb
4
image: /img/road.jpg
5
---
6
Bike lanes here are terribly thin.

Довольно просто, не так ли? Обратите внимание на то, как мы создаем пользовательское поле YAML: image. Это URL-адрес изображения для этой записи. Конечно, мы могли бы построить весь HTML-код в этом файле, но что, если мы хотим его изменить? Мы должны вернуться и изменить его в каждой записи. Таким образом, мы можем вместо этого использовать наш шаблон portfolio_entry для их рендеринга. Как выглядит этот шаблон? Это тоже довольно просто:

_layouts/portfolio_entry.html

1
---
2
layout: default
3
---
4
5
<h2 class="content">{{page.title}}</h2>
6
7
<img src="{{ page.image }}" />
8
9
{{ content }}

Если вы посмотрите на данные шаблона страницы, вы поймете, что любой пользовательский фронт, который мы добавим, будет доступен в page; поэтому здесь мы можем получить доступ к page.image. Мы также используем page.title и content (все после последней строки с тремя пунктами).

Я должен упомянуть здесь, что, хотя title сообщения должен быть доступен для объекта post, мне удалось заставить его работать с объектом page. Все работает!

Также обратите внимание, что у нас есть этот шаблон, используя наш макет default. Вы можете вкладывать шаблоны друг в друга таким образом.

Это дает нам наши страницы (публикации), но как насчет главной страницы портфолио? При написании нашей навигации в макете по умолчанию я отметил, что мы хотим, чтобы это было как /portfolio/. Итак, создайте папку, с именем portfolio в корневом каталоге, и откройте в ней файл index.html.

1
---
2
layout: default
3
title: Portfolio
4
---
5
6
<section class="content">
7
  <h2>Portfolio</h2>
8
9
  <p>Check out my images below!</p>
10
</section>
11
12
<ul class="entries">
13
  {% for post in site.posts %}
14
15
  <li>
16
    <a href="{{ post.url }}">
17
      <img src="{{ post.image }}" />
18
      <h3>{{ post.title }}</h3>
19
    </a>
20
  </li>
21
22
  {% endfor %}
23
</ul>

Это наша самая сложная часть. Помните, что это не шаблон: это «обычный» файл, но он все равно может содержать теги Liquid. Мы начинаем с установки layout в default и title в «Портфолио».

Обратите внимание, что в HTML у нас есть Liquid цикл for-in. Мы извлекаем все сообщения с сайта из sites.posts; затем, мы перебираем эти сообщения в цикле с помощью for post in site.posts / endfor. Если вы работали с WordPress или любой другой системой ведения блога, вы должны быть знакомы с концепцией loop. Вот и все! Внутри, как вы можете видеть, мы можем получить стандартные свойства, а также любые другие собственные данные, которые мы сами определили (например, image).

Теперь, если мы запустим jekyll --server для повторного создания сайта и запуска сервера, localhost:4000/portfolio/ должен отобразить это:

Tutorial ImageTutorial ImageTutorial Image

И вот страница входа:

Tutorial ImageTutorial ImageTutorial Image

Прекрасно! Вы создали портфолио. Я уверен, вы также видите, как это работает для блога. Давайте теперь перейдем к рассмотрению некоторых параметров конфигурации для Jekyll.


Шаг 4: Пишем файл конфигурации

Существует огромное множество вариантов для Jekyll. Замечательно, что у всех есть действительно разумные дефолты, но если вы хотите их изменить, это совсем не сложно.

Существует два способа установки параметров.

  • Во-первых, когда вы запускаете программу в командной строке, вы можете передавать параметры. Мы уже видели параметр --server, который запускает сервер после генерации сайта.
  • Другой способ - в файле конфигурации с именем _config.yml; это YAML файл, поэтому каждая строка представляет собой пару key:value, как и в случае с фронтом YAML. Jekyll будет искать этот файл перед созданием сайта.

Итак, создайте файл _config.yml, и давайте рассмотрим некоторые из наиболее распространенных опций.

Полный список параметров см. в документации по конфигурации.

  • auto: добавление auto: true в ваш конфигурационный файл заставит Jekyll следить за изменениями в вашей папке проекта и регенерации сайта «на лету».
  • source: Если исходные файлы находятся в другом каталоге, отличном от того, с которого вы запускаете Jekyll, вам нужно установить этот каталог в свойстве source.
  • destination: По умолчанию ваш сгенерированный сайт расположен в директории ./_site. Если вы хотите выбрать что-то другое, установите это здесь.
  • permalink: Постоянная ссылка - это путь к вашим сообщениям. По умолчанию это /year/month/day/title.html. Однако вы можете настроить это, если захотите. Среди прочих вы можете использовать переменные :year, :month, :day, :title и :categories. :categories исходят из фронта; все остальные относятся к имени файла поста. Затем вы можете установить permalink в такие значения, как /:year/:month/:title/ или /:categories/:title.html. Бонусный совет: если у вас есть свойство permalink в post front matter, оно переопределит значение по умолчанию для всего сайта.
  • exclude: Как я уже сказал выше, Jekyll не будет генерировать файлы в каталогах, которые начинаются с подчеркивания. Но если у вас есть папки, которые вы хотите игнорировать, но они при этом не начинаются с подчеркивания, вы можете сделать это с помощью exclude в вашем файле конфигурации.

Шаг 5: Развертывание сайта

Итак, предположим, что вы создали сайт и хотите его показать во всемирной паутине. Как это сделать?

Это можно сделать несколькими способами. Конечно, если это небольшой сайт, который вы не будете обновлять слишком часто, то просто установите его на свой сервер; это может быть вашим единственным вариантом, если вы используете общий хостинг.

Если у вас есть VPS или выделенный хостинг, вы можете сделать все более автоматически. Ознакомьтесь с документацией по развертыванию. Если вы не знаете, что делать, попробуйте следовать указаниям для использования git post-receive hook; Я пробовал их, и это довольно круто.


Шаг 6: Что делать дальше

Это только верхушка Джекила.

  • Существует плагиновая архитектура, позволяющая вам изменять способ создания вашего контента.
  • Больше всего вы можете сделать с Liquid и некоторыми Liquid расширениями, которые добавляет Jekyll.
  • Есть много данных о шаблонах, о которых мы не говорили. Проверьте это и посмотрите, что вы можете сделать!

Вывод

Ну, это ваше введение в Jekyll - простой, известный в блогах, статический генератор сайтов. В следующий раз, когда вы создадите сайт в стиле брошюры, визитная карточка, сайт микропортфолио, подумайте, что вы попробуете Jekyll? Дайте мне знать в комментариях и благодарим вас за чтение!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.