visual studio code - Typdefinitioner för peer-paket i TypeScript-monorepos: utveckling vs produktion


Jag har ett monorepo-projekt som använder yarn workspaces och lerna; alla dess delar är skrivna i TypeScript. Modulerna ligger i undermappar som packages/module-n och varje modul har sin egen package.json med följande rader:

"main": "dist/index.js",
"types": "dist/index.ts",

Källkoden för varje paket finns i packages/module-n/src/index.ts, så inget ovanligt.

När det gäller att bygga från kommandoraden eller publicera fungerar allt bra - tack vare tsconfig.json och ett build-skript i varje paketmapp. Däremot, när det gäller dagligt kodredigerande i VSCode, blir saker inte så bekvämt, även trots att jag kör tsc --watch på alla paket för att hålla länkade beroenden synkroniserade.

När jag kommando-klickar på en definition som hänvisar till ett peer-paket, tar VSCode mig till packages/package-n/dist/index.d.ts istället för packages/package-n/src/index.ts som jag kanske redigerar för tillfället. Dessutom, när jag vill refaktorera något med F2, kan dist/index.d.ts-filer ibland ändras, vilket tvingar mig att starta om build:watch på grund av fel. Problemet är att TypeScript ser manuella ändringar i **/dist/index.d.ts och vägrar att uppdatera dessa filer ytterligare.

För att övervinna detta besvär har jag skrivit dessa två skript i roten package.json, men jag är inte ett stort fan av min egen lösning:

"use-dev-typings": "lerna exec \"replace --quiet dist\\/index\\.d\\.ts src/index.ts package.json\"",
"use-prod-typings": "lerna exec \"replace --quiet src\\/index\\.ts dist/index.d.ts package.json\""

Här är hur jag använder dem i samma rot package.json:

"build": "yarn use-prod-typings && lerna run build",
"build:watch": "lerna run build; yarn use-dev-typings && lerna run --parallel build:watch",

Tanken är att innan jag börjar redigera filer i VSCode och därmed kör yarn build:watch, patchar jag alla packages/package-n/package.json-filer genom att ersätta "types": "dist/index.d.ts" med "types": "src/index.ts". Detta fixar command+click och refaktorering, vilket är fantastiskt. När det gäller engångsbyggande (t.ex. innan publicering), återgår "types" till "dist/index.d.ts".

Jag undrar om det finns ett bättre sätt att uppnå det jag är ute efter och det vore fantastiskt om någon kunde ge mig råd. Jag är ganska säker på att jag kommer att begå "src/index.ts" av misstag en dag eller till och med publicera en version med detta värde. Innehållet i src/*.ts är exkluderat från npm-utgåvorna för att hålla mina paket små.

Svar #1

https://github.com/Izhaki/mono.ts

Den använder yarn workspaces och fungerar bra med VSCode. Jag hoppas att README-filen är tillräckligt tydlig.

I princip, använd två (parallella) TypeScript-konfigurationsträd:

  • Förbyggd - använder alias (för VSCode, tester, webpack, etc).
  • Build - använder TypeScript 3-projektreferenser för publicering i huvudsak.

Relaterade artiklar