Preact является лёгкой альтернативой React, что делает его удобным для интеграции с различными CMS-системами, такими как WordPress, Strapi, Sanity или Contentful. Основная цель интеграции — возможность динамически получать контент из CMS и рендерить его на клиентской стороне с использованием компонентов Preact.
Для взаимодействия с CMS чаще всего используется REST API или GraphQL. В Preact рекомендуется использовать хуки и асинхронные функции для получения данных. Пример работы с REST API:
import { h } from 'preact';
import { useState, useEffect } from 'preact/hooks';
function CMSContent({ endpoint }) {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
async function fetchData() {
try {
const response = await fetch(endpoint);
const result = await response.json();
setData(result);
} catch (error) {
console.error("Ошибка при загрузке данных:", error);
} finally {
setLoading(false);
}
}
fetchData();
}, [endpoint]);
if (loading) return <p>Загрузка...</p>;
if (!data) return <p>Нет данных для отображения</p>;
return (
<div>
{data.items.map(item => (
<article key={item.id}>
<h2>{item.title}</h2>
<p>{item.content}</p>
</article>
))}
</div>
);
}
Ключевые моменты:
useEffect обеспечивает загрузку данных после
монтирования компонента.useEffect позволяет
корректно обрабатывать ошибки и состояние загрузки.loading,
data) предотвращает ошибки при отсутствии данных.GraphQL упрощает выборку только нужных полей из CMS. Использование
GraphQL в Preact аналогично React, с помощью fetch или
библиотек вроде urql или Apollo Client.
import { h } from 'preact';
import { useState, useEffect } from 'preact/hooks';
const query = `
query {
posts {
id
title
content
}
}
`;
function GraphQLContent({ endpoint }) {
const [posts, setPosts] = useState([]);
useEffect(() => {
async function fetchGraphQL() {
const response = await fetch(endpoint, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ query })
});
const { data } = await response.json();
setPosts(data.posts);
}
fetchGraphQL();
}, [endpoint]);
return (
<div>
{posts.map(post => (
<article key={post.id}>
<h2>{post.title}</h2>
<p>{post.content}</p>
</article>
))}
</div>
);
}
Особенности:
Для интеграции с WordPress используется REST API
/wp-json/wp/v2/posts. Поскольку Preact отличается
лёгкостью, компонент, отображающий посты, будет минимальным и
производительным.
function WordPressPosts() {
const [posts, setPosts] = useState([]);
useEffect(() => {
async function loadPosts() {
const res = await fetch('https://example.com/wp-json/wp/v2/posts');
const data = await res.json();
setPosts(data);
}
loadPosts();
}, []);
return (
<ul>
{posts.map(post => (
<li key={post.id}>
<h3 dangerouslySetInnerHTML={{ __html: post.title.rendered }} />
<div dangerouslySetInnerHTML={{ __html: post.excerpt.rendered }} />
</li>
))}
</ul>
);
}
Замечания:
dangerouslySetInnerHTML необходимо для
корректного отображения HTML-контента из WordPress.Для CMS с поддержкой статических сайтов (например, Strapi или Contentful) Preact может использоваться совместно с Vite или Astro. Контент забирается на этапе сборки и рендерится как статические компоненты, что снижает нагрузку на клиент.
// Пример использования Astro + Preact
---
import CMSContent from '../components/CMSContent.jsx';
const posts = await fetch('https://cms.example.com/posts').then(res => res.json());
---
<CMSContent posts={posts} />
Преимущества:
Интеграция с CMS требует оптимизации загрузки данных:
SWR или аналогичные хуки для
кеширования.При динамическом контенте состояние может быть централизованным через
preact/signals или unistore. Это упрощает
синхронизацию данных с компонентами.
import { signal } from '@preact/signals';
export const postsSignal = signal([]);
export async function fetchPosts(endpoint) {
const res = await fetch(endpoint);
const data = await res.json();
postsSignal.value = data;
}
Компоненты могут подписываться на postsSignal и
автоматически обновляться при изменении данных.
При работе с CMS важно учитывать:
dangerouslySetInnerHTML.Интеграция Preact с CMS строится на:
Такой подход обеспечивает производительный и масштабируемый фронтенд с динамическим контентом, минимальными задержками и лёгкой поддержкой новых источников данных.