Я не мог найти библиотеку или ресурс, чтобы достичь того, чего хотел. Но с некоторыми из моего грязного кода, хаков и пакетов я смог экспортировать все маршруты.
Примечание: Вместо написания команды узла для экспорта htmls, я добавил маршрут для запуска операций - это код для маршрута:
app.use('/export_templates', router.get('/', async function (req, res, next) {
const endpoints = listEndpoints(app);
const failedEndpoints = [];
for (const i in endpoints) {
const endpoint = endpoints[i];
if (endpoint.path == '/export_templates') {
continue;
}
try {
const res = await axios.get('http://'+req.headers.host+''+endpoint.path+'?export=true');
}
catch(error) {
failedEndpoints.push(endpoint.path);
}
}
res.json({
"status": "succes",
"message": "Please check templates folder for the latest exported html templates",
"failed": failedEndpoints
})
}));
В основном этот маршрут повторяется и делает запрос на все доступные маршруты с параметром export=true
.
Тогда внутри каждой функции просмотра маршрута условие проверяет, доступен ли параметр экспорта, затем вызывает функцию exportTemplateFile
с расположением шаблона pug
и новым именем файла в качестве параметра функции. Если запрос не содержит параметра export
, то запрашиваемый маршрут просто выведет какой шаблон.
Пример маршрута:
router.get('/', function(req, res, next) {
if (req.query.export) {
exportTemplateFile('views/index.pug', 'index.html');
}
res.render('index.pug');
});
А вот код для завершения функции 2 util процесс экспорта
function createTemplateFile(filename) {
fs.open(filename,'r',function(err, fd){
if (err) {
fs.writeFile(filename, '', function(err) {
if(err) {
console.log(err);
}
});
}
});
}
function exportTemplateFile(templateLocation, templateName) {
const html = pretty(pug.renderFile(templateLocation));
createTemplateFile('templates/'+templateName);
var stream = fs.createWriteStream('templates/'+templateName);
stream.once('open', function (fd) {
stream.write(html);
stream.end();
});
}
Функция createTemplateFile
просто создает новый файл, если он не существует.
Функция exportTemplateFile
сохраняет HTML в html
переменная отображается в pug
и претифицирует ее с помощью пакета pretty
, а затем перезаписывает новый файл шаблона.
Примечание: В моем случае все шаблоны pug
были устаревшими c поэтому мне не пришлось передавать какой-либо контекст в функцию pug.renderFile
. Но если вам нужен какой-либо контекст, который будет использоваться внутри шаблона pug, вы можете просто передать его вместе с расположением шаблона.