node.js - το package.json δεν σέβεται την ιδιότητα exports για πακέτο npm esm και cjs
Δυσκολεύομαι να κάνω τη βιβλιοθήκη npm μου να υποστηρίζει εισαγωγές/απαιτήσεις υποδιαδρομών μέσω του πεδίου exports στο package.json. Για πλαίσιο, το package.json υποστηρίζει ένα πεδίο "exports" το οποίο σας επιτρέπει να εκθέτετε αρχεία υπό όρους με βάση τον χρόνο εκτέλεσης (π.χ. commonjs ή ecmascript).
Όταν εισάγω τη βιβλιοθήκη npm στο έργο μου τύπων TypeScript, λαμβάνω το ακόλουθο σφάλμα:
// 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.
Το σφάλμα του μεταγλωττιστή tsc:
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.
Το πακέτο custom-logger συνοδεύεται από υποστήριξη για commonjs και esm. Είναι κατασκευασμένο και αναπτυχθέν στο npm με την ακόλουθη δομή:
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)
Το κύριο package.json στο πακέτο @myorg/custom-logger περιέχει τα εξής:
{
"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"
}
}
}
Τα προβλήματα που αντιμετωπίζω είναι τα εξής:
- Το Typescript και το vscode φαίνεται να μην σέβονται τη λογική των εξαγωγών (ρίχνει τα σφάλματα που φαίνονται παραπάνω)
Αυτό που προσπαθώ να πετύχω είναι:
- Να μπορείτε να εισάγετε υποδιαδρομές. δηλ.
import mylib from '@myorg/custom-logger/src/logger'
Χρησιμοποιώ "typescript": "4.7.4", και χρησιμοποιώ esm (ecmascript) φυσικά στο node.
Απάντηση #1
Για να το κάνω να λειτουργεί, έπρεπε να ενημερώσω τη ρύθμιση "moduleResolution" στο tsconfig μου.
Εδώ είναι η νέα μου ρύθμιση (παρατηρήστε πώς έχω ορίσει "moduleResolution": "Node16"):
- Μπορείτε επίσης να χρησιμοποιήσετε το
NodeNextως την moduleResolution
{
"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
}
Πριν από αυτό, η τιμή moduleResolution είχε οριστεί σε node. Μετά από περαιτέρω διερεύνηση, η node moduleResolution δεν υποστηρίζει το πεδίο «exports» στο package.json. Εδώ είναι μια εξαιρετική απάντηση που το εξηγεί με περισσότερες λεπτομέρειες
