关于 Deno 消亡的说法,实在是言过其实了
Deno 2.3 发布,改进了 deno compile、本地 npm 包等功能 🚀
最近出现了一些关于 Deno 的批评——关于 Deploy、KV、Fresh 以及我们整体发展势头的批评。你可能已经在网上看到了一些,并在常去的地方传播开来,引起了不少关注。
其中一些批评是合理的。事实上,我认为可以公平地说,我们因为对正在做的事情,以及公司和产品的未来方向保持沉默,而造成了一定程度的恐慌和不确定性。这是我们的责任。
在其他方面,最近的批评是不准确或推测性的。这就是我们撰写这篇文章的原因:为了澄清事实。本文将介绍我们目前的状况、我们所学到的东西,以及我们接下来要构建的内容。有些人担心 Deno 本身正在衰落或消失,但这与事实相去甚远。自从去年 10 月发布 Deno 2 以来——仅仅六个多月!——根据我们的月活跃用户指标,Deno 的采用率已经翻了一番以上。Deno 2 强大的 Node 兼容性有效地消除了一个主要的采用障碍,解除了各种严肃用例的限制。该平台变得更快、更简单、更强大。现在,Deno 的使用比以往任何时候都更广泛、更认真。
Deno Deploy
我们听到的最大的问题之一是关于 Deno Deploy——特别是可用区域的减少。虽然我们理解这种缩减规模的表面现象,但其原因并非通常担心的那样。
实际上:大多数应用程序不需要在所有地方运行。它们需要快速、靠近其数据、易于调试,并符合当地法规。我们正在为此进行优化。
我们在 2021 年推出了 Deno Deploy,以探索 serverless JavaScript 的新模型。它最初在 25 个区域启动,增加到 35 个,现在在 6 个区域运行。这种减少确实是受成本驱动的——但也受使用情况驱动。大多数开发人员没有部署简单的无状态函数。他们正在构建完整的应用程序:与数据库通信的应用程序,该数据库几乎总是位于单个区域中。我们发现,大多数时候,多余的区域基本上没有被使用。当流量高峰到来时,空闲区域会迅速达到容量,导致延迟高峰。我们发现,路由到更远更大的区域通常比在附近冷启动的区域运行更快。
我们追求的“边缘”愿景与人们实际使用服务的方式不符。我们本不应该对此保持沉默。
Deno Deploy 正在进行大量开发——我们尚未发布最新版本,但即将发布。你可以在此处申请提前访问。
Deploy 正在发展成为一个托管应用程序的平台——不仅仅是函数。它将支持子进程、后台任务、OpenTelemetry、构建管道、缓存,甚至自托管区域。它运行 Next.js、SvelteKit 等全栈框架,当然还有 Fresh。
很快,你将能够将你的应用程序固定到一个区域——或者在你自己的云中运行它。这是我们从关心控制、合规性和性能的用户那里一次又一次听到的。更多信息即将推出。
KV
Deno KV 是我们的零设置、全局一致的键值存储,具有简单的 API 和实时功能。我们意识到,对于会话数据、功能标志和协作状态等内容,KV 非常有效。开发人员喜欢它的优点:一个开箱即用的零配置全局存储。
但它并不能解决所有问题。它不是一个通用数据库,也不能替代大多数应用程序的关系系统。为了满足这些更广泛的状态管理需求,我们正在进行多项工作:
- 首先,我们正在努力使传统的 relational 数据库更容易获得,并且更易于在 Deno Deploy 中使用。
- 其次,我们认为 Deno KV 本身在简化计算和状态绑定方面做得还不够。因此,受到 Cloudflare 的 Durable Objects 等系统的启发,我们正在开发一个新项目来实现这种更深层次的集成,旨在将状态直接绑定到计算。
鉴于这些新方向,Deno KV 将继续保持 beta 状态。我们将继续解决当前版本的关键错误和安全问题。虽然 KV 对于其预期的目的很有用,但它的作用不是作为 Deno 中所有状态管理的核心或发展中的解决方案。我们保留在未来对 Deno KV 进行重大更改的权利,因为这些其他状态计划会成熟,并且我们的整体平台战略会不断发展。我们很高兴能尽快分享有关这些新的 pipeline 项目的更多信息。
Fresh
Fresh 仍然活跃且运行良好——它为我们构建的每个应用程序和网站提供支持。我们知道你们中的许多人一直在热切期待 Fresh 2,也许有些人对等待感到沮丧。我们听到了。我们可以更快地发布一些东西,但必须把基础知识做好,我们不想为了快速的营销宣传而牺牲质量。我们所有的网站都依赖 Fresh,因此其卓越性至关重要。我们刚刚撰写了一篇详细的文章,介绍了 Fresh 2 中即将进行的重大改进——快去阅读吧!稳定版本将于今年晚些时候发布。
Deno, the runtime platform
Deno 不再只是一个 runtime;它是一个用于构建和运行 JavaScript 系统的完整平台。以下是内置的内容:
- TypeScript 和 JSX 支持
- 细粒度权限和沙箱 以实现安全执行
- 完整的 Language Server Protocol (LSP)、VS Code extension 和
deno check
以进行类型检查 - 带有 LSP 驱动的 TypeScript 类型检查的 Jupyter notebook 集成
deno compile
生成独立的二进制文件- 强大的 Node/npm 兼容性,包括 workspace 支持
- 通过 内置 OpenTelemetry 实现一流的可观察性,提供开箱即用的结构化跟踪。这是一项必不可少的基础架构,而不是事后才想到的,正如有些人所嘲笑的那样。
deno fmt
用于自动格式化 JavaScript、TypeScript(甚至是在模板字符串中的 CSS 或 SQL)- 从根本上构建在 ES Modules 和 web 标准 之上
- 全局部署表面(通过 Deno Deploy)
- 具有开放治理的发布系统 (JSR)、不断增长的标准库 和出色的 workspace 支持
你可以使用单个工具链编写、运行、测试、部署和监控。我们一直在加强集成。更少的 flags,更好的默认值,更小的差距。各个部分比以往任何时候都更好地协同工作。
我们没有在与其他 runtime 争夺特性 parity,我们正在构建一个有凝聚力的系统。我们正在努力从根本上改进 JavaScript 开发。如果我们有错,那是因为我们在这个目标上走得太远了。但我认为没有人可以争辩说 Deno 没有为世界上默认的编程语言争取更好的世界。
我们为什么这样做
对于一大类问题,脚本语言是符合人体工程学的最终状态:工程时间是限制因素的业务逻辑。
Ruby、Python、Lua、Perl 和 JavaScript 都遵循这一思路。但 JavaScript 是在每个设备上分发的,具有标准机构、跨技术集团的独立实现以及庞大而充满活力的生态系统。我们认为,具有未来的脚本语言是 JavaScript(和 TypeScript)。它应该有一个与之匹配的平台,而不是 ad hoc 工具的拼凑。一个单一的、包含所有功能的系统。
正如 JavaScript 为你提供垃圾回收和内置数组一样,Deno 为你提供权限系统、web 服务器、可观察性、linting 和类型安全性——所有这些都是开箱即用的。你不需要将它们粘合在一起。Deno 就是胶水。
展望未来
我们没有在收缩,我们正在蓄势待发。
我们将继续提高整个平台的性能、兼容性和 polish。JSR 正在成熟。我们最近成立了一个开放治理委员会,并正在积极努力将 JSR 转变为一个独立的、社区驱动的基金会。
我们在 TC39 和 WinterTC (原 WinterCG) 的工作仍在继续。我们还积极挑战 Oracle 具有误导性的 JavaScript 商标。这些都是我们为改善和发展 JavaScript 生态系统所做的广泛努力的一部分。
我们正在基于从 Deploy 和 KV 中学到的一切来构建新产品,这些产品尚未发布。它们旨在简化持久的、分布式的应用程序。很快会有更多信息。
我们认识到,我们的沉默有时是不确定性的来源,我们致力于在推进这些令人兴奋的开发时改进我们的沟通。
感谢阅读。并感谢每一位使用 Deno 构建项目的人。
– Ry