Answer the question
In order to leave comments, you need to log in
Why does ReferenceError: _ is not defined appear?
Good afternoon, I get ReferenceError: _ is not defined, who knows what the problem is?
Set up according to this article .
/**
* Нормализация пути
*
* В файле путь до другого файла может иметь вид `sidebar` или `partials/header`
* поэтому каждый путь должен быть обработан.
*
* Эта функция добавляет к пути контекст или, проще говоря родительскую директорию.
*/
function normalizePath(filepath, context) {
if (context) {
return path.join(context, filepath).replace(/\\/g, '/');
}
return filepath;
}
/**
* Получение путей
*
* С помощью регулярного выражения, забираем из файла все пути из конструкций
* extends и include.
*/
function getPaths(source) {
const match = source.match(/^\s*(include|extends)\s(.*)/gm);
if (match) {
return match.map((match) => match.replace(/\s*(include|extends)./g, '') + '.pug');
}
return null;
}
/**
* Получение всех страниц из директории `app/templates`
*/
function getPages() {
return fs.readdirSync('app/templates').filter((filepath) => /pug$/.test(filepath));
}
/**
* Чтение файла
*/
function getPage(name) {
const filepath = path.join('app/templates', name);
try {
return fs.readFileSync(filepath).toString();
} catch (err) {
return false;
}
}
/**
* Вычисление древа зависимостей
*
* Функция рекурсивно проходит по всем зависимостям и заносит их в массив.
*/
function calculateTree(target, context, tree) {
const page = getPage(target);
if (!page) {
return tree;
}
let paths = getPaths(page);
if (!paths) {
return tree;
}
paths = paths.map((filepath) => normalizePath(filepath, path.dirname(target)));
paths.forEach((filepath) => {
tree = calculateTree(filepath, path.dirname(target), tree);
});
return tree.concat(paths);
}
/**
* Получение зависимостей для каждой из страниц
*/
function getPathsTree() {
const cacheTree = {};
getPages().forEach((page) => {
cacheTree[page] = calculateTree(page, null, [page]);
});
return cacheTree;
}
module.exports.getPathsTree = getPathsTree;
gulp.task('pug', function() {
// Получаем древо зависимостей для каждой страницы
const pathsTree = _.getPathsTree();
return gulp.src('app/templates/*.pug')
// Фильтруем файлы в потоке
.pipe($.filter((file) => {
// Если не запущен режим слежения за изменением файлов, то пропускаем в поток
// все страницы
if (!global.watch) {
return true;
}
// Если имя изменившегося файла есть в зависимостях страницы, то пропускаем
// страницу дальше в поток, попутно выводя сообщение в консоль для контроля
const changed = global.changedTplFile;
if (pathsTree[file.relative].includes(changed)) {
console.log($.chalk.green('>> ') + `Compiling: ${file.relative}`);
return true;
}
// Иначе отбрасываем страницу
return false;
}))
.pipe($.pug())
.pipe(gulp.dest('build'));
});
// Watch task
gulp.task('watch', () => {
// Shows that run "watch" mode
global.watch = true;
// Modules pug
$.watch(['app/templates/*.pug'], gulp.series('pug'))
// Обработчик изменения любого из файлов в директории `app/templates`, включая события
// удаления или создания файлов, а также директорий
.on('all', (event, path) => {
// Получаем имя файла и записываем его в глобальную переменную
global.changedTplFile = path.replace(/[\\\/]/g, '/').replace(/app\/templates\//, '');
});
Answer the question
In order to leave comments, you need to log in
There, as far as I remember, the author created his own broiler plate for a quick start - yellfy. Unwrap it on your machine and copy.
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question