国外超火的前端框架:Astro 5.0 正式发布!

Astro 5.0 带来了全新的 内容层 (Content Layer)服务岛 (Server Islands) 功能,实现了从任意来源加载内容的能力,并将静态缓存内容与动态个性化内容完美结合,进一步提升开发效率和网站性能。

什么是 Astro?

Astro 是专注于构建内容驱动型网站(如博客、营销和电商)的现代 Web 框架,以快速加载和优秀的 SEO 表现为核心优势。


主要更新内容

1. 内容层 (Content Layer)

Astro 5.0 的内容层提供了一个灵活且可插拔的方式来管理内容,通过统一的类型安全 API,无论内容来源于 Markdown 文件、CMS、REST API 还是资源管理系统(如 Cloudinary),都可轻松加载并在项目中使用。

  • 亮点功能

    • 支持从磁盘、本地文件或任意 API 动态加载内容。
    • 使用第三方加载器(如 Storyblok、Cloudinary)直接集成内容。
    • 内容集合构建速度提升,Markdown 页面快至 5 倍,MDX 提升 2 倍。
// src/content.config.ts
import { defineCollection, z } from 'astro:content';
import { glob } from 'astro/loaders';
import { notionLoader } from "notion-astro-loader";

const blog = defineCollection({
  // Load data from Markdown files on disk
  loader: glob({ pattern: "**/*.md", base: "./src/data/blog" }),
  schema: z.object({ /* optionally define a schema for type-safe data */  }),
});

const database = defineCollection({
  // Automatically fetch content in one line with a loader
  loader: notionLoader({ /* ... */ })
});

const countries = defineCollection({
  // Load data from anywhere!
  loader: () => fetch('https://api.example.com/countries').then(res => res.json()),
});

export const collections = { blog, database, countries }

2. 服务岛 (Server Islands)

Astro 的服务岛扩展了静态与动态结合的页面架构:

  • 支持缓存静态内容,同时加载个性化动态内容。
  • 提供独立缓存和优化加载策略,增强用户体验。
  • 自动加密服务岛的属性,提高隐私安全。

3. 简化的预渲染模式

Astro 5.0 合并了混合模式和静态模式,默认支持静态输出,并在需要时动态切换到服务器渲染模式,无需额外配置。

4. 类型安全的环境变量 (astro:env)

全新模块支持:

  • 定义客户端或服务端使用的环境变量。
  • 指定变量为秘密或可选,并通过类型定义确保安全和正确性。
import { STRIPE_API_KEY } from 'astro:env/server';

5. Vite 6 集成

Astro 5.0 是首批搭载 Vite 6 的框架之一,提供更接近生产环境的开发体验。详情参考此前发布

6. 实验性功能

  • 响应式图片裁剪与布局支持,提升图片加载性能。
// astro.config.mjs
import { defineConfig } from "astro/config";

export default defineConfig({
  experimental: {
    responsiveImages: true,
    svg: true,
  }
});
import logo from "../logo.png";
---

<Image src={logo} fit="cover" width={200} height={200} />
---
import { Image } from "astro:assets"
import rocket from "./rocket.jpg"
---

<Image src={rocket} width={800} height={600} layout="responsive" />
  • 原生支持 SVG 组件,轻松自定义尺寸、填充和属性。
---
import Logo from '../assets/logo.svg'
---

<!-- Pass width and height to override default size -->
<Logo width={100} height={100} fill="blue" />

快速开始

  • 新项目:运行 npm create astro@latest

  • 升级旧项目:

    • 推荐:npx @astrojs/upgrade
    • 手动:npm install astro