Створення сучасного блогу з Nuxt 3 та Payload CMS: Повний посібник

У цьому підручнику ми створимо сучасний блог, використовуючи Nuxt 3 як фронтенд фреймворк і Payload CMS як наш безголовий контент-менеджмент-система. Ви дізнаєтеся, як налаштувати обидві системи, підключити їх і створити просту платформу для блогу.

Що ми створимо

  • Фронтенд на Nuxt 3 з можливостями SSR
  • Бекенд Payload CMS для керування контентом
  • Сторінки списку постів і деталі поста
  • Інтеграція з API
  • Підтримка TypeScript

Попередні вимоги

  • Встановлений Node.js 16+
  • Базові знання Vue.js/Nuxt
  • Встановлений Postgres локально
  • Git для контролю версій

Частина 1: Налаштування фронтенду (Nuxt 3)

Створимо наш додаток на Nuxt 3:

# Створіть папку для проекту, у цьому випадку я назву її  
# nuxt_payload  
mkdir nuxt_payload
# Перейдіть до папки  
cd nuxt_payload  
# Створіть новий проект Nuxt  
npx nuxi init frontend  
cd frontend  
# Встановіть залежності  
pnpm install  
# Відкрийте в редакторі  
code .

Для простоти я буду використовувати бібліотеку Tailwind CSS, https://nuxt.com/modules/tailwindcss

# інсталяція  
npx nuxi@latest module add tailwindcss

У файлі nuxt.config.ts додамо @nuxt/ui у модулі, і він автоматично імпортує всі компоненти.

// frontend/nuxt-config.ts  
export default defineNuxtConfig({  
 compatibilityDate: '2024-11-01',  
 devtools: { enabled: true },  
 modules: ['@nuxtjs/tailwindcss'],  
})

Тепер ми можемо запустити і побачити стандартну сторінку, яку створив для нас Nuxt.

pnpm run dev

pic

Фронтенд Nuxt

Частина 2: Налаштування бекенду (Payload CMS)

# Поверніться до кореневої папки  
cd ..  

# Створіть папку для бекенду  
mkdir backend  
cd backend  
# Ініціалізуйте новий проект Payload  
npx create-payload-app  
# Виберіть наступні параметри:  
# - Назва проекту: backend  
# - Шаблон: blank  
# - База даних: Postgresql  
cd backend  
# Встановіть необхідні пакети:  
pnpm i @payloadcms/richtext-lexical  
pnpm dev

У браузері перейдіть за адресою http://localhost:3000/admin, і ви побачите цю сторінку.

pic

Вхід до бекенду Payload

На цій сторінці ми можемо створити першого користувача, який буде адміністратором сайту. Після цього ви будете перенаправлені на сторінку, де побачите дві стандартні колекції, які Payload створює для нас: користувачі та медіа.

pic

Колекції за замовчуванням Payload

Створення нової колекції

Тепер, коли бекенд запущено, давайте створимо нову колекцію, яку ми можемо витягувати з нашого додатку на Nuxt.

// backend/src/collections/Posts.ts  
import { CollectionsConfig } from 'payload/types';  

export const Posts: CollectionsConfig = {  
 slug: 'posts',  
 admin: {  
 useAsTitle: 'title'  
 },  
 access: { read: () => true, },  
 fields: [{  
 name: 'title',  
 type: 'text',  
 required: true  
 },  
 {  
 name: 'slug',  
 type: 'text',  
 required: true,  
 unique: true  
 },  
 {  
 name: 'content',  
 type: 'richText',  
 required: true,  
 },  
 {  
 name: 'featuredImage',  
 type: 'upload',  
 relationTo: 'media',  
 required: true,  
 },  
 {  
 name: 'author',  
 type: 'relationship',  
 relationTo: 'users',  
 required: true,  
 },  
 {  
 name: 'status',  
 type: 'select',  
 options: [{  
 value: 'draft',  
 label: 'Draft',  
 },  
 {  
 value: 'published',  
 label: 'Published',  
 },  
 {  
 value: 'archived',  
 label: 'Archived'  
 }  
 ],  
 defaultValue: 'draft',  
 required: true,  
 },  
 {  
 name: 'publishedDate',  
 type: 'date',  
 required: true,  
 },  
 ]  
}

Коли ми створили всі необхідні поля для нашої нової колекції, нам потрібно імпортувати її в файл payload.config.ts і додати в масив колекцій.

import { Posts } from './collections/Posts';

