”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 TypeScript 和语义版本控制创建并发布 npm 库

使用 TypeScript 和语义版本控制创建并发布 npm 库

发布于2024-11-07
浏览:892

?编写并发布最少的代码

要在 npm 上发布库,您需要:

  1. 一个npm 帐户;您可以在这里注册。

  2. 您的代码作为一个项目;即,您的代码目录中有一个 package.json,其中指定了名称和版本。请注意,您可以通过以下方式生成此文件:

npm init
  1. 项目中的index.js。请记住,您需要导出函数才能允许用户导入它。

注意: 如果您的脚本未命名为index.js并放置在项目根目录中,则需要在package.json中指定“main”属性。有关更多信息,请参阅此答案。

如果该名称已在 npm 上使用,您可以添加 @name-or-org/your-lib 等前缀;这就是当今大多数其他图书馆所做的。

你可以查看我的最小示例以供参考,但我相信你可以写出比这更酷的东西。

Create and publish an npm library, with TypeScript and Semantic Versioning

最后用CLI命令发布:

npm publish

Create and publish an npm library, with TypeScript and Semantic Versioning

设置带有前缀的包名称时请注意:必须是您在 npm 上注册的 npm 用户名或组织名称。例如,我可以使用 @remi_guan 作为我的前缀,但不能使用其他前缀。

此外,您需要运行 npmpublish --access public,因为 npm 认为您想要发布私有包,这是一项付费功能。

有这个输出就说明已经成功了。不过,如果您遇到问题,可以通过 Google 搜索来排除故障。以下是您如何使用自己的库:

Create and publish an npm library, with TypeScript and Semantic Versioning

如果您一直在遵循本指南,请尝试使用您自己的库。

如果您想了解更多信息,我还发现@backendbro 有比这更详细的指南。

发布代码后,当您想要更新代码时,可以再次运行 npmpublish。不过,在发布之前,您应该更新package.json的版本属性,并请遵守语义版本控制。

我建议你尝试一下!您能否发布您的库的 v1.0.1 或 v1.1.0,并在另一个项目中使用它,就像我刚刚所做的那样?你能弄清楚如何更新你的 npm 库的版本吗?

?使用打字稿

到目前为止,我们创建的这个库还不是现代的,它缺少类型声明,因此使用您的库的人无法通过键入来突出显示。此外,人们通常使用带有 ECMAScript 语法的 TypeScript。要了解差异,请参阅 Saisathish 的《Node.js 模块:CommonJS 与 ECMAScript》

但是我将在这篇文章中跳过 TypeScript 的详细设置。有很多很好的教程可以学习如何初始化 TypeScript 项目,例如 inapeace0 的“如何开发 Typescript 库”。

更进一步,您可以使用模板 TypeScript 存储库,例如 alexjoverm/typescript-library-starter,它已经集成了许多现代工具、最佳实践等。

如果您要发布 TypeScript 库,我只想提一些重要的注意事项:

  1. 发布前构建。如果需要公开发布,拥有最普通Node.js环境的人只能执行.js文件。所以你需要使用 tsc、rollup(或 vite,它使用 rollup)或 webpack 来编译你的代码;任何一个都可以。

您需要使用package.json中的module、main或entry属性正确指向编译后的文件。使用模板并一一学习是一个不错的选择。再次,alexjoverm/typescript-library-starter 很好地指定了它们。

  1. 包含 .d.ts 文件。出于同样的原因,用户还需要访问类型签名。

但是,如果您确定您的库将在 Deno、Bun 或 ts-node 上运行,您可以忽略我的上述准则,因为它们支持本机运行 TypeScript 代码。

请尝试按照指南创建 TypeScript 库并将其发布到 npm。这仍然很简单,就像第一个例子一样。您应该使用导入语法在另一个项目中对其进行测试,并且您可以使用 IDE 查看类型提示。

使用 TypeScript,我可以用以下语法编写我的库:

Create and publish an npm library, with TypeScript and Semantic Versioning

发布后,我可以安装并导入它,并通过 TypeScript 查看类型提示。

Create and publish an npm library, with TypeScript and Semantic Versioning

✨ 语义版本控制

有一个常见但稍微高级的问题等待解决:每次更新包时,我们都需要编辑版本代码。

这很烦人,特别是如果您经常更新代码。

