Astro 是一个开源的 JavaScript 框架,用于在流行的 UI 框架(如 React、Preact、Vue 或 Svelte)之上生成 Web 应用。Astro 的页面由多个独立的组件组成。为了提高加载速度,Astro 会在服务端对页面进行预渲染,并剥离所有 JavaScript,除非将某个组件标记为交互式,此时 Astro 将发送必要的最小量 JavaScript 以实现交互功能。

通过这种策略,Astro 页面加载速度快,因为在首次渲染时不需要执行任何 JavaScript。在注水的过程中,Astro 会将 JavaScript “注入”到组件中,使它们变成动态的。

Astro 最初的设计并非与 React 或 Vue 等竞争,而是为了支持互操作性。简而言之,就是可以在 Astro 中使用喜欢的工具!它提供了对 React、Vue、Svelte 和 Tailwind CSS 等前端工具的一流支持。

然而,Astro 真正的亮点是名为岛屿的前端架构范式转变。Astro 的岛屿架构能够提高应用的速度,它将 UI 拆分为更小的、隔离的组件,并在静态页面中部分启动交互式组件,这是一个大胆的创新。

现在,Astro 已经发展成一个现代 Web 框架,可用于构建快速的多页面应用、动态服务器端点和注重内容性能的网站。尽管保留了简单性和核心功能,如服务器端点、内容集合、视图过渡以及出色的开发者体验,但 Astro 正不断演进,成为一个功能强大的现代 Web 应用程序框架。

Astro 的核心是其岛屿架构。那么 Astro 中的岛屿是如何运作的呢?这就不得不说它的岛屿架构和部分水合了。我们知道,客户端和服务端是向用户提供应用的两个主要参与者。下面来看一个在客户端上重新水合的服务端渲染的应用的例子。服务端渲染简化的过程如下:在服务端渲染应用在客户端上重新水合整个应用这是描述部分水合作用的简单方法。我们没有对整个应用进行水合处理,而是专注于应用的较小交互部分并独立地对这些部分进行水合处理:Astro 岛屿就是嵌入静态HTML页面中的交互式UI组件。一个页面上可以存在多个岛。每个岛都是通过独立的部分水合方式进行渲染。也就是说,每个岛都是独立水合的。那这么做有什么好处呢?通过利用岛屿,Astro 应用可以具有出色的初始加载时间,而不会受到 JavaScript 的限制。大部分站点保持静态状态,只有在初始页面加载之后需要时才会对交互部分或岛进行水合。

Astro 关键功能上面介绍了Astro 的岛屿架构和部分水合,下面来看看 Astro 的核心功能,以更有效的使用它。组件Astro 应用的最小单位是组件。组件构成了每个 Astro 应用的基础:Astro 组件文件都以 .astro 结尾。与大多数其他前端框架类似,组件内的抽象程度由开发者自己决定。例如,组件可以是 UI 的一小部分可重用的组件,例如页眉或页脚,或者组件可以足够大以构成整个页面或布局。来看看下面的 Hello World Astro 组件:可以看到,Astro 包含两个部分:组件脚本和组件模板---name组件模板就是定义组件 HTML 的地方。如果组件需要向浏览器渲染一些 UI 元素或 HTML,可以在此处定义它。在上面的例子中,定义了以下内容:Astro 组件模板决定了组件的 HTML 输出并支持纯 HTML!不过,Astro 组件模板语法是 HTML 的超集。它添加了强大的插值功能,因此可以充分利用 JavaScript 和 TypeScript 来编写组件模板。页面和路由Astro 应用的入口点是页面,它利用基于文件的路由方式来管理页面。假设正在构建一个具有两个不同路由的 Web 应用:index.html 和 about.html,那该如何表示呢?

Astro 是一个多页面 Web 框架,其项目结构如下:

