November 15, 2023

Компиляция шаблона

Теперь, когда файл EJS изменяется, скрипт автоматически обнаруживает изменения и перекомпилирует EJS-шаблон, сохраняя результат в HTML-файл.

const chokidar = require('chokidar');
const ejs = require('ejs');
const fs = require('fs');

// Путь к вашему EJS-файлу
const ejsFilePath = 'path/to/your/file.ejs';

// Путь к выходному HTML-файлу
const htmlFilePath = 'path/to/your/output/file.html';

// Функция для компиляции EJS-шаблона
const compileEjs = () => {
  const ejsTemplate = fs.readFileSync(ejsFilePath, 'utf8');
  const compiledTemplate = ejs.compile(ejsTemplate);
  const htmlContent = compiledTemplate(/* Ваши данные для передачи в шаблон */);

  fs.writeFileSync(htmlFilePath, htmlContent, 'utf8');
  console.log('EJS template compiled and saved to HTML file.');
};

// Наблюдение за изменениями в EJS-файле и перекомпиляция при необходимости
const watcher = chokidar.watch(ejsFilePath);
watcher.on('change', (path) => {
  console.log(`File ${path} changed. Recompiling...`);
  compileEjs();
});

// Запуск компиляции при запуске скрипта
compileEjs();

aitianhu.com

А если шаблонов много?

Скрипт будет отслеживать изменения во всех указанных вами EJS-файлах и автоматически перекомпилировать их при необходимости.

const chokidar = require('chokidar');
const ejs = require('ejs');
const fs = require('fs');

// Массив путей к вашим EJS-файлам
const ejsFilePaths = [
  'path/to/your/file1.ejs',
  'path/to/your/file2.ejs',
  // Добавьте пути к другим файлам по мере необходимости
];

// Функция для компиляции EJS-шаблона
const compileEjs = (ejsFilePath) => {
  const ejsTemplate = fs.readFileSync(ejsFilePath, 'utf8');
  const compiledTemplate = ejs.compile(ejsTemplate);
  const htmlFilePath = ejsFilePath.replace('.ejs', '.html'); // Генерация соответствующего HTML-пути
  const htmlContent = compiledTemplate(/* Ваши данные для передачи в шаблон */);

  fs.writeFileSync(htmlFilePath, htmlContent, 'utf8');
  console.log(`EJS template compiled and saved to HTML file: ${htmlFilePath}`);
};

// Наблюдение за изменениями во всех EJS-файлах и перекомпиляция при необходимости
const watcher = chokidar.watch(ejsFilePaths);
watcher.on('change', (path) => {
  console.log(`File ${path} changed. Recompiling...`);
  compileEjs(path);
});

// Запуск компиляции для всех файлов при запуске скрипта
ejsFilePaths.forEach((path) => compileEjs(path));

А если шаблонов гораздо больше ;)

const chokidar = require('chokidar');
const ejs = require('ejs');
const fs = require('fs');
const sqlite3 = require('sqlite3');

// Подключение к базе данных SQLite
const db = new sqlite3.Database('path/to/your/database.db');

// Функция для выполнения запроса к базе данных и извлечения имен шаблонов
const getTemplateNames = () => {
  return new Promise((resolve, reject) => {
    const query = 'SELECT page_name FROM pages'; // Предполагается, что ваша таблица называется "pages"
    db.all(query, (err, rows) => {
      if (err) {
        reject(err);
      } else {
        const templateNames = rows.map(row => row.page_name);
        resolve(templateNames);
      }
    });
  });
};

// Функция для компиляции EJS-шаблона
const compileEjs = async (templateName) => {
  const ejsFilePath = `path/to/your/${templateName}.ejs`;
  const ejsTemplate = fs.readFileSync(ejsFilePath, 'utf8');
  const compiledTemplate = ejs.compile(ejsTemplate);
  const htmlFilePath = `path/to/your/output/${templateName}.html`;
  const htmlContent = compiledTemplate(/* Ваши данные для передачи в шаблон */);

  fs.writeFileSync(htmlFilePath, htmlContent, 'utf8');
  console.log(`EJS template compiled and saved to HTML file: ${htmlFilePath}`);
};

// Запуск компиляции для всех шаблонов из базы данных при запуске скрипта
getTemplateNames()
  .then(templateNames => {
    templateNames.forEach(templateName => compileEjs(templateName));
  })
  .catch(err => console.error('Error fetching template names from the database:', err));

// Наблюдение за изменениями во всех EJS-файлах и перекомпиляция при необходимости
const watcher = chokidar.watch('path/to/your/*.ejs'); // Наблюдение за изменениями во всех EJS-файлах
watcher.on('change', (path) => {
  const templateName = path.replace(/^.*[\\\/]/, '').slice(0, -4); // Извлечение имени шаблона из пути
  console.log(`File ${path} changed. Recompiling...`);
  compileEjs(templateName);
});

// Закрытие соединения с базой данных при завершении работы
process.on('exit', () => db.close());

В этом скрипте используется асинхронная функция getTemplateNames, чтобы извлечь имена шаблонов из базы данных. Затем скрипт компилирует каждый EJS-шаблон и отслеживает изменения в соответствующих файлах. Помните также о необходимости изменить пути к файлам в соответствии с вашей структурой каталогов и базой данных.