Создание веб-сайта с Nuxt.js и WordPress REST API

Обновление:
Теперь вы можете использовать мой шаблон из общедоступного репо:
https://github.com/bovas85/nuxt-headless
(пожалуйста, пометьте 🌟 если вы это цените, не стесняйтесь вносить свой вклад).

Часто мы оказываемся в ситуации, когда нашим клиентам нужна система управления контентом (CMS и далее), которая позволит им редактировать свои страницы, не зная для этого HTML-код.

Затем обычно возникает выбор между индивидуализированной CMS и WordPress (в последнее время мы видим все больше и больше «безголовых» CMS, а также очень действенную альтернативу уценке или статическим вариантам CMS).

В нашем случае мы выбрали WordPress по нескольким причинам:
- Это надежная CMS с многолетним опытом работы в этой области
- Проблемы с безопасностью теперь почти исчезли, учитывая автоматические обновления безопасности из версии 4.7 и более поздних версий (я могу ошибаться в версии, не цитируйте меня по этому поводу).
- WordPress REST API дает нам доступ к нескольким полям (и настраиваемым) без необходимости обслуживания всего интерфейса с помощью WordPress.

Наш Backend-разработчик также был лучше знаком с PHP, Laravel и WordPress, чем с другими технологиями, поэтому, к счастью, в конце концов мы остановили свой выбор на WordPress.

Что касается Frontend, я отвечал за выбор стека, и, поскольку я очень люблю Vue.js (Vue 2), я определенно продвинул это вперед, используя Nuxt.js для рендеринга на стороне сервера (с этого момента SSR).

Часть 1. Что такое Nuxt.js?

Nuxt.js PRO:
1) автоматически генерируемая маршрутизация с промежуточным программным обеспечением, валидаторами и т. д.
2) полная поддержка SSR из коробки с поддержкой vuex
3) страницы система с обработчиками асинхронных данных, переходами, индикатором загрузки и т. д.
4) система макетов из коробки
5) обработка метаданных из коробки с поддержкой SSR
6) все модные модули nuxt, обеспечивающие такие вещи, как PWA, аутентификация, автономная поддержка и многое другое
7) подход к конфигурации, который я предпочитаю.
8) Сообщество разработчиков Vue, которые все работают с одним и тем же упрямым подходом.

Пункт 8 особенно велик, потому что сообщество Vue чрезвычайно разделено из-за того, что Vue является прогрессивным фреймворком.
Люди используют Vue по-разному, поэтому здорово, что большая часть сообщества Vue действительно использует Vue таким же образом.

Это без учета SSR ...

- @ gustojs # 2934 с канала VueLand в Discord

Как видите, эти функции являются огромным преимуществом для небольшого агентства, которое не может тратить слишком много времени на разработку корпоративной архитектуры для своего стека.
WordPress недавно включил REST api в основной пакет (4.6.0 ) и я решил попробовать это для нашего первого сайта.

Это был переход с внешнего интерфейса AngularJS…

Часть 2, начальная настройка

Первым требованием было сделать веб-сайты максимально дружественными к SEO, исходя из Angular 1 / 1.5, где единственным простым решением был prerender.io (который не был реализован).

Раньше я пробовал Nuxt для побочного проекта, но ничего не получается, если вы не усердно над ним работаете.

Я был знаком с VueJS, но первоначальная настройка Nuxt оставила у меня несколько сомнительных возможностей. Это выглядело слишком просто, чтобы быть правдой, и без какой-либо конфигурации из исходного интерфейса командной строки.

Вы можете начать с установки vue cli, если еще не сделали этого:

npm install -g vue-cli

(следите за vue-cli 3, который скоро выйдет, поскольку он может изменить эту следующую команду)

Затем, используя vue-cli, вы можете запустить новый проект Nuxt, набрав:

vue init nuxt-community/starter-template <project-name>

Где ‹project-name› - это ваша папка и имя проекта.
Вы создадите каталог, содержащий несколько других и файл nuxt.config.js:

