typescript - Enkle importsetninger for npm-pakke


Jeg vil publisere en ny npm TypeScript-pakke, og jeg vil kunne bruke enkle importsetninger (importere flere klasser fra biblioteket via én linje) i prosjektet mitt, f.eks.:

import { FirstClass, SecondClass } from "my-repo";

På dette tidspunktet må jeg bruke mange lengre importutsagn, for eksempel:

import { FirstClass} from "my-repo/first-class";
import { SecondClass } from "my-repo/second-class";

I begynnelsen bygde jeg pakken med tsc -p . til dist og deretter kjørte npm publish. Nå eksperimenterer jeg med pikapkg/pack for å gjøre byggeprosessen enklere, men jeg må fortsatt bruke de lange import-setningene.

Finnes det et verktøy for automatisk å lage en pakke med en enkelt fil å importere fra (index.ts som er plassert som main i package.json), eller må jeg manuelt opprette hovedindex.ts med alle eksporterte klasser, og hver gang jeg legger til en ny klasse, legge den til i index.ts igjen?

Svar #1

Det finnes to tilnærminger for å gjøre dette.

Installerer i node_modules

I dette tilfellet vil vi installere biblioteket i node_modules til brukeren og bruke Node module resolution.

Konfigurasjonen Node module resolution betyr at TypeScript-kompilatoren ser etter node_modules-mappen i arbeidsområdet ditt, og hvis det finnes en eksportert kode der som samsvarer med import-setningen din, vil den kunne løse den med den korte import-setningen. Du kan finne detaljer om dette her.

Hvis du har biblioteket ditt publisert og distribuert i et register (for eksempel til https://registry.npmjs.org/ eller i et Artifactory-repositorium osv.), legg det distribuerte biblioteket til package.json til forbrukeren som en avhengighet og installer det med npm install. Med dette steget vil biblioteket bli installert i node_modules, og hvis du i tsconfig.json har Node module resolution konfigurert i kompilatoralternativene, vil TypeScript-kompilatoren kunne løse den korte importsetningen.

Denne tilnærmingen antar at du har biblioteket distribuert til et register. Hvis du kun har biblioteket lokalt, kan CLI-en til install-local hjelpe deg med å installere biblioteket i node_modules lokalt uten noen distribusjon. Men det finnes et alternativ til dette, se derfor neste seksjon.

Referere direkte til den publiserte kilden fra dist

I tsconfig.json for forbrukerprosjektet kan du spesifisere dine lokalt publiserte moduler i paths i compilerOptions-innstillingene (se detaljer om kompilatoralternativer). På denne måten vil TypeScript-kompilatoren også løse avhengigheter fra de konfigurerte stiene. Det følger at du ikke trenger å installere avhengighetene dine i node_modules for å bruke den korte importsetningen, kompilatoren vil finne dem ved å følge de konfigurerte stiene.

La oss si at jeg har et bibliotek kalt my-lib. dist-mappen ser slik ut:

dist
-->my-lib
---->{all the published files of my-lib}
-->my-app
---->{all the published files of my-app}

I dette tilfellet ser et eksempel på tsconfig.json fra brukeren slik ut:

{
  "compileOnSave": false,
  "compilerOptions": {
    "baseUrl": "./",
    "outDir": "./dist/out-tsc",
    "sourceMap": true,
    "declaration": false,
    "module": "es2015",
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "importHelpers": true,
    "target": "es5",
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2018",
      "dom"
    ],
    "paths": {
      "my-lib": [
        "dist/my-lib"
      ],
      "my-lib/*": [
        "dist/my-lib/*"
      ]
    }
  }
}

Over i paths er både my-lib og my-lib/* nødvendige. my-lib er det som kan brukes i den korte importsetningen, for eksempel på denne måten:

import { MyLibModule } from 'my-lib';

Stiene etter disse oppføringene i tsconfig peker til det publiserte biblioteket i dist.

Så vidt jeg vet må eksportene gjøres manuelt i index.ts i pakken.

Relaterte artikler