Teknologian jakaminen

nunjucks päivittää mallin polun dynaamisesti

2024-07-12

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

Tiedoston dynaamisella lukemisella jokaisen pyynnön yhteydessä on tietty vaikutus suorituskykyyn, erityisesti erittäin samanaikaisissa tilanteissa. Tämän ongelman ratkaisemiseksi voit lukea mallin asetukset sovelluksen käynnistyessä ja päivittää asetukset, kun malli muuttuu niin, että tiedosto täytyy lukea vain, kun sovellus käynnistyy ja malli muuttuu sen sijaan, että tiedostoa luettaisiin joka kerta. pyyntö.

Voit käyttää yleistä muuttujaa tallentaaksesi nykyisen mallipolun välimuistiin ja päivittää muuttujan ja tiedoston vain, kun mallia muutetaan.

Tässä on parannettu esimerkkikoodi:

Esimerkki hakemistorakenteesta

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 Esimerkki sisällöstä

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

app.js Esimerkkikoodi

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

selittää

  1. globaaleja muuttujia currentTemplatePath: Tallenna nykyisen mallin polku välimuistiin.
  2. loadTemplateConfig toiminto: Lue mallin määritystiedosto sovelluksen käynnistyessä ja tallenna polku globaaliin muuttujaan.
  3. configureNunjucks toiminto: Määritä Nunjucks-ympäristö välimuistissa olevan mallin polun perusteella.
  4. Lataa konfiguraatio alustuksen aikana: Soitetaan, kun sovellus käynnistyy loadTemplateConfig jaconfigureNunjucks toiminto.
  5. Muuta mallipolkujen reititystä: Päivitä yleiset muuttujat, tiedostot ja määritä Nunjucks uudelleen, kun käyttäjä muuttaa mallin polkua.

Tällä tavalla tiedostot ja konfiguraatiot luetaan vain, kun sovellus käynnistyy ja käyttäjä muuttaa mallin polkua, jolloin vältetään suorituskykyongelmat, jotka liittyvät tiedoston lukemiseen jokaisella pyynnöstä.