node.js - package.json beachtet die Exports-Eigenschaft für esm- und cjs-npm-Paket nicht
Ich habe Schwierigkeiten, meine npm-Bibliothek dazu zu bringen, Subpath-Imports/Requires über das exports-Feld in der package.json zu unterstützen. Zum Kontext: Die package.json unterstützt ein Feld "exports", das es ermöglicht, Dateien bedingt basierend auf der Laufzeit (d.h. CommonJS ODER ECMAScript) bereitzustellen.
Beim Importieren der npm-Bibliothek in mein TypeScript-Projekt erhalte ich folgenden Fehler:
// How I import
import logger from '@myorg/custom-logger/src/logger';
// The error I get in vscode
Cannot find module '@myorg/custom-logger/src/logger' or its corresponding type declarations.
Der tsc-Compiler-Fehler:
TSError: ⨯ Unable to compile TypeScript:
src/config/winston.ts:1:20 - error TS2307: Cannot find module '@myorg/custom-logger/src/logger' or its corresponding type declarations.
Das custom-logger-Paket unterstützt CommonJS und ESM. Es wird mit der folgenden Struktur erstellt und zu npm bereitgestellt:
esm/
--- src/
--- index.js
--- logger.js
--- index.d.ts
--- logger.d.ts
--- package.json which contains { "type": "module" } (also tried without this - same issue occurs)
cjs/
--- src/
--- index.js
--- logger.js
--- index.d.ts
--- logger.d.ts
--- package.json which contains { "type": "commonjs" } (also tried without this - same issue occurs)
package.json which contains (see below)
Die Haupt-package.json im @myorg/custom-logger-Paket enthält Folgendes:
{
"name": "@myorg/custom-logger",
"version": "0.1.4",
"dependencies": {
"app-root-path": "^3.0.0",
"winston": "^3.8.1"
},
"devDependencies": {
"@types/app-root-path": "^1.2.4",
"@types/winston": "^2.4.4"
},
"types": "./esm/src/index.d.ts",
"typings": "./esm/src/index.d.ts",
"module": "./esm/src/index.js",
"main": "./cjs/src/index.js",
"exports": {
"./src/*": {
"types": "./esm/src/*.d.ts",
"import": "./esm/src/*.js",
"require": "./cjs/src/*.js"
},
".": {
"types": "./esm/src/index.d.ts",
"import": "./esm/src/index.js",
"require": "./cjs/src/index.js"
}
}
}
Die Probleme, die ich habe, sind wie folgt:
- Typescript und vscode scheinen die Export-Logik nicht zu beachten (es werden die oben gesehenen Fehler angezeigt)
Was ich zu erreichen versuche, ist:
- Fähig sein, Unterpfade zu importieren. Zum Beispiel
import mylib from '@myorg/custom-logger/src/logger'
Ich verwende "typescript": "4.7.4", und benutze esm (ecmascript) nativ in Node.
Antwort #1
Um dies zum Laufen zu bringen, musste ich meine tsconfig-"moduleResolution"-Konfiguration aktualisieren.
Hier ist meine neue Konfiguration (beachte, wie ich "moduleResolution": "Node16" eingestellt habe):
- Sie können auch
NodeNextals moduleResolution verwenden
{
"compilerOptions": {
"target": "ESNEXT", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */
"module": "ESNext", /* Specify module code generation: 'none', commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
"moduleResolution": "Node16",
"outDir": "build/" /* Redirect output structure to the directory. */,
/* Strict Type-Checking Options */
"strict": true /* Enable all strict type-checking options. */,
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
"rootDir": "./",
"resolveJsonModule": true
},
"include": ["src/", "e2e"],
"exclude": ["node_modules", "build", "logs", "db"],
"resolveJsonModule": true,
"esModuleInterop": true
}
Davor war der moduleResolution-Wert auf node gesetzt. Nach weiterer Untersuchung unterstützt die node-moduleResolution das "exports"-Feld in der package.json nicht. Hier ist eine großartige Antwort, die es detaillierter erklärt.
