Halo. Saya bekerja dalam tim yang berdedikasi untuk meningkatkan pengalaman pengguna
saat bekerja dengan uang. Kami mengirimkan paket npm front-end.
Di beberapa titik, saya mengalami masalah yang membuat saya menggunakan
bidang exports
dalampackage.json
Masalah # 1
Paket dapat mengekspor fungsi dengan nama yang sama tetapi melakukan hal yang berbeda. Mari kita ambil 2 manajer negara sebagai contoh: Reatom dan Effector.
Mereka mengekspor fungsinya createStore
. Jika Anda mencoba mengekspornya dari satu paket (sebut saja vendors
), Anda mendapatkan gambar berikut:
// @some/vendors/index.ts
export { createStore } from '@reatom/core';
export { createStore } from 'effector';
Ada konflik nama. Kode semacam ini tidak akan berfungsi.
Ini dapat dihindari dengan as
:
// @some/vendors/index.ts
export { createStore as reatomCreateStore } from '@reatom/core';
export { createStore as effectorCreateStore } from 'effector';
Tampak, sejujurnya, buruk. Dengan cara yang bersahabat, setiap ekspor ulang harus ditulis as
untuk menjaga konsistensi. Ini membuat DX lebih buruk bagi saya.
Saya mulai mencari solusi yang akan menghindari konflik nama dan kebutuhan untuk menulis as
. Bagaimana tampilannya ... Misalnya seperti ini:
// @some/vendors/reatom.ts
export { createStore } from 'reatom';
// @some/vendors/effector.ts
export { createStore } from 'effector';
Dalam dua file berbeda, kami menulis ekspor reguler dan mengimpor implementasi yang diperlukan 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
.
.
!