Technologieaustausch

Nunjucks aktualisiert den Vorlagenpfad dynamisch

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Das dynamische Lesen der Datei bei jeder Anfrage hat gewisse Auswirkungen auf die Leistung, insbesondere in Situationen mit hoher Parallelität. Um dieses Problem zu lösen, können Sie die Vorlagenkonfiguration lesen, wenn die Anwendung gestartet wird, und die Konfiguration aktualisieren, wenn sich die Vorlage ändert, sodass die Datei nur dann gelesen werden muss, wenn die Anwendung gestartet wird und sich die Vorlage ändert, anstatt die Datei jedes Mal zu lesen Anfrage.

Sie können eine globale Variable verwenden, um den aktuellen Vorlagenpfad zwischenzuspeichern und die Variable und die Datei nur zu aktualisieren, wenn die Vorlage geändert wird.

Hier ist der verbesserte Beispielcode:

Beispiel für eine Verzeichnisstruktur

project
│
├── views/
│   ├── template1/
│   │   └── index.njk
│   ├── template2/
│   │   └── index.njk
│
├── config/
│   └── templateConfig.json
│
├── app.js
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

templateConfig.json Beispielinhalt

{
    "currentTemplate": "template1"
}
  • 1
  • 2
  • 3

app.js Beispielcode

const express = require('express');
const nunjucks = require('nunjucks');
const path = require('path');
const fs = require('fs');

const app = express();

// 设置静态文件目录
app.use(express.static(path.join(__dirname, 'public')));

// 全局变量,缓存当前模板路径
let currentTemplatePath;

// 读取配置文件中的当前模板路径
function loadTemplateConfig() {
    const config = JSON.parse(fs.readFileSync(path.join(__dirname, 'config/templateConfig.json'), 'utf8'));
    currentTemplatePath = config.currentTemplate;
}

// 配置Nunjucks环境
function configureNunjucks() {
    nunjucks.configure(path.join(__dirname, `views/${currentTemplatePath}`), {
        autoescape: false,
        noCache: true,
        express: app
    });
}

// 初始化时加载配置
loadTemplateConfig();
configureNunjucks();

// 路由
app.get('/', (req, res) => {
    res.render('index.njk', { title: 'Hello Nunjucks!' });
});

// 路由:更改模板路径
app.get('/change-template', (req, res) => {
    const newTemplate = req.query.template;
    if (newTemplate) {
        currentTemplatePath = newTemplate;
        const config = { currentTemplate: newTemplate };
        fs.writeFileSync(path.join(__dirname, 'config/templateConfig.json'), JSON.stringify(config), 'utf8');
        configureNunjucks(); // 更新Nunjucks配置
        res.send(`Template changed to ${newTemplate}`);
    } else {
        res.send('No template specified');
    }
});

// 启动服务器
const port = 3000;
app.listen(port, () => {
    console.log(`服务器已启动,访问地址:http://localhost:${port}`);
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

erklären

  1. globale Variablen currentTemplatePath: Den aktuellen Vorlagenpfad zwischenspeichern.
  2. loadTemplateConfig Funktion: Lesen Sie die Vorlagenkonfigurationsdatei beim Start der Anwendung und speichern Sie den Pfad in einer globalen Variablen.
  3. configureNunjucks Funktion: Konfigurieren Sie die Nunjucks-Umgebung basierend auf dem zwischengespeicherten Vorlagenpfad.
  4. Konfiguration während der Initialisierung laden: Wird beim Start der Anwendung aufgerufen loadTemplateConfig UndconfigureNunjucks Funktion.
  5. Routing für Vorlagenpfade ändern: Globale Variablen und Dateien aktualisieren und Nunjucks neu konfigurieren, wenn der Benutzer den Vorlagenpfad ändert.

Auf diese Weise werden die Datei- und Konfigurations-Nunjucks nur gelesen, wenn die Anwendung gestartet wird und der Benutzer den Vorlagenpfad ändert, wodurch das Leistungsproblem vermieden wird, das beim Lesen der Datei bei jeder Anfrage entsteht.