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"]
    }
  }
}

Relaterte artikler