Das Symptom
Du willst nur eine kleine Hilfsfunktion aus einem Paket holen, importierst sie
so, wie sie im node_modules-Ordner liegt – und Node bricht ab mit
ERR_PACKAGE_PATH_NOT_EXPORTED. Der Text nennt den Paketnamen und den Unterpfad
und behauptet, dieser Pfad sei nicht exportiert. Die Datei ist aber da. Du siehst
sie. Du kannst sie mit cat ausgeben.
Besonders verwirrend: Dasselbe import lief im letzten Projekt noch. Nur eben
mit einer älteren Version desselben Pakets.
Die „Layer 8“-Wahrheit
Die Datei existiert, ja. Sie ist nur nicht für dich gedacht. Node liest im
package.json des Pakets das Feld exports, und dieses Feld ist kein Vorschlag,
sondern eine Tür mit Schloss: Es „provides a modern alternative to main
allowing multiple entry points to be defined“ – und, entscheidend, es verhindert
„any other entry points besides those defined in exports“. Die Doku wird an
anderer Stelle noch deutlicher: Sobald exports gesetzt ist, sind alle
Unterpfade des Pakets gekapselt und für Importeure schlicht nicht mehr vorhanden.
Was hier passiert, ist also kein Fehler, sondern das Gegenteil davon. Jahrelang
war jede Datei in node_modules de facto öffentliche Schnittstelle, weil das
Dateisystem keine Meinung dazu hatte. Jeder tiefe Import in ein fremdes Paket war
eine stille Wette darauf, dass der Autor diese interne Datei nie umbenennt.
exports beendet diese Wette – und zwar zugunsten des Autors, der jetzt zum
ersten Mal sagen darf, was Zusage ist und was Innenleben.
Der Reflex, jetzt nach einem Schalter zum Abschalten zu suchen, geht am Punkt
vorbei. Der Unterpfad ist nicht versehentlich zu, sondern absichtlich. Wenn du
ihn brauchst, brauchst du entweder einen anderen, deklarierten Einstiegspunkt –
oder ein Gespräch mit dem Paketautor. Nicht einen Umweg, der beim nächsten
npm update genauso still zerbricht, wie er entstanden ist.