Vuepress - это новая популярность, когда дело доходит до генераторов статических сайтов. Создатель Vue Эван Вы разработали этот инструмент для написания документации, однако он настолько мощный и гибкий, что его можно полностью настроить в соответствии с вашими потребностями 💪. Сегодня я покажу вам, как создать блог с помощью Vuepress.
В этом руководстве предполагается, что вы имеете базовое представление о Vuepress.
Структура этого проекта:
. ├── docs │ ├── .vuepress │ │ ├── components │ │ │ └── Posts.vue │ │ ├── config.js │ │ └── public │ │ ├── image.jpg │ │ ├── image-1.jpg │ │ └── image-2.jpg │ ├── README.md │ └── interviews │ ├── README.md │ ├── post-1.md │ ├── post-2.md │ ├── post-3.md │ └── post-4.md ├── package-lock.json └── package.json
Создание постов
Создайте новый каталог с именем по вашему выбору внутри docs
, в данном случае мы назовем его interviews
. Внутри interviews
мы можем создавать наши файлы уценки и называть их как угодно, за одним исключением, если существует README.md
, который действует как базовый путь для этого маршрута.
например ,README.md
в каталоге интервью будет отображаться как /interviews/
Чтобы мы могли собирать и упорядочивать наши посты, мы будем использовать то, как Vuepress использует frontmatter. Вверху каждого файла разметки, который мы создали в каталоге интервью, мы собираемся добавить yaml:
--- image: /example-image.jpg title: Example title description: This is the example description for our first post. date: 03-25-18 (mm-dd-yy) ---
Свойство и значения следует менять местами и изменять в зависимости от сообщения. Все это должно быть самоочевидным, однако, если это не так, это будет иметь смысл позже.
Компонент Vue
Если вы посмотрите на структуру проекта ранее в этом посте, вы увидите каталог .vuepress
, именно здесь мы можем настроить Vuepress.
Примечание. Если вы хотите создать свою собственную тему, вы можете eject
Vuepress и использовать тему по умолчанию в качестве отправной точки.
В папке components
создайте файл Posts.vue
со следующим кодом:
Когда файлы Vue создаются в /components
, они автоматически регистрируются как глобальные асинхронные компоненты (убедитесь, что имя пользовательского компонента содержит дефис или находится в PascalCase).
Примечание: когда мы используем компонент в нашей уценке, он будет выглядеть как <Posts page="interviews">
(где опора страницы является необязательной).
Чтобы немного объяснить, что здесь происходит в наших тегах скрипта, мы сначала делаем значение props доступным для нашего компонента. Затем мы объявили вычисляемое свойство posts
. currentPage
затем принимает либо значение свойства страницы, которое было передано вниз, либо текущее базовое имя пути (в этом примере это будет /interviews/
)
this.$site.pages
получает метаданные для каждой страницы сайта, и отсюда мы можем получить доступ к пути для каждой страницы. Метод фильтра выполняет итерацию по всем страницам и возвращает только те, которые соответствуют значению currentPage
и имеют расширение .html
. Мы делаем это так, чтобы наша сетка / список отображала только сообщения из нужного нам каталога.
Вот здесь и появляются основные данные. Мы получаем доступ к дате через .frontMatter.date
, создаем объект new Date
и затем возвращаем массив со всеми сообщениями, упорядоченными от самых последних к самым старым.
В нашем template
директива v-if
проверяет, существуют ли какие-либо posts
, если их нет posts
, то div не отображается. Директива v-for
проходит через все posts
, каждая из которых становится доступной в рамках цикла как post
. Эта концепция должна показаться вам очень знакомой, если вы использовали for of
в javascript. Для SPA
мы используем router-link
вместо <a href=""></a>
, поскольку мы хотим перехватить событие клика, чтобы браузер не пытался перезагрузить страницу.
Теперь все просто, мы создаем элементы для изображения, заголовка и описания и используем обложку каждого поста, чтобы заполнить каждое из них данными.
Примечание: img src
предполагает, что все ваши изображения находятся в общей папке вашего .vuepress
каталога.
Config.js
Далее мы собираемся создать файл config.js в каталоге .vuepress
со следующим:
Это очень простая конфигурация, которая добавляет заголовок вашего сайта и несколько ссылок на вашу навигацию. Вы можете более подробно изучить доступные варианты на странице https://vuepress.vuejs.org/config/.
Собираем все вместе
Теперь мы написали наш компонент и можем использовать его в нашей уценке. В наших Интервью README.md
мы можем добавить<Posts />
, и все сообщения из interviews
будут обработаны, ура! Заметили, как мы не пропустили реквизит? Это потому, что нам нужны только сообщения в этом каталоге. Однако, если бы мы хотели, чтобы сообщения из интервью отображались на главной странице, мы бы добавили <Posts page="interviews" />
в наши документы README.md
, и все наши сообщения из интервью отображались на нашей домашней странице!
Компонент, который можно использовать повторно, и мы можем использовать его любое количество раз, это означает, что если у нас есть несколько каталогов, заполненных сообщениями, мы могли бы сделать что-то вроде:
<Posts page="interviews" /> <Posts page="travel" />
и он будет отображать сообщения из каждой коллекции 🙌
Стили
Имейте в виду, что в этом примере используются только собственные стили Vuepress. Для дальнейшей настройки (что я рекомендую вам сделать) вы можете добавить свои собственные стили, больше об этом можно найти на https://vuepress.vuejs.org/default-theme-config/#simple-css-override.
Le Fin
Я надеюсь, что этот пост был полезен и поможет вам лучше понять одно из возможных решений для создания блога на Vuepress.
Я создал более полный пример на https://adam-collier.github.io/Midl/, однако сначала он был удален, и многие стили и компоненты по умолчанию были изменены.
Преимущество подхода, продиктованного в этом посте, заключается в том, что ни один из кодов Vuepress по умолчанию не был изменен, поэтому у вас есть возможность обновить Vuepress без каких-либо последствий.
Если у вас есть вопросы, напишите мне в твиттер! @Collieradam