Разработка кастомного плагина Docusaurus

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.
Разработка и обслуживание любых видов сайтов:
Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

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

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Разработка кастомного плагина Docusaurus
Средняя
~2-3 рабочих дня
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    874
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    851

Разработка кастомного плагина Docusaurus

Плагины Docusaurus — это функции, расширяющие жизненный цикл сборки, добавляющие новые страницы, модифицирующие webpack-конфиг или вставляющие данные из внешних источников.

Структура плагина

// plugins/my-plugin/index.ts
import type { LoadContext, Plugin } from '@docusaurus/types';

interface PluginOptions {
  apiUrl: string;
  cacheTime?: number;
}

export default function myPlugin(
  context: LoadContext,
  options: PluginOptions
): Plugin<{ apiData: any[] }> {
  return {
    name: 'my-docusaurus-plugin',

    // Загрузка данных из внешнего источника
    async loadContent() {
      const res = await fetch(options.apiUrl);
      return { apiData: await res.json() };
    },

    // Создание страниц на основе данных
    async contentLoaded({ content, actions }) {
      const { createData, addRoute } = actions;

      for (const item of content.apiData) {
        const dataPath = await createData(
          `api-item-${item.id}.json`,
          JSON.stringify(item)
        );

        addRoute({
          path: `/api-reference/${item.slug}`,
          component: '@site/src/components/ApiItemPage',
          modules: { apiData: dataPath },
          exact: true,
        });
      }

      // Страница-индекс
      const allDataPath = await createData('all-api-items.json', JSON.stringify(content.apiData));
      addRoute({
        path: '/api-reference',
        component: '@site/src/components/ApiIndexPage',
        modules: { allItems: allDataPath },
        exact: true,
      });
    },

    // Модификация webpack-конфига
    configureWebpack(config, isServer) {
      return {
        module: {
          rules: [
            {
              test: /\.ya?ml$/,
              use: 'yaml-loader',
            },
          ],
        },
      };
    },

    // Инъекция HTML в <head> всех страниц
    injectHtmlTags() {
      return {
        headTags: [
          {
            tagName: 'script',
            attributes: {
              defer: true,
              src: 'https://analytics.mysite.com/script.js',
              'data-site': 'MYSITE_ID',
            },
          },
        ],
      };
    },
  };
}

// Валидация опций
export function validateOptions({ validate, options }) {
  const ValidatedOptions = validate({
    apiUrl: Joi.string().uri().required(),
    cacheTime: Joi.number().default(3600),
  }, options);
  return ValidatedOptions;
}

Регистрация плагина

// docusaurus.config.ts
plugins: [
  [
    './plugins/my-plugin',
    {
      apiUrl: 'https://api.myproject.com/endpoints',
      cacheTime: 7200,
    },
  ],
  // Локальный плагин без опций
  './plugins/generate-sitemap-extras',
],

Плагин для загрузки Changelog из GitHub

// plugins/github-changelog/index.ts
import { Octokit } from '@octokit/rest';

export default function githubChangelogPlugin(context, options) {
  return {
    name: 'github-changelog-plugin',

    async loadContent() {
      const octokit = new Octokit({ auth: options.token });
      const { data: releases } = await octokit.repos.listReleases({
        owner: options.owner,
        repo:  options.repo,
        per_page: 50,
      });
      return { releases };
    },

    async contentLoaded({ content, actions }) {
      const { createData, addRoute } = actions;
      const dataPath = await createData(
        'releases.json',
        JSON.stringify(content.releases)
      );
      addRoute({
        path: '/changelog',
        component: '@site/src/pages/Changelog',
        modules: { releases: dataPath },
        exact: true,
      });
    },
  };
}

Remark/Rehype плагины для MDX

// plugins/remark-custom-directives.ts
import type { Plugin } from 'unified';
import { visit } from 'unist-util-visit';

const remarkCustomDirectives: Plugin = () => (tree) => {
  visit(tree, 'containerDirective', (node) => {
    if (node.name === 'api-endpoint') {
      // Трансформируем кастомную директиву в JSX
      node.data = {
        hName: 'div',
        hProperties: { className: ['api-endpoint', `method-${node.attributes?.method}`] },
      };
    }
  });
};

export default remarkCustomDirectives;
// docusaurus.config.ts
presets: [['classic', {
  docs: {
    remarkPlugins: [
      require('./plugins/remark-custom-directives'),
      require('remark-math'),
    ],
    rehypePlugins: [require('rehype-katex')],
  },
}]],

Разработка плагина для загрузки внешних данных и создания страниц — 2–4 дня.