Измерение производительности

Библиотека Marked — это современный парсер Markdown в JavaScript, который позволяет конвертировать Markdown-текст в HTML с высокой скоростью и гибкостью. Она предоставляет не только базовую функцию преобразования, но и расширенные возможности для контроля над обработкой содержимого, включая кастомизацию рендеринга, управление токенами и оптимизацию производительности.

Инициализация и базовое использование

Для начала работы достаточно подключить библиотеку и вызвать функцию marked():

import { marked } from 'marked';

const markdownText = `
# Заголовок первого уровня
- Элемент списка
`;

const html = marked(markdownText);
console.log(html);

Результат — полностью преобразованный HTML-код. Важно отметить, что Marked работает синхронно, что делает её особенно подходящей для серверных и клиентских приложений с высокой нагрузкой.

Настройка рендерера

Marked предоставляет возможность создавать собственные рендереры, которые позволяют изменять стандартное преобразование Markdown:

const renderer = new marked.Renderer();

renderer.heading = (text, level) => {
  return `<h${level} class="custom-heading">${text}</h${level}>`;
};

const htmlCustom = marked(markdownText, { renderer });

Использование кастомного рендерера даёт контроль над разметкой, что особенно важно при генерации больших документов или страниц с динамическим контентом.

Работа с токенами

Marked может работать на уровне лексического анализа, превращая Markdown в токены с помощью функции marked.lexer():

const tokens = marked.lexer(markdownText);
console.log(tokens);

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

Измерение производительности

При работе с большими Markdown-документами критически важно понимать производительность конверсии. Marked предоставляет быстрый рендер, но для точной оценки необходимо использовать метрики времени выполнения:

console.time('Marked render');
const htmlPerformance = marked(largeMarkdownText);
console.timeEnd('Marked render');

Это позволяет измерить реальное время преобразования и выявить узкие места в обработке.

Кэширование токенов

Для больших документов имеет смысл кэшировать результат лексического анализа, чтобы избежать повторного разбора одного и того же Markdown:

const tokensCache = marked.lexer(largeMarkdownText);
const htmlCached = marked.parser(tokensCache);

Такой подход снижает нагрузку при многократном рендеринге одного и того же содержимого.

Настройки оптимизации

Marked позволяет отключать некоторые функции для ускорения работы:

  • gfm: false — отключение GitHub Flavored Markdown для ускоренного парсинга.
  • breaks: false — игнорирование переноса строк.
  • smartLists: false — упрощённая обработка списков.

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

Асинхронная обработка

С версии 5 Marked поддерживает асинхронные лексеры и рендереры для обработки динамических элементов, например, встроенных загрузок внешнего контента:

const rendererAsync = {
  async code(code, infostring, escaped) {
    const processed = await asyncHighlight(code);
    return `<pre><code>${processed}</code></pre>`;
  }
};

marked.use({ renderer: rendererAsync });

const htmlAsync = await marked.parse(largeMarkdownText);

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

Профилирование производительности

Для глубокого анализа производительности можно использовать комбинацию кэширования, асинхронной обработки и профилирования времени выполнения отдельных этапов:

console.time('Lexing');
const tokens = marked.lexer(largeMarkdownText);
console.timeEnd('Lexing');

console.time('Parsing');
const html = marked.parser(tokens);
console.timeEnd('Parsing');

Разделение лексинга и парсинга позволяет выявить, какая стадия является узким местом, и оптимизировать её отдельно.

Заключение по практическим приёмам

  • Использование кастомного рендерера повышает гибкость и может улучшить производительность за счёт оптимизированного HTML.
  • Кэширование токенов и асинхронный рендеринг позволяют обрабатывать большие документы без значительных задержек.
  • Измерение времени выполнения отдельных этапов помогает точно определить узкие места и корректно распределить ресурсы.

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