```

Astro 项目的 src/pages/ 子目录中包含每个页面对应的文件。在这个例子中,有两个页面:`src/pages/index.astro` 和 `src/pages/about.astro`。

在构建应用时,可以通过运行类似 `npm build` 的简单命令来完成构建。这将把 `index.astro` 和 `about.astro` 文件分别构建成应用中的 `index.html` 和 `about.html` 文件。

要尝试使用 Astro,可以按照以下步骤操作:

1. 通过运行 `npm create astro@latest` 命令创建一个新的 Astro 项目。

2. 按照终端中的提示设置新项目。

3. 使用 `astro dev` 命令启动应用。

4. 在代码编辑器中打开项目。

5. 查看 `src/pages` 目录并创建两个新页面:`index.astro` 和 `about.astro`。

6. 通过 `astro build` 命令构建应用。

7. 查看构建输出并观察两个单独的 HTML 文件——每个路径一个。

除了使用 .astro 组件作为页面外,Astro 还支持以下方式构建页面:

- Markdown 和 HTML 文件

- 已安装 MDX 集成的 MDX 文件

- JavaScript 或 TypeScript 作为静态文件或 API 端点

- 动态路由

在 Astro 中,一个页面可以处理多个路由。页面可以在文件名中指定动态路由参数,从而生成多个匹配的页面。例如,构建一个博客应用,其中每篇博客都有自己的路由,可以使用以下方式表示该页面:

注意,组件文件名中的方括号:`[blog].astro`。在静态模式下,所有路由都必须在构建时确定。因此,动态路由必须导出 `getStaticPaths()` 方法,该方法返回具有 `params` 属性的对象数组。这告诉 Astro 在构建时生成哪些页面。

例如:当构建此应用时,`src/pages/blogs/[blog.astro]` 将生成三个博客页面:

```

/blogs/how-to-learn-astro.html

/blogs/how-to-learn-ai.html

/blogs/how-to-learn-astro-ai.html

```

Astro 支持服务端渲染,即在运行时生成路由,而不是在构建时生成。这种情况下,不需要指定 getStaticPaths() 方法,页面可以简化。在实践中,使用 SSR 时,博客参数很可能是博客的唯一标识符,例如 ID。当用户尝试查看 /blogs/id 时,可以通过 Astro.params 获取 id 并在服务端获取所需的博客内容。

除了正常的组件和特殊的组件“页面”,Astro 还支持另一种类型的组件:布局。大多数 Web 应用都包含一些可重用的结构,这些结构为页面提供了结构,例如页眉、页脚和侧面导航元素。这些可以被抽象为可重用的 Astro 组件,称为布局。可以通过在 src/layouts 目录中添加 Astro 组件来创建布局组件。在布局组件中,可以抽象公共组件并在任意应用页面中重用它们。

下面是一个示例布局组件:可以在任何页面中使用此组件:注意这里是如何使用布局组件的。在页面组件的 HTML 部分中,渲染了布局组件,并将页面的元素作为子元素传递给了

组件。可以通过在
组件中添加一个 来渲染这个内容。简而言之,每个传递给
布局组件的子元素都将被渲染到
中的 中。还可以通过提供 props 来提高 Astro 组件的可重用性。例如:上面的例子就是在布局组件渲染时将不同的标题传递给它。

Astro 通过提供多样化的模板,为开发者快速启动项目并编写更少的代码提供了极大的便利。中间件在帮助 Astro 转变为成熟的 Web 框架的过程中发挥了重要作用。大多数全栈 Web 框架都有中间件实现,例如 NestJS。中间件位于客户端请求和服务器应用逻辑的其余部分之间,起到中心化逻辑的作用,例如身份验证、日志记录、特性标志等。Astro 也提供了中间件。

以下是一个基本中间件结构:

Astro 是一个用于构建大型内容驱动应用程序的框架。为了类型安全,可以从 Astro 包中导入 MiddlewareResponseHandler 类型以及 defineMiddleware 实用程序。然后,通过 defineMiddleware 实用程序定义中间件变量:

```typescript

import { Astro, defineMiddleware } from '@astrojs/core';

// 定义中间件变量

const isAuthenticated = (_) => true;

// 将中间件应用于请求处理程序

const handler = defineMiddleware(isAuthenticated, Astro.RequestHandler);

app.use('/api', handler);

```

最后,导出一个指向 middleware 的 onRequest 函数。Astro 还提供了 View Transitions API,用于创建清晰且炫酷的页面过渡。Astro 是第一个将 View Transitions 引入主流的重要 Web 框架。

## Astro 使用场景

### Astro 的核心功能

要开始在 Astro 项目中使用 View Transitions API,只需导入 ViewTransitions。然后,在希望提供页面转换的源页面和目标页面的头部渲染组件:ViewTransitions 负责将客户端脚本添加到原始页面,以拦截对其他页面的点击。

### Astro 常见用例

Astro 的核心功能是构建一个低延迟的内容驱动网站。下面是一些常见的使用案例。如果你需要开发这样的网站,Astro 就是很好的选择。

#### 博客、作品集

如果你的个人博客或作品集是一个静态网站,那么使用 Astro 是一个明智的选择。除了提高网站性能外,Astro 的组件化架构还允许你在适当的位置轻松地添加动态功能。此外,你可以集成 Markdown 以获得更好的创作体验,并利用 Astro 的服务端渲染来保持 SEO 友好。简而言之,如果要在 2024 年构建静态网站,Astro 是你的最佳选择。

#### 文档站点

文档站点通常具有大量内容,Astro 在这方面表现出色。Astro 还有一个名为 Starlight 的专用文档框架,可以快速启动和运行。如果需要一个干净、直观的文档网站,可以快速加载以提供所需的信息,那么 Astro 是一个不错的选择。

#### Web 应用

Astro 不仅限于静态网站。理论上,它还可以为动态 Web 应用提供动力。然而,在这方面需要小心。尽管可以轻松地使用 React、Vue、Svelte 等选项开发完整的 Web 应用,但只有在确实有意义的情况下才应考虑使用 Astro。对于是否在全栈应用中使用 Astro,应该考虑:能否利用 islands 来提升应用的性能?换句话说,是否想要构建一个大部分是静态的、具有按需加载的 islands 的多页面应用?如果答案是肯定的,可以尝试使用 Astro。

与 Next.js(一个现代 JavaScript 框架,旨在创建高性能的应用)相比,Astro 在某些方面有所不同。Astro 最初是作为静态站点生成器开发的,而 Next.js 最初是作为构建具有状态管理功能的丰富应用的框架。尽管 Astro 仍然是静态网站的绝佳选择,但它也努力缩小差距,以创建更多有状态的应用。然而,即使可以在 Astro

Astro是一个适用于静态网站的高性能框架。如果你的网站大部分内容是静态的,并且你希望优先考虑性能,那么使用Astro可能是一个不错的选择。它可以帮助你快速构建和优化静态网站,提供出色的加载速度和响应能力。

然而,如果你正在构建一个功能丰富、具有状态的应用,那么Next可能是更好的选择。Next是一个适用于React应用的轻量级框架,它提供了丰富的功能和工具,帮助你构建复杂的单页应用和其他Web应用程序。它的目标是让你能够专注于编写代码和实现业务逻辑,而不必担心底层框架的复杂性。

需要注意的是,静态网站和有状态应用之间的区别并不总是非常明显。实际上,很多现代Web应用程序都采用了混合架构,既包含了静态内容,又包含了大量的动态数据和状态管理。因此,在选择合适的框架时,你需要根据你的实际用例和业务需求来进行权衡。

总之,框架的选择取决于具体的用例和业务要求。对于静态网站来说,Astro可能是一个很好的选择;而对于具有状态的应用来说,Next可能更适合。最终,你需要根据自己的项目需求来做出决策。