export default buildConfig({
admin: {
user: Users.slug,
importMap: {
baseDir: path.resolve(dirname),
},
},
collections: [Users, Media, Posts],
editor: lexicalEditor(),
...
})
```

Тепер перезапускаємо наш сервер і повинні побачити нашу нову колекцію в лівій боковій панелі і створювати нові пости.

pic

Payload — Створення нового поста

Ось що ви побачите після успішного створення нового поста.

pic

Payload — Список постів

Підключення Nuxt і Payload

Перше, що нам потрібно зробити — це змінити файл payload.config.ts, щоб додати URL сервера та дозволити нашому додатку Nuxt підключатися до бекенду.

// backend/src/payload.config.ts  
...  
export default buildConfig({  
 serverURL: '',  
 ...
// Ми використовуємо порт 3001, оскільки будемо налаштовувати   
// наш додаток Nuxt для роботи з цим портом  
 cors: [''],   
})

Тепер у файлі nuxt.config.ts ми змінимо порт, на якому працює додаток, та додамо публічний API URL.

// frontend/nuxt-config.ts  
export default defineNuxtConfig({  
 devServer: {  
 port: 3001   
 },  
 compatibilityDate: '2024-11-01',  
 devtools: {  
 enabled: true  
 },  
 modules: ['@nuxtjs/tailwindcss'],  
 runtimeConfig: {  
 public: {  
 apiBase: process.env.PAYLOAD_PUBLIC_BASE_URL || ''  
 }  
 },  
})

Після перезапуску сервера та застосування цих змін ми зможемо отримати дані з нашого бекенду (Payload CMS) у додаток Nuxt.

Створення Composable та UI

Ми створимо composable, який отримуватиме список постів з нашого бекенду, і на основі цих даних відобразимо список постів на сайті.

// frontend/composables/usePayloadAPI.ts  
export const usePayloadAPI = () => {  
 const config = useRuntimeConfig()  

 const fetchPosts = async (page = 1, limit = 10) => {  
 try {  
 const { data } = await useFetch(`${config.public.apiBase}/api/posts`, {  
 params: {  
 page,  
 limit,  
 depth: 2,  
 sort: '-publishedDate',  
 },  
 })  
 return data.value  
 } catch (error) {  
 console.error('Помилка при отриманні постів:', error)  
 return null  
 }  
 }  
 return {  
 fetchPosts,  
 }  
 }

Тепер нам потрібно створити компонент картки блогу, який відображатиме вміст з нашого API.

// frontend/components/blog/BlogCard.vue  


Для простоти я налаштував тип поста як any, але зазвичай ви визначатимете тип поста та всі властивості, яких очікуєте, щоб уникнути невідповідностей або помилок через невідомі властивості.

Тепер нам потрібно створити основну сторінку, frontend/pages/index.vue. Ця сторінка відображатиме список постів за допомогою компонента BlogCard і даних, які ми отримали з API.



На цьому етапі, якщо ви перейдете за адресою http://localhost:3001, ви повинні побачити список ваших блог-постів.

pic

Картки постів

Створення сторінки одного поста

Тепер створимо нову сторінку, яка використовуватиме slug як параметр маршруту для отримання даних для поточного поста. Нижче наведено простий компонент, який відображатиме вміст поста.

Перед створенням сторінки нам потрібно встановити пакет для серіалізації вмісту нашого поста, оскільки це необхідно через спосіб, яким обробляється багатий текст у Payload CMS.
https://github.com/fsyntax/payload-lexical-nuxt-serializer.

У нашій папці фронтенду виконуємо

pnpm dlx nuxi module add payload-lexical-nuxt-serializer

І додаємо наступне в файл nuxt.config.ts.

...  
components: true,  
payloadLexicalNuxtSerializer: {  
 componentsMap: {  
 hero: 'BlockHero',  
 },  
},  
...

Після завершення підготовки ми можемо створити новий компонент.




Якщо ми перейдемо до будь-якого з наших постів, ми повинні побачити вміст, як на зображенні нижче.

pic

Один пост

Наступні кроки

Далі ви можете:

  • Додати автентифікацію
  • Реалізувати функціонал пошуку
  • Додати пагінацію
  • Створити сторінки категорій і тегів
  • Додати функціонал коментарів
  • Налаштувати оптимізацію зображень
  • Налаштувати SEO та багато іншого

Висновок

Тепер у вас є сучасна платформа для ведення блогу з потужним бекендом на базі headless CMS і швидким, дружнім до SEO фронтендом на Nuxt. Це налаштування дає чудову основу для створення більш складних функцій і масштабування вашого блогу. Успіхів у програмуванні!

Перекладено з: Building a Modern Blog with Nuxt 3 and Payload CMS: A Complete Guide

Leave a Reply

Your email address will not be published. Required fields are marked *