【发布时间】:2021-07-16 21:15:13
【问题描述】:
我正在将我的 react 组件库 react-esri-leaflet 转换为 typescript。该库要求用户安装 react-leaflet 作为 peerDependency,它提供对 react-leaflet 版本 3 (RLV3) 和 react-leaflet 版本 2 (RLV2) 的支持。对于默认组件,我可以简单地做
import { createLayerComponent } from 'react-leaflet'
但是如果用户想要使用与 RLV2 兼容的组件,他们可以单独导入这些组件(请随意查看库文档以了解如何使用)。大多数 RLV2 组件都以类似
的开头import { withLeaflet, MapControl } from 'react-leaflet'
在转换为打字稿时,这会引发错误。在开发这个库时,我安装的 react-leaflet 安装了最新版本。 withLeaflet 和 MapControl 在该版本中不再存在。
为了解决这个问题,我按照this answer 中的建议“Node 应用程序中相同 npm 包的两个版本”。这允许我通过将 RLV2 别名为 'react-leaflet-v2' 来将 RLV2 视为源代码中的一个单独的包,我可以这样做
import { withLeaflet, MapControl } from 'react-leaflet-v2'
太好了,现在打字稿很高兴,我可以将适当版本的 react-leaflet 导入适当的组件,并且打字是正确的。但是,当我使用 tsc 编译回 js 时,我的 V2 组件中使用的包名仍然是 'react-leaflet-v2'。
问题是该库的最终用户将使用任何一个 RLV2 或RLV3,并且在他们的项目中将其简单地称为'react-leaflet'。库的编译文件需要能够找到'react-leaflet',而不是某个别名,无论它们使用的是什么版本。
如何在开发中维护两个依赖版本的类型安全,但让我的用户不用担心,这意味着只需安装他们想要使用的 react-leaflet 版本,从库中导入正确的组件,然后组件是否在他们的项目中找到了 'react-leaflet' 依赖项?编译时是否可以告诉tsc 将'react-leaflet-v2' 重命名为'react-leaflet'?还有其他解决方案吗?
【问题讨论】:
标签: reactjs typescript npm libraries peer-dependencies