Кеширование результатов в Markdown-it является важным инструментом для повышения производительности при многократной обработке одного и того же текста. Основная идея заключается в том, чтобы не парсить и не рендерить текст заново каждый раз, а хранить промежуточные или окончательные результаты обработки.
Markdown-it строит документ в несколько этапов: лексинг → парсинг → генерация токенов → рендеринг HTML. Кеширование может применяться на любом из этих этапов.
Токены — это основная структура, которую создает Markdown-it после
парсинга исходного текста. Каждый блок и инлайн-элемент превращается в
токен с определенными свойствами (type, tag,
content, children, attrs).
Для кеширования токенов можно использовать простой объект или
Map:
const md = require('markdown-it')();
const cache = new Map();
function renderWithCache(src) {
if (cache.has(src)) {
return cache.get(src);
}
const tokens = md.parse(src, {});
cache.set(src, tokens);
return tokens;
}
Преимущества такого подхода:
Недостатки:
Если текст не изменяется, имеет смысл кешировать сразу сгенерированный HTML:
const htmlCache = new Map();
function renderHTML(src) {
if (htmlCache.has(src)) {
return htmlCache.get(src);
}
const html = md.render(src);
htmlCache.set(src, html);
return html;
}
Такой способ полностью исключает парсинг и рендеринг при повторном вызове, что особенно эффективно при статическом контенте на сайтах с высокой нагрузкой.
Особенности:
Markdown-it поддерживает плагины, которые могут изменять токены или поведение рендеринга. При работе с плагинами важно кешировать результаты после всех трансформаций.
Пример кеширования с плагином для подсветки кода:
const hljs = require('highlight.js');
const md = require('markdown-it')({
highlight: (str, lang) => {
if (lang && hljs.getLanguage(lang)) {
return hljs.highlight(str, { language: lang }).value;
}
return str;
}
});
const htmlCache = new Map();
function renderWithHighlight(src) {
if (htmlCache.has(src)) return htmlCache.get(src);
const html = md.render(src);
htmlCache.set(src, html);
return html;
}
Кеширование после применения плагинов позволяет не пересчитывать сложные трансформации и сохраняет производительность при многократных вызовах.
Пример использования LRU-кеша с библиотекой
lru-cache:
const LRU = require('lru-cache');
const md = require('markdown-it')();
const cache = new LRU({ max: 500, ttl: 1000 * 60 * 10 });
function renderWithLRU(src) {
if (cache.has(src)) return cache.get(src);
const html = md.render(src);
cache.set(src, html);
return html;
}
WeakMap) для
токенов, если необходимо освобождать память автоматически при
удалении исходного текста.Кеширование в Markdown-it позволяет существенно ускорить обработку документов, особенно на сайтах с большим количеством статического контента. Выбор уровня кеширования — токены или HTML — зависит от сценариев использования и требований к памяти и производительности. Правильная стратегия управления кешем обеспечивает баланс между скоростью и ресурсами, делая работу с Markdown эффективной и масштабируемой.