Watch режим является одной из ключевых функций при работе с библиотеками для обработки Markdown и HTML в экосистеме JavaScript, такими как Remark и Rehype. Он позволяет автоматически отслеживать изменения в исходных файлах и пересобирать или повторно обрабатывать контент без необходимости ручного запуска скриптов. Это критично для ускорения разработки и поддержания актуальности данных при быстром прототипировании и интеграции.
Для начала необходимо установить базовые пакеты:
npm install remark remark-cli rehype rehype-cli chokidar
remark-cli и rehype-cli предоставляют
командную оболочку для обработки файлов, а chokidar — это
современный и производительный файловый наблюдатель.
Remark и Rehype поддерживают флаг --watch, который
отслеживает изменения файлов:
remark src/**/*.md --output dist/ --watch
rehype src/**/*.html --output dist/ --watch
В этом случае:
src/**/*.md — исходные Markdown-файлы.dist/ — каталог для результатов обработки.--watch — активирует режим наблюдения за
изменениями.При сохранении файлов в src/ автоматический процесс
пересборки применяет все подключённые плагины Remark/Rehype.
Для более сложных сценариев используют Node.js API вместе с
библиотекой chokidar для наблюдения за файлами:
const chokidar = require('chokidar');
const { remark } = require('remark');
const fs = require('fs');
const watcher = chokidar.watch('src/**/*.md', { ignoreInitial: true });
watcher.on('add', processFile)
.on('change', processFile)
.on('unlink', path => console.log(`${path} удалён`));
function processFile(path) {
fs.readFile(path, 'utf8', (err, data) => {
if (err) throw err;
remark()
.use(require('remark-html'))
.process(data)
.then(file => {
const outPath = path.replace('src', 'dist').replace(/\.md$/, '.html');
fs.mkdirSync(require('path').dirname(outPath), { recursive: true });
fs.writeFileSync(outPath, String(file));
console.log(`Сборка завершена: ${outPath}`);
});
});
}
Ключевые моменты:
ignoreInitial: true предотвращает обработку всех файлов
при старте, позволяя реагировать только на изменения.fs.mkdirSync гарантирует корректный вывод.Rehype можно использовать для Watch режима аналогично Remark, особенно при преобразовании HTML или интеграции с MDX:
const rehype = require('rehype');
const rehypeParse = require('rehype-parse');
const rehypeStringify = require('rehype-stringify');
function processHtml(path) {
fs.readFile(path, 'utf8', (err, data) => {
if (err) throw err;
rehype()
.use(rehypeParse, { fragment: true })
.use(rehypeStringify)
.process(data)
.then(file => {
const outPath = path.replace('src', 'dist');
fs.mkdirSync(require('path').dirname(outPath), { recursive: true });
fs.writeFileSync(outPath, String(file));
console.log(`HTML пересобран: ${outPath}`);
});
});
}
Watch режим позволяет комбинировать Remark и Rehype, например, при конвертации Markdown в HTML с последующей обработкой DOM-структуры через Rehype.
Watch режим особенно полезен в связке с плагинами:
Подключение плагинов в watch-процессе выглядит так:
remark()
.use(require('remark-frontmatter'))
.use(require('remark-toc'))
.processSync(data);
Эти плагины автоматически применяются при каждом изменении исходного файла, избавляя от ручной обработки.
Watch режим легко включить в инструменты сборки:
watch или
hot module replacement.gulp.watch или
grunt-contrib-watch.Пример с Gulp:
const gulp = require('gulp');
const remark = require('gulp-remark');
gulp.task('markdown', () => {
return gulp.src('src/**/*.md')
.pipe(remark().use(require('remark-html')))
.pipe(gulp.dest('dist'));
});
gulp.task('watch', () => {
gulp.watch('src/**/*.md', gulp.series('markdown'));
});
В этом случае все изменения в Markdown автоматически обрабатываются и
сохраняются в dist/.
lodash.debounce для минимизации
количества пересборок.Watch режим превращает процесс разработки в потоковую систему обработки контента, позволяя поддерживать актуальность данных без дополнительных действий, что критично для больших проектов на Remark и Rehype.