javascript - Hvordan bruke exports og understier korrekt i package.json med TypeScript?
Det er første gang jeg prøver å lage en npm-pakke ved å bruke TypeScript, og jeg har opplevd noen problemer, sannsynligvis fordi jeg misforsto noe da jeg fulgte dokumentasjonen. Jeg bruker Node 16.16.0 med npm 8.13.2 på tidspunktet for å skrive dette.
Først og fremst ser prosjektstrukturen min slik ut.
src/
├─ module1/
│ ├─ index.ts
├─ module2/
│ ├─ index.ts
package.json
tsconfig.json
tsconfig.json :
{
"compilerOptions": {
"target": "es2017",
"module": "commonjs",
"esModuleInterop": true,
"declaration": true,
"outDir": "./lib",
"strict": true
},
"include": ["src"],
"exclude": ["node_modules", "**/__tests__/*"]
}
package.json :
{
"name": "@owner/mypackage",
"version": "v1.0.0",
...
"files": [
"lib/**/*"
],
"type": "module",
"exports": {
"./module1": "./lib/module1/index.js",
"./module2": "./lib/module2/index.js",
"./package.json": "./package.json"
}
}
Saken er at når man publiserer modulen, genererer den følgende struktur:
lib/
├─ module1/
│ ├─ index.js
├─ module2/
│ ├─ index.js
package.json
Etterlater meg med følgende importstruktur:
import {Foo} from "@owner/mypackage/lib/module1";
I stedet for den ønskede:
import {Foo} from "@owner/mypackage/module1";
Hvordan kan jeg oppnå det mønsteret? Og, hvis det finnes, kan jeg forbedre det eller følge bedre praksiser?
Svar #1
Personlig, i et prosjekt jeg har som kjører Typescript 4.7+, har følgende fungert: det du trenger er typesVersions-egenskapen i package.json i stedet. (se https://www.typescriptlang.org/docs/handbook/declaration-files/publishing.html#version-selection-with-typesversions)
Jeg vil trekke dette sitatet ut av dokumentasjonen ovenfor som relevans:
Vel, hvis ingen av feltene i typesVersions blir matchet, faller TypeScript tilbake til types-feltet, så her vil TypeScript 3.0 og tidligere bli omdirigert til [...]/node_modules/package-name/index.d.ts.
Som i hovedsak betyr at hvis typesVersions-feltet ikke er definert i package.json, brukes types-feltet, men types-feltet er ikke nyttig for oss når vi har flere eksportstier med exports.
Håper dette hjelper!
{
"exports": {
"./module1": "./lib/module1/index.js",
"./module2": "./lib/module2/index.js",
},
"typesVersions": {
"*": {
"module1": ["lib/module1/index.js"],
"module2": ["lib/module2/index.js"]
}
}
}
