A giant lemon

Fresh 框架更新进展

May 15, 2025

Fresh 是一个基于最新 Web 标准的简单 Web 框架,由我们构建并在 Deno 重度使用。我们已经预告了下一个版本很长时间了,但还没有发布。请放心,我们没有忘记它。事实上,Fresh 2 的预发布版本 正在 Deno 内部的生产环境中使用,包括我们的主网站和 Deno Deploy

每当我们在任何社交渠道上发布关于 Deno 的更新时,你们很多人都会问:Fresh 2 怎么样了?毕竟,我们已经宣布计划开始开发 Fresh 2 很久以前了,但一年后它仍然没有发布。所以这篇博文是关于我们目前进展的更新。

为什么需要 Fresh 2?

Fresh 的第一个版本最初是作为一种利用 Deno 中可用的最新 Web 技术构建网站的简单方法而创建的。它在 Deno 用户中迅速流行起来,以至于 Fresh 1.0 成为 当年 GitHub 上最受欢迎的前端项目之一。从那以后,我们推动了许多改进,例如变得更快、增加了新功能(如 Partials)以及大量的优化。

然而,随着 Fresh 项目需求的增长,我们遇到了新的挑战。具有更大的 islands、更多的 routes、更多的 assets 以及扩展 Fresh 各个方面的愿望的项目正在突破 Fresh 1 代码库的限制。添加新功能变得越来越困难,很明显我们需要一个更好的基础来推动 Fresh 的发展。

这是软件项目演变的正常过程;你尝试一种方法,看看哪些有效,哪些无效,然后从那里迭代。我们开始工作,并结合从 Fresh 中获得的所有经验,为 Fresh 2 构建了一个新的架构。

为什么会延误?

构建一个真正的下一代框架有时意味着首先加强底层基础。为了使 Fresh 2.0 比以往任何时候都更快、更可扩展、使用起来更令人愉快,我们投入了大量的精力来增强核心 Deno 平台和我们的 JavaScript 包注册表 JSR。虽然这项基础工作非常耗时,但对于我们现在带给 Fresh 2 的高级功能和稳定性至关重要。

在 Fresh 2 的初始开发过程中,事情进展得非常顺利。然而,查看 issue tracker 和在我们的 Discord 频道中提出的问题,很明显大多数问题无法在 Fresh 本身中修复。它们需要在 Deno 中修复,因为它们是由 http: specifiers 和 Node compatibility 等底层技术引起的。为了实现我们为 Fresh 2 制定的宏伟目标,我们不得不退一步,确保这些基础部分是健壮的。

生态系统兼容性

我们一直希望在 Fresh 中直接且无缝地支持第三方 npm packages。为了真正实现这一点,首先增强 Deno 本身的核心方面变得至关重要。我们暂时将重点转移到直接为 Deno 2 release 做出贡献,为 Fresh 2 的蓬勃发展构建关键的基础,特别是在 Node 和 npm compatibility 方面。这种基础工作直接使 Fresh 2 中更广泛的包的体验更加顺畅,因此我们能够解决许多相关的 compatibility issues。然而,这项工作仍在进行中。

通过 JSR 和 Deno Deploy 简化

用户经常遇到的一个问题是他们的代码中存在 import maps 或 duplicate dependencies。通过解决底层技术,可以更好地解决另一个问题。当我们迁移 FreshJSR 时,我们专注于 JSR 以提高其可用性,这反过来简化了 Fresh 项目的 dependency management。

之后,注意力转向了 Deno Deploy 下一次迭代的工作,其中包括一个构建步骤(有关此步骤的更多详细信息将在以后的博客文章中介绍)。我们使用 Fresh 和 Fresh 2 作为 Deno Deploy 下一个版本的测试用例,旨在构建最佳的 deployment experience。虽然这些项目占据了我大部分的工程努力,但它们也为更好的 Fresh 奠定了基础。

Fresh 2 现在的情况如何?

虽然这些基础项目的工作正在全面推进,但我们确保将我们自己的项目切换到 Fresh 2 的 alpha 版本。这给了我们充足的时间来对其进行更多的实战测试。

