Olá. Trabalho em uma equipe dedicada a melhorar a experiência do usuário
ao trabalhar com dinheiro. Entregamos o front-end em pacotes npm.
Em algum momento, tive problemas que me levaram a usar um
campo exports
empackage.json
Problema # 1
Os pacotes podem exportar funções com o mesmo nome, mas fazer coisas diferentes. Vamos pegar 2 gerentes de estado como exemplo: Reatom e Effector.
Eles exportam a função createStore
. Se você tentar exportá-los de um pacote (vamos chamá-lo vendors
), você obterá a seguinte imagem:
// @some/vendors/index.ts
export { createStore } from '@reatom/core';
export { createStore } from 'effector';
Existe um conflito de nomes. Esse tipo de código simplesmente não funciona.
Isso pode ser evitado por as
:
// @some/vendors/index.ts
export { createStore as reatomCreateStore } from '@reatom/core';
export { createStore as effectorCreateStore } from 'effector';
Francamente, parece péssimo. De forma amigável, cada reexportação deve ser escrita as
para manter a consistência. Isso torna o DX pior para mim.
Comecei a procurar uma solução que evitasse o conflito de nomes e a necessidade de escrever as
. Como poderia ser ... Por exemplo, assim:
// @some/vendors/reatom.ts
export { createStore } from 'reatom';
// @some/vendors/effector.ts
export { createStore } from 'effector';
Em dois arquivos diferentes, gravamos exportações regulares e importamos a implementação necessária 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';
!