Первое, что нужно понять о Nuxt, - это то, что это беспроблемный фреймворк вокруг VueJS и SSR.

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

Часть 3, Идем глубже

Первоначально основная проблема заключалась в том, как интегрировать sass и использовать переменные sass в моем проекте.
Мне пришлось сделать это волшебство, чтобы переменные были доступны в каждом отдельном файловом компоненте (SFC) или странице

Это стало намного проще благодаря модулю Nuxt, который можно просто добавить в nuxt.config в массив со списком переменных sass для глобальной загрузки.

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

По какой-то причине я подумал, что глобальный миксин был хорошей идеей

Реальность такова, что когда у вас есть пара компонентов, может быть, панель навигации или модальные окна, уже пора загружать Vuex.

Сделать это в Nuxt очень просто:

Nuxt также позволяет заранее загружать каждое значимое состояние с помощью действия NuxtServerInit в магазине.
Это позволяет вам предварительно загружать все, что вам нужно, без необходимости использовать смонтированный для его загрузки (и таким образом терять SSR).

Существуют и другие методы, которые можно использовать вне хранилища: asyncData (загружает данные в компонент) и fetch (фиксирует изменения или отправляет действия).

Их можно использовать, если вам нужно что-то только локально внутри компонента или страницы.

Здесь нужно понимать, что мы имеем дело с двумя экземплярами.
Один на сервере, виртуальный и невидимый, и один на стороне клиента.

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

Nuxt включает в себя компонент ‹no-ssr›, который может обернуть все, что угодно, включая другие компоненты, если у вас есть единственный корневой элемент внутри него.

Этот плагин позволяет внутреннему содержимому жить только на стороне клиента и особенно полезен при работе со сторонними плагинами, которые могут содержать ссылки на элементы окна или DOM и не нужны на стороне сервера.

Если вы не сделаете этого или чего-то еще, что я покажу сейчас, вы можете столкнуться с другой древовидной структурой, о которой Nuxt уведомит вас:

Другая проблема заключается в том, как библиотеки и компоненты загружаются в Nuxt.
Мы загружаем их, создавая плагины в папке плагинов и прикрепляя их с помощью Vue.use, Vue.component или Vue.directive.

Второй шаг здесь - добавить этот плагин в nuxt.config, и здесь мы можем указать, готов ли это плагин к ssr (просто введя путь к плагину) или нет, указав там ssr: false.

Часть 4: работа с вызовами WordPress CMS и API

После того, как основной проект настроен и вы начнете работать с каждой страницей, самый быстрый и лучший подход, на мой взгляд, - это добавить плагин под названием:
Расширенные настраиваемые поля (ACF)
в бэкэнд WordPress.

Это добавляет функциональность настраиваемых полей на страницы и сообщения в WordPress.
Чтобы расширить это до REST API, вам также понадобится плагин под названием
ACF to REST API

Некоторые полезные дополнения:
Поля фильтра WP REST API
поля фильтра. Позволяет фильтровать поля, возвращаемые API.

WP REST API Pure Taxonomies
Этот плагин включает все доступные атрибуты таксономии в WordPress REST API (v2) без дополнительных запросов API.

WP REST API Cache
Включите кеширование для WordPress REST API и увеличьте скорость вашего приложения. (Я не рекомендую использовать этот плагин)
Предостережение:
Если вы выполняете почтовые запросы (пример плагина contact-form-7), убедитесь, что вы не используйте этот плагин или, если да, отфильтруйте строку 'contact-forms' в functions.php, как показано ниже:

add_filter( 'rest_cache_skip', function( $skip, $request_uri ) {
  if ( ! $skip && false !== stripos( $request_uri, 'contact-form-7' )) {
    return true;
  }
  return $skip;
}, 10, 2 );

Меню WP REST API
Расширяет WP API маршрутами меню WordPress.

Следующим шагом была настройка конечных точек API.
Я лично использовал файл config.js, который можно импортировать следующим образом:

