Compartir tecnología

nunjucks actualiza dinámicamente la ruta de la plantilla

2024-07-12

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

La lectura dinámica del archivo con cada solicitud tiene un cierto impacto en el rendimiento, especialmente en situaciones de alta concurrencia. Para resolver este problema, puede leer la configuración de la plantilla cuando se inicia la aplicación y actualizar la configuración cuando la plantilla cambia, de modo que el archivo solo deba leerse cuando se inicia la aplicación y la plantilla cambia, en lugar de leer el archivo cada vez. pedido.

Puede utilizar una variable global para almacenar en caché la ruta de la plantilla actual y solo actualizar la variable y el archivo cuando se cambia la plantilla.

Aquí está el código de muestra mejorado:

Ejemplo de estructura de directorio

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 Contenido de muestra

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

app.js Código de muestra

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

explicar

  1. variables globales currentTemplatePath: almacena en caché la ruta de la plantilla actual.
  2. loadTemplateConfig función: Lea el archivo de configuración de la plantilla cuando se inicie la aplicación y guarde la ruta a una variable global.
  3. configureNunjucks función: Configure el entorno Nunjucks según la ruta de la plantilla almacenada en caché.
  4. Cargar configuración durante la inicialización: Se llama cuando se inicia la aplicación. loadTemplateConfig yconfigureNunjucks función.
  5. Cambiar enrutamiento para rutas de plantilla: Actualiza variables globales, archivos y reconfigura Nunjucks cuando el usuario cambia la ruta de la plantilla.

De esta manera, el archivo y la configuración Nunjucks solo se leen cuando se inicia la aplicación y el usuario cambia la ruta de la plantilla, evitando el problema de rendimiento de leer el archivo en cada solicitud.