Розробка кастомного плагіна 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 дні.