图像
Astro 为你提供了多种在网站上使用图像的方法,无论它们是本地存储在你的项目内,还是链接到外部 URL,或者在 CMS 或 CDN 中管理的!
<Image />
和 <Picture />
组件的完整 API 参考。
在哪里存储图像
段落标题 在哪里存储图像src/
vs public/
段落标题 src/ vs public/我们建议尽可能将本地图像保存在 src/
中,以便 Astro 可以对其进行转换、优化和打包。/public
目录中的文件始终按原样服务或复制到构建文件夹中,不进行任何处理。
你在 src/
中存储的本地图像可以被项目中的所有文件使用:.astro
、.md
、.mdx
、.mdoc
和其他 UI 框架。图像可以存储在任何文件夹中,包括与你的内容一起。
如果你想要避免对图像做任何处理或者想要直接公开链接到图像,请将图像存储在 public/
文件夹中。
远程图像
段落标题 远程图像你还可以选择将图像远程存储在 内容管理系统(CMS) 或 数字资产管理(DAM) 平台中。 Astro 可以使用 API 远程获取数据,或者从完整 URL 路径显示图像。
在处理外部来源时,为了提供额外的保护,只有在配置中指定的 授权图像源 才会被 Astro 的图像组件和辅助函数处理(例如优化、转换)。来自其他来源的远程图像将不经处理地显示。
.astro
文件中的图像
段落标题 .astro 文件中的图像在 .astro
文件中,必须从其相对路径导入本地图像。此导入为你的图像提供 src
值。
远程和 public/
中的图像不需要导入,而是需要为 src
提供 URL(站点上的完整路径或相对路径)。
导入并使用 Astro 原生的 <Image />
和 <Picture />
组件来优化图像。Astro 语法也支持 直接编写 HTML <img>
标签,这将跳过图像处理。
<Image />
和 <Picture />
组件的完整 API 参考。
使用 <Image />
组件显示优化后的图像
段落标题 使用 <Image /> 组件显示优化后的图像使用内置的 <Image />
Astro 组件显示以下内容的优化版本:
-
位于
src/
文件夹中的本地图像 -
来自授权来源的 配置的远程图像
<Image />
可以转换本地或授权的远程图像的尺寸、文件类型和质量,以便控制显示的图像。生成的 <img>
标签包括 alt
、loading
和 decoding
属性,并推断图像尺寸以避免累积布局偏移(CLS)。
累积布局偏移 Cumulative Layout Shift (CLS) 是一种用于测量页面加载过程中内容移动量的核心 Web 指标。<Image />
组件通过自动为你的图像设置正确的 width
和 height
来优化 CLS。
<Image />
组件接受 多个组件属性 以及 HTML <img>
标签接受的任何属性。
以下示例为图像组件提供了一个 class
,该 class
将应用于最终的 <img>
元素。
你还可以对 public/
文件夹中的图像或未在项目中特别配置的远程图像使用 <Image />
组件,即使这些图像不会被优化或处理。其生成的图像与使用 HTML <img>
相同。
但是,对所有图像使用 Image 组件可以提供连贯的创作体验,并且即使对于未优化的图像也可以防止累积布局偏移 (CLS)。
使用 <Picture />
组件创建响应式图像
段落标题 使用 <Picture /> 组件创建响应式图像
Added in:
astro@3.3.0
使用内置的 <Picture />
Astro 组件来显示具有多种格式和/或尺寸的响应式图像。
<Picture />
组件属性 的详细信息,请参阅 astro:assets
参考。
使用 HTML <img>
标签显示未处理的图像
段落标题 使用 HTML <img> 标签显示未处理的图像Astro 模板语法 还支持直接编写 <img>
标签,来完全控制其最终输出。这些图像将不会被处理和优化。它接受所有 HTML <img>
标签属性,唯一必需的属性是 src
。
本地图像必须从现有 .astro
文件的相对路径导入,或者你可以配置和使用 导入别名。接着,你就可以访问图像的 src
和其他属性以在 <img>
标签中使用了。
导入的图像资源与以下签名匹配:
以下示例使用图像自身的 height
和 width
属性来避免累积布局偏移 (CLS) 从而改进核心页面指标:
public/
中的图像
段落标题 public/ 中的图像对于位于 public/
中的图像,请使用图像相对于 public 文件夹的文件路径作为 src
值:
远程图像
段落标题 远程图像对于远程图像,请使用图像的完整 URL作为 src
值:
选择 <Image />
还是 <img>
段落标题 选择 <Image /> 还是 <img><Image />
组件会优化图像,并根据原始宽高比推断宽度和高度(对于它可以处理的图像),以避免 CLS。这是尽可能在 .astro
文件中使用图像的首选方式。
当你不能使用 <Image />
组件时,请使用 HTML <img>
元素,例如:
- 不支持的图像格式
- 当你不想让 Astro 优化你的图像时
- 为了在客户端动态访问和更改
src
属性
设置默认值
段落标题 设置默认值目前,没有办法为所有 <Image />
或者 <Picture/>
组件指定默认值。应该在每个单独的组件上设置必需的属性。
作为替代方案,你可以在另一个 Astro 组件中封装这些组件以便复用。例如,你可以为博客文章图像创建一个组件,该组件接收 attributes 作为参数并对每个图像应用一样的样式:
授权远程图像
段落标题 授权远程图像你可以使用 image.domains
和 image.remotePatterns
配置授权图像源 URL 域和模式列表,以进行图像优化。这个配置是一个额外的安全层,用于在显示来自外部源的图像时保护你的站点。
来自其他来源的远程图像不会被优化,但是使用 <Image />
组件可以防止累积布局移位(CLS)。
例如,以下配置将只允许来自 astro.build
的远程图像进行优化:
以下配置将只允许来自 HTTPS 主机的远程图像:
使用 CMS 或 CDN 中的图像
段落标题 使用 CMS 或 CDN 中的图像图像 CDN 与 所有 Astro 图像选项 兼容。在 <Image />
组件、<img>
标签或 Markdown 表示法中,使用图像的完整 URL 作为 src
属性。对于远程图像的图像优化,还需要 配置授权域或 URL 模式。
或者,CDN 可以提供自己的 SDK,以便更轻松地集成到 Astro 项目中。例如,Cloudinary 支持 Astro SDK,它允许你轻松地使用其 CldImage
组件来放入图像;又或者是 Node.js SDK,它可以生成 URL 以与 Node.js 环境中的 <img>
标签一起使用。
<Image />
和 <Picture />
组件的完整 API 参考。
Markdown 文件中的图像
段落标题 Markdown 文件中的图像在 .md
文件中使用标准的 Markdown ![alt](src)
语法。这个语法可以与 Astro 的 图像服务 API 一起使用,来优化你在 src/
目录下的本地图像。远程图像和 public/
目录下的本地图像不会被优化。
在 .md
文件中,<img>
标签不支持本地图像,并且 <Image />
和 <Picture />
组件也不可用。
如果你需要对图像属性做更多的控制,我们建议使用 Astro 的 MDX 集成 来添加对 .mdx
文件格式的支持。MDX 允许向 Markdown 添加组件,并且还提供其他 MDX 中可用的图像选项。
MDX 文件中的图像
段落标题 MDX 文件中的图像你可以通过导入组件和图像在你的 .mdx
文件中使用 Astro 的 <Image />
和 <Picture />
组件。使用它们就像 在 .astro
文件中使用 一样。还支持使用 JSX <img />
标签来展示不需要处理的图像,导入图像的方式与 HTML <img>
标签相同。
此外,还支持 标准的 Markdown ![alt](src)
语法,无需导入。
<Image />
和 <Picture />
组件的完整 API 参考。
内容集合中的图像
段落标题 内容集合中的图像内容集合中的图像将会按照你所使用的文件类型,以与 Markdown 和 MDX 中相同的方式处理。
此外,你还可以在 frontmatter 中为内容集合条目声明一个关联图像,例如博客文章的封面图像,使用其相对于当前文件夹的路径:
内容集合 schema 中的 image
助手允许你使用 Zod 验证图像元数据。
图像将被导入并转换为元数据,允许你将其作为 src
传递给 <Image/>
、<img>
或 getImage()
。
下面的示例显示了一个博客索引页面,该页面从上面的模式中呈现了每篇博客文章的封面照片和标题:
框架组件中的图像
段落标题 框架组件中的图像与任何其他 Astro 组件一样,<Image />
组件在 UI 框架组件内不可用。
但是,你可以将 <Image />
生成的静态内容作为子项传递给 .astro
文件内的框架组件,或使用 命名 <slot/>
:
你还可以使用框架自己的图像语法来渲染图像(例如,JSX 中的 <img />
,Svelte 中的 <img>
)。
必须首先导入本地图像 才能访问其图像属性,例如 src
。
传递 Image 组件
段落标题 传递 Image 组件<Image />
组件,就像任何其他 Astro 组件一样,对 UI 框架组件不可用。
但是,你可以将 <Image />
生成的静态内容作为子组件传递给 .astro
文件中的框架组件,或者使用 命名的 <slot/>
。
使用 getImage()
生成图像
段落标题 使用 getImage() 生成图像getImage()
函数旨在生成要在其他地方使用的图像,而不是直接在 HTML 中使用,例如在 API 路由 中。当你需要 <Picture>
和 <Image>
组件当前不支持的选项时,你可以使用 getImage()
函数创建你自己的自定义 <Image />
组件。
getImage()
参考 以了解更多信息。
替代文本
段落标题 替代文本不是所有用户都能以相同的方式看到图像,因此在使用图像时,无障碍性尤为重要。使用 alt
属性为图像提供 描述性的 alt 文本。
这个属性对于 <Image />
和 <Picture />
组件都是必需的。如果没有提供 alt 文本,将提供一个有用的错误消息,提醒你包含 alt
属性。
如果图像仅仅是装饰性的(即不会对页面的理解有所贡献),请设置 alt=""
以便屏幕阅读器和其他辅助技术知道忽略该图像。
默认图像服务
段落标题 默认图像服务Sharp 是 astro:assets
使用的默认图像服务。你可以使用 image.service
选项进一步配置图像服务。
当使用像 pnpm
这样的严格包管理器时,即使 Sharp 已经是 Astro 的依赖项,你也可能需要手动安装 Sharp 到你的项目中:
配置 Squoosh
段落标题 配置 Squoosh如果你想使用 Squoosh 来转换你的图像,请使用以下配置更新你的配置:
配置 no-op 透传服务
段落标题 配置 no-op 透传服务如果你的 server
或 hybrid
模式适配器不支持 Astro 内置的 Squoosh 和 Sharp 图片优化(如 Deno、Cloudflare),你可以配置一个 no-op 图像服务来使你可以使用 <Image />
和 <Picture />
组件。注意 Astro 在这些环境中不会执行任何图像转换和处理。不过你依旧可以享受使用 astro:assets
的其他好处,比如没有累积布局移位(CLS)、强制执行的 alt
属性和一致的创作体验。
配置 passthroughImageService()
来避免 Squoosh 和 Sharp 图像处理:
社区集成
段落标题 社区集成这里有几个第三方 社区图像集成,用于优化和处理 Astro 项目中的图像。
Learn