Website-Suche

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 NodeNext als 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.

Verwandte Artikel