Skip to content

Blocking synchronous filesystem operations during template compilation #330

@Abderrahmane-MERSTANI

Description

@Abderrahmane-MERSTANI

Description
Le module d’auto-compilation de templates doT utilise exclusivement des opérations synchrones du module fs (readFileSync, readdirSync, writeFileSync).
Dans un environnement Node.js moderne, cela peut entraîner des blocages du thread principal, surtout lorsque le nombre de templates est élevé.

Problème identifié
Plusieurs appels synchrones sont utilisés dans le flux principal :

fs.readdirSync(defFolder)
fs.readFileSync(path)
fs.writeFileSync(path, ...)

Ces appels :

Bloquent l’event loop Node.js

Dégradent les performances dans les applications serveur

Rendent le module peu adapté à une utilisation en production ou dans des environnements à forte charge

Étapes pour reproduire

Créer un dossier contenant un grand nombre de fichiers .dot, .def, .jst

Appeler doT.process({ path: "./views" })

Observer un gel temporaire du processus Node.js pendant la compilation

Comportement attendu

La compilation devrait pouvoir s’exécuter sans bloquer l’event loop

Le module devrait proposer une alternative asynchrone

Comportement actuel

Toute la compilation repose sur des appels bloquants

Impossible d’intégrer proprement ce module dans un serveur HTTP actif

Impact

❗ Dégradation des performances

❗ Mauvaise scalabilité

❗ Risque de timeouts sur serveurs web

❗ Incompatible avec des architectures non bloquantes

Suggestion de correction

Ajouter une API asynchrone (processAsync par exemple) utilisant :

fs.promises.readdir

fs.promises.readFile

fs.promises.writeFile

Conserver l’API synchrone pour les scripts CLI ou les builds

Documenter clairement les cas d’usage recommandés

Contexte

Module : doT template auto-compiler

Type : Performance / Architecture

Environnement : Node.js

Gravité : Moyenne à élevée selon le volume de fichiers

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions