跳到主要内容
Deno 2.4 发布,带来 deno bundle、字节/文本导入、OTel 稳定版等新特性
了解更多
A giant lemon

Fresh 的更新

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、更多路由、更多资源的项目,以及扩展 Fresh 各个方面的愿望,都推动着 Fresh 1 代码库的极限。添加新功能变得越来越困难,很明显我们需要一个更好的基础来推动 Fresh 的发展。

这是软件项目演进的正常部分;你尝试一种方法,看看哪些有效,哪些无效,然后在此基础上进行迭代。我们开始着手工作,并吸取了 Fresh 的所有经验教训,为 Fresh 2 构建了新的架构。

为何延迟?

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

Fresh 2 的初期开发进展非常顺利。然而,查看问题追踪器和我们在 Discord 频道中提出的问题后,我们清楚地发现大多数问题无法在 Fresh 本身中修复。它们需要在 Deno 中修复,因为它们是由底层技术(例如 http: 标识符和 Node 兼容性)引起的。为了实现我们对 Fresh 2 的雄心壮志,我们不得不退一步,确保这些基础部分是稳固的。

生态系统兼容性

我们一直希望在 Fresh 中直接且无缝地支持第三方 npm 包。为了真正实现这一点,首先增强 Deno 自身的核心方面变得至关重要。重心暂时转移到直接为 Deno 2 版本做出贡献,为 Fresh 2 的蓬勃发展奠定关键基础,尤其是在 Node 和 npm 兼容性方面。这项基础工作直接实现了 Fresh 2 中更广泛包的更流畅体验,我们也因此解决了许多相关的兼容性问题。然而,这项工作仍在进行中。

通过 JSR 和 Deno Deploy 简化

用户经常遇到的一个问题是代码中的 import maps 或重复依赖项。这是另一个通过解决底层技术能更好地解决的问题。在我们将 Fresh 迁移到 JSR 的过程中,我们专注于改进 JSR 的可用性,这反过来又简化了 Fresh 项目的依赖管理。

之后,我们将注意力转向了 Deno Deploy 的下一次迭代工作,其中将包括一个构建步骤(更多细节将在未来的博客文章中公布)。我们将 Fresh 和 Fresh 2 作为 Deno Deploy 下一版本的测试案例,旨在构建最佳的部署体验。尽管这些项目占据了我大部分的工程精力,但它们也为更好的 Fresh 奠定了基础。

Fresh 2 目前进展如何?

当这些基础项目全速推进时,我们确保将自己的项目切换到 Fresh 2 的 Alpha 版本。这为我们提供了充足的时间进行更多实战测试。

Fresh 2 已在 deno.com 和 Deno Deploy 的生产环境中运行,但我们仍在对插件系统、打包器集成和整体开发者体验进行最后的润色。Fresh 2.0 稳定版的发布目标是 2025 年第三季度末(可能在九月)。这个时间表使我们能够认真吸纳 Alpha 版本的社区反馈,并确保我们所承诺的高水平优化。随着我们临近并达到内部里程碑,我们将提供更精确的日期预估。

Fresh 2 带来了什么?

Fresh 2 使框架更具可扩展性、更快速且更易于使用。核心 API 已被简化,类似于您可能已经熟悉的其他框架(如 expresskoa)的 API。

此下一个主要版本将引入类似 Express/Hono 的 API、真正的异步组件以及用于创建和共享 Fresh 中间件的新插件系统。

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();

通过它,添加自定义中间件、路由或其他内容变得更加容易。中间件和处理程序的签名完全相同,因此您也不再需要为它们使用不同的类型。

// 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 转换。这显著加快了渲染速度。还有更多……

如何获取 Fresh 2 Alpha 版

Fresh 2.0 目前已作为 Alpha 版本发布。虽然这意味着在根据反馈迭代过程中可能仍存在一些不断演进的 API 或偶尔出现的粗糙之处,但我们对其目前的能力感到非常兴奋。事实上,我们已经在 deno.com 和 Deno Deploy 的生产环境中对其进行了实战测试!我们鼓励您在新项目或开发环境中使用它,在此阶段您的反馈对于我们迈向稳定版本至关重要。

为了获得 Fresh 2.0 Alpha 版的最佳体验,我们还建议您将其与 最新发布的 Deno 2.3 结合使用!此版本包含 改进的 deno compile本地 npm 包 等功能,这些功能将进一步简化您的 Fresh 开发工作流程。在此处了解有关 Deno 2.3 的更多信息。

从头开始

您可以在终端中运行 Fresh 的脚手架脚本,使用以下命令:

$ deno run -Ar jsr:@fresh/init@2.0.0-alpha.34
 🍋 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.34

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

这将自动应用 Fresh 2 中做出的大部分 API 更改,例如将 $fresh/server.ts 导入更新为 fresh

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

即将推出

Fresh 2 在 Deno 的工作中带来了极大的乐趣,我们很高兴能在今年晚些时候发布稳定版时,为您带来这个更简单、更具扩展性的 Fresh 版本。您对 Alpha 版本的反馈至关重要,因此请务必尝试并告诉我们您的想法!

🚨️ Deno 2.3 发布! 🚨️