首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建和发布具有ES6集合类型的NPM模块

创建和发布具有ES6集合类型的NPM模块
EN

Stack Overflow用户
提问于 2017-01-02 11:14:25
回答 1查看 119关注 0票数 2

备注:--这是我想发布给别人使用的第一个模块,因为我觉得它非常有用。它是一个用于TypeScript的类型化数据序列化引擎.我有点不知道该怎么做,我需要一个明确的答案。所以谢谢你今天跳进来,让我们开始吧.

我创建了一个npm模块,它使用ES6集合类型SetMap。这些集合类型是:

  • 用于推动我的模块的内部实现。
  • 通过基于类型记录/es7装饰器的API (作为类属性)隐式支持

这些类型的内部使用并不麻烦,因为据我所知,我可以通过package.json简单地依赖它们,并将它们导入到我的源代码中;然后,它们就会一直存在。

另一方面,,如果我这样做,我的理解是这些导入将覆盖本地Map/Set对象(如果可用的话),并且与我所依赖的类型检测相冲突(或者这些导入是否在可用时生成本机对象?)。

关于上述类型的检测.最好通过一个示例来演示--如果用户要在我的模块中使用Map对象,则应该这样做:

代码语言:javascript
运行
复制
// Consumer code.
class MapContainer {
    @JsonMember
    mapValues: Map<number, string>;
}

下面是在我的模块中检测和处理Map的方式:

代码语言:javascript
运行
复制
// Internal module code.
// Just for the sake of clarity: 'sourceValue === new MapContainer().mapValues'
if (sourceValue.constructor === Map) {
    // Handle 'sourceValue' as a map object...
}

现在很明显,这将如何引起冲突。相反,这也是一个问题:如果用户将import映射/Set作为模块,而不是使用本机可用的实现,那么我模块的内部代码就不会认识到这一点。

在本例中如何定义我的依赖项?

  • 只需在我的代码中插入一些简短的多填充,让用户以他们所能的任何方式处理它?
  • require('es6-map/implement')?(除了在文档/限制中提到这一点外,我如何确保模块的用户也这样做?)
  • 通过源中的一些别名(如Map__Set )导入Set__Map,并使用基于字符串的“类名”检测而不是比较构造函数引用?(这看起来很脏)
EN

回答 1

Stack Overflow用户

发布于 2017-01-02 14:40:02

首先,根据定义,无条件应用本身的多边形填充实际上不是一种填充,而是一种黑客(例如zone.js)。行为良好的多填充将使用特征检测,并且只在尚未出现的情况下添加全局填充。

你基本上有三种选择:

  1. 您可以使用多填充来导出它们的功能,而不是增强全局。这项技术被称为填充马匹。这是有点武断,因为它并没有真正完成什么填充-它没有提供一个本地的经验。然而,这样做的好处是,您可以正确地依赖您的实现选择,您的用户可以依赖于不同的实现,这两个不会干扰。这种方法看起来就像 从‘ES6- Map’导入地图;//纯小马
  2. 正如您已经注意到的,您可以选择不提交特定的填充,而只是记录您的库要求存在符合ES2015的SetMap函数。然后,您的用户可以从各种填充中进行选择。这样做的好处是,如果用户想要使用不同的填充,他们可以这样做,而不增加代码的大小,这对于目标浏览器的项目非常重要。此选项还允许您自己的代码在可用的情况下利用本机实现,这是选项1无法实现的。
  3. 另一种方法是自己简单地填充它。这是最简单的选择,因为您自己的代码是如何构造的,但也最有可能导致与使用者及其依赖项的冲突。与选项2一样,这具有在可用的地方使用本机实现的优点。然而,也有一些缺点。无论用户是否愿意,您都将强制用户支付使用此功能的成本。用户可能不知道您的库是导致多填充Map在他们的代码中可用的原因,并且可能会间接地依赖于它。相对于其他依赖项,库的加载顺序可能会导致非常奇怪和难以检测bug。这种方法看起来就像 导入‘ES6-映射/实现’;//变异全局

那么,这与您的特定用例有什么关系呢?其中大部分都适用于任何依赖于可能需要填充的特性的库,但正如您所建议的,具体相关的部分与混叠有关。没有必要求助于字符串比较。

相反,如果要导入Map而不是填充它(选项1 )(选项1),您不能将您在实现中导入的Map与从依赖方代码中捕获的值进行比较,因为它将是一个不同的引用,其结果通常是false,而且肯定永远不会可靠。此外,如果您希望它在内置的Map支持、多填充或本地环境中工作,那么sourceValue.constructor === Map中的Map标识符需要引用该环境中的全局Map,不管它是什么。

我推荐选项1,因为它提供了最大的兼容性,并允许您正确地指定依赖项。这意味着在您使用Map的任何地方导入它,如

代码语言:javascript
运行
复制
import Map from 'es6-map';

这将创造一个本地的。如果您需要在与全局Map交互的模块中使用它,那么您将需要使用别名导入它,正如您已经考虑过的那样。

值得注意的是,

代码语言:javascript
运行
复制
sourceValue.constructor === Map

如果全局上没有Map,则会添加一些环境,因此您需要使用以下内容进行检查

代码语言:javascript
运行
复制
typeof Map !== 'undefined' && sourceValue.constructor === Map

为了安全起见。

不相关,请将打开的{放在同一行,无论什么需要它。这在JavaScript中很重要。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41425779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档