nodejs / nodejs/node

module: CJS loader re-stats the same missing paths within one require tree

Ouverte
#64,681 1 commentaire 0 réactions 1 personne assignée Voir sur GitHub

@maxday y travaille déjà.

Depuis le 22/7/2026.

module
Langage dominant
JavaScript
Étoiles
122k
Forks
37.3k
Merge moyen
4 j 2 h
PR mergées (30 j)
283

Description

The CommonJS loader keeps a per-require-tree statCache (in lib/internal/modules/cjs/loader.js) to avoid re-stat-ing the same path while resolving a module tree. Today it only caches successful stats. Negative results (e.g. -ENOENT) fall through the cache and are re-probed every time the same missing path is looked up again within the same top-level require.

// lib/internal/modules/cjs/loader.js — stat()
const result = internalFsBinding.internalModuleStat(filename);
if (statCache !== null && result >= 0) {
  // Only set cache when `internalModuleStat(filename)` succeeds.
  statCache.set(filename, result);
}

Failed probes are extremely common during resolution, and the same misses recur across sibling and descendant modules:

  • tryExtensions resolves an extensionless specifier (e.g. require('./helper')) by stat-ing each candidate in order: ./helper.js, then ./helper.json, then ./helper.node until one exists. Every extension tried before the real one is a miss.
  • Bare specifiers (require('foo')) walk the node_modules chain upward: …/a/b/node_modules, …/a/node_modules, …/node_modules. Most of those parent directories don't exist, so each is a negative stat, and every bare require in the tree re-walks the same non-existent ancestors.

Because negatives aren't cached, these misses are re-stat-ed repeatedly within a single resolution pass.

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.