和其他框架的比较

虽然 grammY 使用了一些其他 bot 框架(和 web 框架)中已知的概念,但为了获得最佳的可读性和性能,它是从零开始写的。 换句话说,它没有使用任何竞争项目的代码,但如果你使用过其他框架,你可能会觉得很熟悉。

尽管我们试图为你提供一个客观的描述,说明使用 grammY 和使用其他库的优缺点,但请假设这种比较是存在偏见的。 我们会努力使本文中的内容保持最新。 如果你发现有一些信息已经过时了,可以使用底部的链接编辑这个页面。

与其他 JavaScript 框架的比较

请先选择你的编程语言

鉴于你正在阅读 JavaScript 生态系统中的一个框架的文档,你可能正在寻找能在 Node.js(或 Deno)上运行的东西。 但是,如果你不是的话,请 向下滚动,比较哪些编程语言适合于 bot 开发。 当然,你也会发现与其他语言的框架(主要是 Python)的简单比较。

grammY 主要从两个项目中获取灵感,即 Telegrafopen in new windowNTBAopen in new window。 我们现在先重点关注它们,但我们(或者你?)可能会在未来增加与其他框架的比较。

Telegraf

grammY 起源于 Telegraf,所以在这里简单介绍一下这两个框架的历史关系。

一些历史

Telegraf 是一个了不起的库,没有它,grammY 就不会有今天的成就。 然而,Telegraf 曾经是使用 JavaScript 写的(v3 版本)。 类型注释是通过手动添加的,并且维护得很差,所以它们并不完整、正确且过时。 强类型注释对于一个严肃认真的库来说是非常重要的,因为它们能提供工具支持,并且可以显著地加快你的代码库的迭代速度。 在开发一个复杂的 bot 时,大部分人都喜欢类型安全,而且对一部分人来说,不提供类型安全是一件令人无法接受的事情。

Telegraf v4 试图通过将整个代码库迁移到 TypeScript 来解决这个问题。 不幸的是,许多由此产生的类型非常复杂,复杂到无法理解(但是正确的)。 此外,迁移过程中发现了代码库中无数的怪异现象(例子open in new window),这使得为现有代码找到正确的类型变得非常痛苦。

因此,尽管 4.0 版本试图 改进 正确性和工具支持,它最终还是使 Telegraf 比它的非类型化版本更加难用。 可以理解的是,许多 Telegraf 3 的现有用户不愿意升级。 新用户上手也变得更加困难。

grammY 后退了一步,重新思考一个以可行性优先的类型安全的 bot 框架。 这使得我们可以跳过许多关于如何处理奇怪的内部类型的令人沮丧的讨论。 它使项目具有干净、一致、可编译的代码,为用户提供优秀的类型(= 编辑器支持)。 类型安全反过来允许更多高级特性,这些特性从根本上改变了我们对 bot 开发的看法,比如 Bot API Transformers

今天,Telegraf 3 已经过时了。 有一些非官方的分支试图使遗留的代码库跟上 Bot API 的发展,但它们的兼容性是未知的。 此外,Telegraf 的插件生态系统已经转移到了 Telegraf 4。 大多数插件的开发者并没有为旧的 Telegraf 版本的第三方分支维护版本。 基于 Telegraf 出于版本 3 和版本 4 之间的事实,将 grammY 分别与这两个版本进行比较是有意义的。

与 v3 的比较

鉴于它们的共同历史,grammY 和 Telegraf 有很多共同点。 它们的核心都有一个 中间件系统。 它们也共享很多基本语法:

// 在 grammY 和 Telegraf 都能这样写。
bot.on("message", (ctx) => ctx.reply("Hi!"));

任何在 Telegraf 中写的代码,只需要做一些小改动,就可以在 grammY 中工作。 (请注意,反之则不然,因为 grammY 的许多功能对 Telegraf 是不可用的。)

与 Telegraf 3.x 相比,grammY 的主要优势在于对工具支持更到位。 Telegraf 3 使用 JavaScript 写的。 它所提供的类型是不正确切不完整的,并且所支持的 Bot API 已经过时了好几年。 因此,对自动完成或者拼写检查的 bot 代码没有可靠的支持。 经验表明,你必须经常运行你的 bot 才能发现你的代码是否正常工作。

相比之下,grammY 是用纯 TypeScript 写的。 这允许你的代码编辑器(比如 VSCode)在你编程时进行分析,并协助你。 此外,它可以内联显示完整的 Telegram Bot API,当你把鼠标悬停在你的代码的任何名称或元素上时,会给你提供 API 文档的网址。

另一个显著的优势是,你终于能够在 TypeScript 中编写你自己的 bot。 这一点很难做到,因为 Telegraf 错误饿类型注释会阻碍编译完全正确的代码,这会导致用户从一开始就不检查代码。 然而,类型安全的代码对于任何重要的代码库来说都是一个主要优势。

grammY 和 Telegraf 有不同的代码基础。 由于摆脱了传统的束缚,grammY 可以对底层的中间件做出实质性的贡献,实现令人兴奋的用例,比如 filter 查询error 边界Bot API Transformers,以及更多。 这也使得开发一些在 Telegraf 下无法工作的有价值的插件成为可能。

