Библиотека 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');
Разделение лексинга и парсинга позволяет выявить, какая стадия является узким местом, и оптимизировать её отдельно.
Эти подходы делают Marked мощным инструментом для работы с Markdown в приложениях, где скорость и масштабируемость имеют критическое значение.