В последнее время я много говорил и писал на тему генераторов статических сайтов. Вообще говоря, я рекомендую использовать Jekyll как наиболее стабильный и многофункциональный вариант для создания статических сайтов, доступных на сегодняшний день. Тем не менее, тот факт, что Jekyll основан на Ruby, может помешать некоторым разработчикам, особенно тем, кто не знаком с Ruby. Самый частый вопрос, который я получаю: «Есть ли хороший вариант, основанный на JavaScript и доступный через npm?»
В этой статье, первой из двух частей, мы рассмотрим один из таких вариантов, Wintersmith . Wintersmith — это надежный генератор статических сайтов с одним из основных препятствий (на мой взгляд): отсутствие подробной документации. Надеемся, что эта статья поможет всем, кто интересуется опцией на основе JavaScript, доступной через npm, начать создавать статические сайты с Wintersmith.
Образец сайта
В этой статье мы будем использовать созданный мной образец сайта, который вы можете найти здесь . Образец — время приключений! Фан-сайт, который выглядит как на картинке ниже.
Цель проекта состояла в том, чтобы перестроить этот сайт с помощью ряда генераторов статических сайтов, чтобы сравнить их. Хотя сайт намеренно прост, он содержит ряд ключевых функций, которые мы рассмотрим в Wintersmith :
- Пользовательские глобальные метаданные — возможность установки глобальных пользовательских метаданных для сайта, к которым можно обращаться и использовать в шаблонах;
- Пользовательские метаданные поста — возможность устанавливать индивидуальные метаданные для каждого поста, к которым можно получить доступ при публикации поста или при отображении самого поста;
- Наборы данных — возможность добавлять контент, который представляет собой не сообщение или страницу, а пользовательский тип данных (в данном примере это символьные данные).
Все данные персонажей, контент и изображения, использованные в образце, взяты из времени приключений! вики Дизайн был основан на бесплатном шаблоне от HTML5UP .
Как настроить Винтерсмит
Одно из преимуществ Wintersmith, основанного на Node.js и npm, заключается в том, что процесс установки очень прост. Вы должны выполнить команду ниже, чтобы установить ее (примечание: sudo
$ sudo npm install -g wintersmith
Вот и все — вы хорошо идти! Теперь давайте создадим новый проект.
Создание сайта
Чтобы создать новый сайт с помощью Wintersmith, введите следующую команду:
$ wintersmith new [project name]
Для примера сайта мы дадим проекту название «wintersmithsite». Итак, команда для выполнения:
$ wintersmith new wintersmithsite
Он сгенерирует папку с заданным именем проекта, которая включает в себя набор файлов, которые мы можем изменить, чтобы начать создание нашего веб-сайта.
Если мы посмотрим на сгенерированные файлы, то увидим, что Wintersmith размещает конфигурацию, шаблоны и плагины на корневом уровне, а файлы сайта размещаются в папке с именем «content».
Тестирование сайта
Чтобы запустить проект на локальном сервере, измените каталог и запустите предварительный просмотр:
$ cd wintersmithsite
$ wintersmith preview
По умолчанию локальный сервер работает через порт 8080, поэтому мы можем открыть сайт, перейдя по http://localhost:8080
Мы можем указать другой порт, используя опцию -p
Кроме того, по умолчанию сервер многословен и будет выводить подробные сообщения об ошибках и загруженные ресурсы на консоль. Есть ряд других опций для сервера, которые мы можем узнать, введя команду:
$ wintersmith preview -help
Параметры также можно установить в файле конфигурации сайта с именем config.json
Основы шаблонов
Wintersmith по умолчанию использует Jade в качестве языка шаблонов. Этот учебник будет использовать его, но Wintersmith предлагает большое количество доступных плагинов, если вы предпочитаете другой язык шаблонов.
Шаблоны находятся в папке «templates» в корневом каталоге сайта. Jade — очень лаконичный язык шаблонов — здесь нет скобок, закрывающих тегов и отступов . Давайте рассмотрим некоторые основы создания шаблонов с помощью Jade.
Выходные данные
Jade предоставляет несколько способов вывода данных из переменных. Наиболее распространенным при создании шаблона сайта является установка тега равным значению переменной. Например, следующий пример из templates/article.jade
<h2>
h2= page.title
По умолчанию содержимое переменной экранируется перед выводом. Это означает, что если он содержит HTML, теги не будут отображаться в выводе, а, скорее, отображаются в виде простого текста. Когда они нам нужны, мы должны добавить восклицательный знак, как в этом примере из templates/article.jade
section.content!= typogr(page.html).typogrify()
Мы можем сделать то же самое с атрибутами. В следующем примере из templates/partials/homepagemiddle.jade
<a>
href
a(href= article.url, class="image featured")
Если вам интересно, какие переменные доступны для объекта страницы по умолчанию, в документации перечисляются их. Я должен отметить, что переменная article
Другой способ вывода переменных с использованием Jade — использовать #{ variableName }
Когда мы делаем это, содержимое переменной экранируется. В нашем примере нет примеров этого метода.
Если вы хотите вывести содержимое переменной unescaped, используйте синтаксис !{ variableName }
Например, когда мы выводим содержимое тела сообщения, мы хотим, чтобы любые теги в нем отображались. Один пример взят из templates/partials/homepagemiddle.jade
| !{ typogr(article.intro).typogrify() }
Канал, предшествующий предыдущей строке кода, означает, что содержимое будет отображаться в виде простого текста .
модули npm
Вы можете быть удивлены тем, что typogrify()
Одним из преимуществ Wintersmith является то, что он поддерживает использование модулей npm. Сгенерированный сайт включает в себя три: typogr (это то, что вы видите выше); Moment.js (чтобы узнать больше о моменте, вы можете прочитать статью « Управление датами и временем с помощью Moment.js» ); и подчеркивание .
Давайте рассмотрим использование Moment.js для форматирования даты в шаблоне, как в этом примере из templates/partials/homepagemiddle.jade
p= "Posted " + moment.utc(article.date).format('MMM DD, YYYY')
Moment.js предлагает гораздо больше функциональности, чем просто форматирование, и все это доступно в наших шаблонах. Но мы не ограничены только Moment.js, так как мы можем просто добавить любой модуль npm в секцию require
config.json
Включает
Мы хотим разделить шаблоны, чтобы сделать их более удобными для обслуживания и повторного использования. Мы можем сделать это, используя включает . Этот код из npm install
templates/index.jade
templates/partials/header.jade
include ./partials/header
Jade также поддерживает наследование, которое можно использовать для создания похожих, отдельных и повторно используемых блоков шаблонного кода. Если вы хотите получить более подробную информацию о наследовании, проверьте документацию .
Conditionals
В некоторых случаях вам может потребоваться отобразить различные аспекты шаблона в зависимости от определенных условий. Это можно сделать с помощью условных выражений в Jade . Jade поддерживает if
else if
else
unless
if
В этом примере из templates/partials/header.jade
index.html
if !page
section(id="banner")
header
h2 Explore the Land of Ooo...
p ...and its many kingdoms!
Это условие также может быть записано как unless page
Jade также поддерживает блоки операторов case
Если вы хотите узнать больше, пожалуйста, обратитесь к официальной документации .
перекручивание
Зацикливание — это то, что мы часто используем в наших шаблонах, независимо от того, переходим ли мы к постам или данным. Для таких нужд Jade поддерживает циклы each
while
.
Следующий пример из templates/partials/homepagemiddle.jade
each
В середине домашней страницы мы показываем каждого персонажа с его изображением, именем и описанием. each
character
each character in contents.characters
div(class="4u")
section(class="box")
span(class="image featured")
img(src= character.metadata.image)
header
h3= character.metadata.name
p= character.metadata.description
К сожалению, нет поддержки для добавления ограничения или смещения к циклу. Вместо этого мы можем сделать это, комбинируя переменные и условные выражения. В следующем примере мы показываем только первые две записи (аналогично лимиту). Имейте в виду, что переменные, задающие строки ( i
articles
-
Это означает, что нет соответствующего кода, сгенерированного в выходных данных шаблона.
- var i=0
- var articles = env.helpers.getArticles(contents);
each article in articles
- i++
if i<3
div(class="6u")
section(class="box")
a(href= article.url, class="image featured")
img(src= article.metadata.banner)
header
h3= article.title
p= "Posted " + moment.utc(article.date).format('MMM DD, YYYY')
| !{ typogr(article.intro).typogrify() }
footer
ul(class="actions")
li
a(href= article.url, class="button icon fa-file-text") Continue Reading
Вы заметите, что мы используем env.helpers.getArticles(contents);
чтобы получить массив статей в папке содержимого / статей. Это не очень хорошо документировано из того, что я мог бы сказать, но этот метод происходит из плагина paginator , который можно настроить в config.json
Следующий пример и последний пример этой статьи копируются с использованием смещения и предела, чтобы показать следующие пять статей после первых двух:
- var i=0
- var articles = env.helpers.getArticles(contents);
each article in articles
-i++
if (i>2) && (i<8)
li
span(class="date")
!=moment.utc(article.date).format('MMM')
strong= moment.utc(article.date).format('DD')
h3
a(href=article.url)= article.title
p= article.metadata.shortdesc
Вывод
В этой статье я познакомил вас с Wintersmith, который является хорошим вариантом, если вы ищете генератор статического сайта на основе Node.js. Я рассказал о том, как установить Wintersmith и начать работу с ним, а также обсудил некоторые функции Jade, системы шаблонов по умолчанию. Во второй части я научу вас, как создавать посты в формате Markdown, как настраивать метаданные, а также как создавать и развертывать статический веб-сайт.
Как вы видели, одним из интересных аспектов Wintersmith является его способность использовать модули npm. Это дает разработчикам возможность выбора при настройке своего сайта или добавления дополнительных функций, которые могут им понадобиться.