Ekspor di package.json

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



.

.







!








All Articles