与 grammY 相比,Telegraf 的主要优势在于它仍然被更多人所知道。 Telegraf 社区可能在各个版本之间有分歧,但这些群体中的大多数人用他们的 Telegraf 版本创建的 bot 比 grammY 的 bot 还要多。 这也意味着你可以在互联网上找到更多关于 Telegraf 用户的故事,和找到更多由其他程序员编写的非官方教程。

与 v4 的比较

与 Telegraf 4.x 相比,grammY 的主要优势在于使用起来它要简单得多。 比如说:

  • grammY 有 一个文档。 Telegraf 则没有(它被缺少解释的生成的 API 参考所取代)。
  • grammY 中的类型会跟随你的代码来工作。 在 Telegraf 中,你可能经常需要以某种方式来写的你的代码,否则它就不能编译(即使它实际上是可以正常工作的)
  • grammY integrates hints from 官方 Bot API 参考open in new window inline that help you while you’re coding. Telegraf does not give you any explanations on your code.
  • grammY 集成了来自 官方 Bot API 参考open in new window 的内联提示,在你写代码时能够帮助你。 Telegraf 则不会给你的代码提供任何解释。

总结

grammY 的优势
  • 比 Telegraf 3 和 4 更容易使用
  • 适当的 TypeScript 支持
  • 有文档和生成的 API 参考
  • 长时间轮询时速度明显加快(使用 grammY runner)
  • 联合社区和生态系统
  • 更多插件
  • 更好地与数据库和网络框架集成
  • 更积极的开发
  • 有帮助的错误信息
  • 更难遇到危险的竞争条件
  • 旨在保护你不犯编程错误
  • 在 Node.js 上运行,但也可以在 Deno 和浏览器中运行
Telegraf 的优势
  • 更早,因此更成熟
  • 更多的 bot 实例,包括在代码仓库中和在互联网上

NTBA

node-telegram-bot-api 是影响 grammY 发展的第二个大项目。 与其他框架相比,它的主要优势在于它非常简单。 它的架构可以用一句话来描述,而 grammY 需要在文档网站上用一个 指南 来做同样的描述。 我们相信,grammY 网站上的所有这些解释有助于人们轻松入门,但是拥有一个不需要任何解释的库是很诱人的。

从坏的方面来看,这只在短期内有好处。 把所有东西都放在一个巨大的文件里,用一个原始的 EventEmitter 来处理复杂的对象流(又称网络请求),这种想法给 Telegram bot 的世界带来了很多痛苦,也阻碍了一些好的想法的实现。 bot 总是从小规模开始,但一个负责任的框架必须为它们提供一条清晰的增长和扩展的路径。 不幸的是,NTBA 在这方面做的很差。 任何超过 50 行使用 NTBA 的代码库最终都会变成一堆像意大利面条一样的交叉引用。 你不会想要这样的。

其他框架

你认为你喜欢的框架在某些方面比 grammY 好吗? 请随时编辑本页面并添加比较,或者在 群聊open in new window 中告诉我们你的想法!

与其他编程语言的框架比较

你可以有你自己的理由赞成使用不同的编程语言而不是 TypeScript。 最重要的是你喜欢使用你的工具和语言。 如果你决定使用别的语言,那么你可以不要继续往下看了。

鉴于你还在阅读,你可能想知道为什么 grammY 是用 TypeScript 编写的,以及为什么你也应该考虑为你的 bot 选择这种语言。

本节将概述 TypeScript 在开发 Telegram bot 时与其他语言相比有哪些优势。 用于开发 Telegram bot 的另一种主要语言是 Python,所以我们将仅限于两者之间的比较。 下面是一些个人观点,而不是客观事实。 每个人的观点都不一样,所以请对这一部分持保留态度。

  1. 更好的编辑工具 grammY 的类型注释非常出色。 虽然 Python 在 3.5 版本中引入了类型,但它们在生态系统中的使用并不像 JavaScript/TypeScript 那样普遍。 因此,它们无法与 grammY 及其配套库的开箱即用的功能相比。 这些类型会在开发的每一步自动完成,以及带有解释和链接的有用提示。
  2. 更容易扩展代码库 类型系统还有第二个优势——它允许你扩展 bot 的代码库。 对于用类型安全较差的语言编写的项目来说,这很难做到。
  3. 更容易扩大负载 如果你的 bot 开始流行起来,那么用 JS 编写的 bot 比用 Python 编写的 bot 更容易扩展。
  4. 更快的响应速度 V8 引擎使 JavaScript 成为可观察世界中最快的脚本语言。 如果你希望你的 bot 尽可能的快,同时仍然享受动态语言,那么 grammY 是你的最佳选择。
  5. async/await 支持 这是一种非常流行的控制并发性的编程模式。 近几年来,异步编程呈现出强烈的趋势。 最大的 Python bot 框架 PTB 宣布在2021年1月迁移open in new window 到异步编程,预计可能需要 “两年时间”。 grammY 则已经支持了。 (其他不太为人所知的 Python 框架可能前一的框架。 如果你正在使用支持 async/await 的 Python 框架,请忽略这一点。)

如何不同意这种比较

如果你认为这个页面上有什么问题,不要失望! 请在 群聊open in new window 中告诉我们! 我们很希望你能用你的观点来教育我们。 当然,你也可以直接在 GitHub 上编辑这个页面,或者提交一个 issue 指出我们的错误或者提出你的建议。 这个页面永远留有空间变得更客观、更公平。