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';
!