Exportações em package.json

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





exports



.

.







!








All Articles