импортировать конфигурацию из ‘~ / assets / config’;

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

Вышеупомянутое частично взято у оператора роскошных путешествий Antilophia.
Сайт еще не работает, но я обновлю его здесь, когда он появится. Будьте на связи ;)

Получив указанную выше конфигурацию, вы можете настроить приложение для получения данных либо с помощью nuxtServerInit, либо с помощью fetch / asyncData.

После этого вы можете заполнить каждый раздел веб-сайта, используя расширенные настраиваемые поля, а также остальные доступные поля WordPress API (что угодно на самом деле).

Сервер будет обновлять контент каждый раз, когда загружает сеанс для пользователя.

Вы можете создавать динамические страницы, используя структуру папок: ‹dynamic-param›
Где ‹dynamic-param› - имя нужного вам параметра (например: пункт назначения)

Это дает вам доступ к параметру, используя:

this.$route.params.<dynamic-param>

Например, /pages/:mexico/index.vue вернет

this.$route.params.destination === ‘mexico’

Помните, что в asyncData или fetch у вас нет доступа к this, поскольку он запускается до монтирования страницы, но вы можете получить доступ к контексту ».

async fetch ({app, store, params}) {
  // this gives you acess to route params with the shorthand params 
  // but also to the store and the other app values
  // check all fields at https://nuxtjs.org/api/context/
}

Если у вас много вызовов API, я могу предложить два варианта:
- Используйте плагин WP REST API Cache, например WP REST API Cache
-
Cache nuxtServerInit calls ( предпочтительно)

Для последнего это немного сложно и требует использования механизмов lre-cache и пакета axios-extensions.
Суть со всеми файлами приведена ниже.

Ссылка: https://gist.github.com/bovas85/8b5610ac94dd036628f53f702b300a64

Это особенно полезно, если вы создаете статический сайт (nuxt generate), поскольку nuxtServerInit будет запускаться один раз на каждую сгенерированную страницу (представьте, что у вас 20 динамических страниц, тогда он будет запускать 20 * вызовов API).

Часть 5. Как насчет развертывания приложения?

Мы попробовали два маршрута с этим.
1) Мы использовали статический сайт, созданный с помощью nuxt, обслуживаемый обычным сервером (старая школа). Быстро, но недостатком является то, что если у вас много динамических страниц, рендеринг динамических маршрутов будет немного сложным и медленным (проверьте здесь, как это сделать);
2) Мы использовали службу, размещенную на nodeJS, например Now (их несколько, или даже просто воспользуйтесь вашим хостингом, если он поддерживает NodeJS, наш - нет).

Я написал статью о конкретной проблеме при переносе домена на Now с GoDaddy, вы можете прочитать ее здесь:

Развертывание приложения SSR в Zeit Now из GoDaddy @MoustacheDsign https://medium.com/@moustachedesign/deploying-your-ssr-app-to-zeit-now-from-godaddy-41b51302375f

Теперь, после установки cli, вы просто набираете сейчас, и он развернет ваш сайт SSR за секунды (буквально, в зависимости от вашего соединения и размера сайта;))

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

Часть 6. Что дальше с Vue и Nuxt?

Vue и Nuxt больше не новички, существует большая экосистема плагинов, модулей и библиотек, которые доступны и будут становиться все больше и больше.

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

Nuxt.js - это OpenCollective и самофинансируемый.
Если вам это нравится так же, как и мне, подумайте о пожертвовании на https://opencollective.com/nuxtjs

Присылайте вопросы для Nuxt здесь (он интегрируется с проблемами Github, очень удобно!):
https://nuxtjs.cmty.io

Это обертка

У вас есть вопросы?
Если да, не стесняйтесь комментировать ниже или написать мне в Твиттере @moustacheDsign

Некоторые сайты, которые я создал, следуют этому подходу:









Если у вас есть вопросы, ответьте здесь или напишите мне в Твиттере @moustacheDsign