Fresh 2 已经在 deno.com 和 Deno Deploy 的生产环境中运行,但我们仍在对插件系统、bundler integration 和整体 developer experience 进行最后的润色。我们 Fresh 2.0 稳定版本的目标是 2025 年第三季度末(可能在 9 月)。这个时间表使我们能够认真地整合来自 alpha 版本的社区反馈,并确保我们致力于实现高水平的 polish。随着我们越来越接近并达到我们的内部里程碑,我们将提供更精确的日期估算。

Fresh 2 带来了什么?

Fresh 2 使该框架更具可扩展性、更快且更易于使用。核心 API 已被简化为类似于你可能已经从 expresskoa 等其他框架中了解的类似 API。

下一个主要版本将引入 Express/Hono-like APIs、真正的 async components 和一个新的插件系统,用于创建和共享 Fresh middleware。

const app = new App();
// Custom middlewares
app.use((ctx) => {
 console.log(`Here is a cool request: ${ctx.url}`);
 return ctx.next();
});
// Also can be branched on by HTTP method
app.get((ctx) => {
 return new Response("it works!");
});
// Finally, start the app
await app.listen();

使用这个可以更容易地添加 custom middlewares、routes 或其他东西。middlewares 和 handlers 的签名完全相同,因此您不再需要为它们使用不同的类型。

// Fresh 1.x middleware
const foo = (req: Request, ctx: FreshContext) => new Response("hello");
// Fresh 2.0 middleware
const foo = (ctx: FreshContext) => new Response("hello");

Fresh 2 还开箱即用地支持 Deno 中的 precompile JSX transform。这显着加快了渲染速度。还有更多……

如何获取 Fresh 2 alpha 版本

Fresh 2.0 目前以 alpha 版本的形式提供。虽然这意味着在我们根据反馈进行迭代时,可能仍然存在一些不断发展的 APIs 或偶尔的粗糙边缘,但我们对其当前的功能感到非常兴奋。事实上,我们已经在 deno.com 和 Deno Deploy 的生产环境中对其进行了实战测试!我们鼓励你尝试将其用于新项目或开发环境,并且你在此阶段的反馈非常宝贵,因为我们正在朝着稳定版本迈进。

为了获得 Fresh 2.0 alpha 的最佳体验,我们还建议将其与 新发布的 Deno 2.3! 一起使用。此版本包括 改进的 deno compile本地 npm packages 等功能,这些功能进一步简化了你的 Fresh 开发 workflow。 在此处了解有关 Deno 2.3 的更多信息。

从头开始

你可以使用以下命令在终端中运行 Fresh 的 scaffolding script:

$ deno run -Ar jsr:@fresh/init@2.0.0-alpha.30
 🍋 Fresh: The next-gen web framework.
Project Name: fresh-project
Set up Tailwind CSS for styling? [y/N] y
Do you use VS Code? [y/N] y
Project initialized!
Enter your project directory using cd fresh-project.
Run deno task start to start the project. CTRL-C to stop.
Stuck? Join our Discord https://discord.gg/deno

进入你新创建的 Fresh 项目,然后运行 deno task dev 并将你的浏览器指向 localhost:8000

New Fresh project

升级现有的 Fresh 项目

如果你已经有现有的 Fresh 项目,则可以从命令行升级到 Fresh 2.0.0-alpha.30:

$ deno run -Ar jsr:@fresh/update@2.0.0-alpha.30

这将自动应用 Fresh 2 中进行的大多数 API 更改,例如将 $fresh/server.ts imports 更新为 fresh

有关将现有 Fresh 项目迁移到 Fresh 2 的更多详细信息,请 查看我们的 migration guide。

即将到来

在 Deno 中使用 Fresh 2 一直是一种乐趣,并且当我们今年晚些时候接近稳定版本时,我们很高兴能为你带来这个更简单、更可扩展的 Fresh 版本。你对 alpha 版本的反馈至关重要,因此请尝试一下,让我们知道你的想法!

🚨️Deno 2.3 发布! 🚨️