但是,有一些工具可以帮助您。

  • 语义释放:全自动;您可以将其集成到 GitHub CI 中,以便每次在 GitHub 上更新代码时自动更新版本代码并发布到 npm。
  • release-it:也可以帮助你提升版本,但使用起来很简单(不需要 CI 知识);同时,您没有将其配置为完全自动化。

Create and publish an npm library, with TypeScript and Semantic Versioning

我使用 ChatGPT 生成了比较这两个工具的摘要。对于新程序员,我建议你尝试release-it,但是如果你知道如何将它与CI集成,semantic-release也很方便。

在这篇文章中,我将向您展示如何使用release-it,好吧,在您对项目进行更改后,只需在您的项目中运行它:

npx release-it

然后选择是小改动还是大改动,然后就完成了!

Create and publish an npm library, with TypeScript and Semantic Versioning


概括

所以你就有了!我们已经完成了发布一个简单的 npm 库、更新它,甚至使用 TypeScript 使其更加现代和健壮。记住:

  • 正确导出您的函数以便其他人可以使用它们。
  • 更新您的版本号遵循语义版本控制。
  • 考虑使用 TypeScript 以获得更好的类型安全性和开发人员体验。
  • 使用release-it或semantic-release等工具自动化发布以节省时间。

试试吧!发布您自己的库,更新它,看看为 npm 生态系统做出贡献的感觉如何。快乐编码!

