Exporte in package.json

Hallo. Ich arbeite in einem Team, das sich der Verbesserung der Benutzererfahrung

beim Umgang mit Geld widmet . Wir liefern das Frontend in npm-Paketen.



Irgendwann stieß ich auf Probleme, die mich dazu veranlassten, ein

Feld exports



in zu verwendenpackage.json









Problem Nr. 1



Pakete können Funktionen mit demselben Namen exportieren, aber unterschiedliche Aufgaben ausführen. Nehmen wir als Beispiel zwei staatliche Manager: Reatom und Effector.



Sie exportieren die Funktion createStore



. Wenn Sie versuchen, sie aus einem Paket zu exportieren (nennen wir es vendors



), erhalten Sie das folgende Bild:







// @some/vendors/index.ts

export { createStore } from '@reatom/core';
export { createStore } from 'effector';
      
      





Es besteht ein Namenskonflikt. Diese Art von Code funktioniert einfach nicht.







Dies kann vermieden werden durch as



:







// @some/vendors/index.ts

export { createStore as reatomCreateStore } from '@reatom/core';
export { createStore as effectorCreateStore } from 'effector';
      
      





Sieht ehrlich gesagt mies aus. In gütlicher Weise muss jeder Reexport durchgeschrieben werden as



, um die Konsistenz zu gewährleisten. Das macht DX für mich noch schlimmer.



Ich suchte nach einer Lösung, die sowohl den Namenskonflikt als auch die Notwendigkeit des Schreibens vermeidet as



. Wie könnte es aussehen ... Zum Beispiel so:







// @some/vendors/reatom.ts

export { createStore } from 'reatom';
      
      





// @some/vendors/effector.ts

export { createStore } from 'effector';
      
      





In zwei verschiedenen Dateien schreiben wir regelmäßige Exporte und importieren die erforderliche Implementierung createStore



:







// someFile.ts

import { createStore } from 'vendors/effector';
      
      





#2



vendors



, , -, - . , Runtypes.

exports



, :







// someFile.ts

import { createStore, Dictionary, createEvent, Record } from 'vendors';
      
      





- . , - :







// someFile.ts

import { createStore, createEvent } from 'vendors/effector';
import { Dictionary, Record } from 'vendors/runtypes';
      
      





. .







// someFile.ts

import { createStore, createEvent } from 'vendors/state';
import { Dictionary, Record } from 'vendors/contract';
      
      







, exports



package.json







// package.json

"exports": {
  "./contract": "./build/contract.js",
  "./state": "./build/state.js",
  "./package.json": "./package.json"
}
      
      





, . TypeScript, .



package.json types



, , . . contract



, state



. ?



typesVersions



package.json









// package.json

"typesVersions": {
  "*": {
    "contract": ["build/contract.d.ts"],
    "state": ["build/state.d.ts"]
  }
}
      
      





, exports



, d.ts



, .









exports



vendors



. DX.



, Effector :







import { createEvent } from 'effector';
      
      





:







import { createEvent } from 'effector/compat';
      
      





exports



.

.







!








All Articles