版本声明 本文转载于:https://dev.to/remi-guan/create-and-publish-an-npm-library-with-typescript-and-semantic-versioning-9l?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 令牌桶算法:流量管理必备指南
    令牌桶算法:流量管理必备指南
    令牌桶算法是控制网络流量、确保公平带宽使用和防止网络拥塞的流行机制。它的运作原理很简单,即根据令牌可用性来调节数据传输,其中令牌代表发送一定量数据的权利。该算法对于维护各种系统(包括网络、API 和云服务)中的流量至关重要,提供了一种在不造成资源过载的情况下管理流量的方法。 令牌桶算法如何工作 令...
    编程 发布于2024-11-07
  • 如何为您的 Python 项目选择最佳的 XML 库?
    如何为您的 Python 项目选择最佳的 XML 库?
    Python 中的 XML 创建:库和方法综合指南在 Python 中创建 XML 文档时,开发人员可以选择各种库选项处理。最流行和最直接的选择是 ElementTree API,它是 Python 标准库自 2.5 版以来不可或缺的一部分。ElementTree:高效选项ElementTree 提...
    编程 发布于2024-11-07
  • 如何使用多个字段对 Java 中的对象列表进行排序?
    如何使用多个字段对 Java 中的对象列表进行排序?
    Java 中具有多个字段的列表对象的自定义排序虽然基于一个字段对列表中的对象进行排序很简单,但使用多个字段进行排序可能有点棘手。本文深入研究按多个字段排序的问题,并探讨 Java 中可用的各种解决方案。问题考虑一个场景,其中您有一个包含三个字段的“Report”对象列表:ReportKey、学号和学...
    编程 发布于2024-11-07
  • 如何使用递归从具有父类别的数据库生成嵌套菜单树?
    如何使用递归从具有父类别的数据库生成嵌套菜单树?
    菜单树生成的递归在您的情况下,您有一个数据库结构,其中类别有一个“根”字段指示其父类别。您想要的 HTML 输出涉及表示类别层次结构的嵌套列表。为此,可以使用递归 PHP 函数。这是一个示例函数:function recurse($categories, $parent = null, $level...
    编程 发布于2024-11-07
  • Array_column 函数可以用于对象数组吗?
    Array_column 函数可以用于对象数组吗?
    将 array_column 与对象数组一起使用本题探讨了将 array_column 函数与由对象组成的数组一起使用的可行性。开发人员实现了 ArrayAccess 接口,但发现它没有任何影响。PHP 5在 PHP 7 之前,array_column 本身不支持对象数组。要解决此限制,可以使用替代...
    编程 发布于2024-11-07
  • HashMap 实际应用:应对常见的 Java 面试挑战
    HashMap 实际应用:应对常见的 Java 面试挑战
    技术面试通常会提出一些问题来测试您对集合的理解,尤其是HashMaps。一个常见的挑战涉及计算列表中元素的出现次数。这个问题可以帮助面试官评估您有效处理数据聚合并避免NullPointerException等陷阱的能力。 如果您是 HashMap 新手,在深入研究本文之前,您可能需要查看我的破解...
    编程 发布于2024-11-07
  • SQL中什么情况下事务不会自动回滚?
    SQL中什么情况下事务不会自动回滚?
    自动事务回滚问题围绕着 START TRANSACTION 包含的 SQL 语句块中发生错误时事务的行为提交交易。 OP注意到,当COMMIT TRANSACTION语句之前遇到语法错误时,事务会自动回滚。事务回滚机制不,事务不会回滚遇到错误立即返回。然而,某些客户端应用程序可能会采用特定的错误处理...
    编程 发布于2024-11-07
  • 如何使用数组函数将字符串转换为关联数组?
    如何使用数组函数将字符串转换为关联数组?
    使用数组函数将字符串转换为关联数组在 PHP 中,经常需要将包含键值对的字符串转换为关联数组关联数组。考虑像“1-350,9-390.99”这样的字符串,其中每个元素由连字符和逗号分隔。目标是创建一个关联数组,其中每个元素中的第一个数字成为键,第二个数字成为值。可以使用 PHP 的内置数组函数有效地...
    编程 发布于2024-11-07
  • 了解无冲突复制数据类型
    了解无冲突复制数据类型
    无冲突复制数据类型 (CRDT) 是一类数据结构,可在分布式系统中实现无缝协作和数据同步,从而实现无冲突的协作更新。 CRDT 旨在实现跨多个数据副本的最终一致性,确保即使更新独立发生,所有副本也能收敛到相同状态,而不需要复杂的冲突解决机制。 在这篇博文中,我们将深入研究 CRDT 是什么,探索它们...
    编程 发布于2024-11-07
  • 如何在 PyQt 应用程序中正确利用 QThreads?
    如何在 PyQt 应用程序中正确利用 QThreads?
    在 PyQt 应用程序中使用 QThreads 的最佳实践使用 QThreads 允许在 PyQt 应用程序中进行多线程处理,从而实现任务分离并提高响应能力。然而,理解适当的技术至关重要。重新实现 Run 方法的不适当性正如参考博客文章中提到的,重新实现 run 方法是不是使用 QThreads 的...
    编程 发布于2024-11-07
  • 轻松掌握双向一对一关系:提升 Spring Data JPA 效率
    轻松掌握双向一对一关系:提升 Spring Data JPA 效率
    释放双向一对一关系的力量 在本深入指南中,我们将探讨相互一对一关联、CRUD 操作的复杂性,以及在高效数据建模中mappedBy、@JsonManagedReference 和 @JsonBackReference 的作用。 理解相互的一对一关联 简化 CRUD 操作 mappedBy 的重要性 揭...
    编程 发布于2024-11-07
  • 使用 faker 和 pandas Python 库创建用于测试的综合数据
    使用 faker 和 pandas Python 库创建用于测试的综合数据
    介绍: 全面的测试对于数据驱动的应用程序至关重要,但它通常依赖于拥有正确的数据集,而这些数据集可能并不总是可用。无论您是开发 Web 应用程序、机器学习模型还是后端系统,真实且结构化的数据对于正确验证和确保稳健的性能至关重要。由于隐私问题、许可限制或仅仅是相关数据的不可用,获取真实世界数据可能会受到...
    编程 发布于2024-11-07
  • go htmx 和 sse 示例
    go htmx 和 sse 示例
    此示例演示如何替换事件中的几个块,例如“id 1 已更改的帖子”( post-1-changed ) 并触发通过“chatter”上的 ajax 请求加载内容事件。 package main import ( "fmt" "net/http" "time" "gith...
    编程 发布于2024-11-07
  • Python 中网页抓取的当前问题和错误以及解决它们的技巧!
    Python 中网页抓取的当前问题和错误以及解决它们的技巧!
    Introduction Greetings! I'm Max, a Python developer from Ukraine, a developer with expertise in web scraping, data analysis, and processing. ...
    编程 发布于2024-11-07
  • Django 模型属性可以增强查询过滤吗?
    Django 模型属性可以增强查询过滤吗?
    模型属性可以增强 Django 中的查询过滤吗?Django 中面向对象编程的关键特性之一是能够定义您的模型的属性。属性允许您向模型添加功能,而无需编写其他方法。它们的工作原理是根据模型中存储的数据返回计算值。属性的常见用例是创建从现有字段组合派生的自定义属性。例如,假设您有一个代表一本书的模型,其...
    编程 发布于2024-11-07

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3