- 起步
- 核心概念
- 教程
- 基础内容
- 内置功能
- 集成
- 操作指南
- 使用指南
- 配置
- 参考
- 社区资源
- 其他
- 为文档做出贡献
- 手动安装 Astro
- 升级到 Astro v4
- 升级到 Astro v3
- 升级到 Astro v2
- Legacy v0.x Upgrade Guide
- 从 Create React App(CRA)迁移
- 关于本教程
- 第一单元:前期准备
- 准备开发环境
- 创建你的第一个 Astro 项目
- 你的第一行 Astro 代码
- 创建在线代码仓库
- 将你的网站部署到网络
- 第二单元:页面
- 创建你的第一个 Astro 页面
- 编写你的第一篇 Markdown 博客文章
- 添加「关于你」的动态内容
- 给你的「关于」页面添加样式
- 应用全局样式
- 第三单元:组件
- 创建一个可重复使用的导航组件
- 创建社交媒体 footer
- 自己动手搭建导航 Header
- 编写你的第一个浏览器脚本
- 第四单元:布局
- 编写你的第一个布局
- 创建并传递数据到博客布局
- 布局结合,两全其美
- 第五单元 - Astro API
- 创建文章存档页
- 生成标签页面
- 编写标签索引页面
- 添加 RSS 订阅源
- 第六单元 - Astro 群岛
- 搭建你的第一个 Astro 岛屿
- 回到干燥的陆地。让你的博客从白天到黑夜,无需岛屿!
- 恭喜你!
- @astrojs/mdx
- 添加阅读时间
- 创建开发者工具栏应用
- @astrojs/alpinejs
- @astrojs/lit
- @astrojs/preact
- @astrojs/react
- @astrojs/solid-js
- @astrojs/svelte
- @astrojs/vue
- @astrojs/cloudflare
- @astrojs/netlify
- @astrojs/node
- @astrojs/vercel
- @astrojs/db
- @astrojs/markdoc
- @astrojs/partytown
- @astrojs/sitemap
- @astrojs/tailwind
- 使用流式处理来提升页面性能
- 从 Gatsby 迁移
- 从 Next.js 迁移
- 从 NuxtJS 迁移
- 从 Docusaurus 迁移到 Astro
- 从 Eleventy 迁移到 Astro
- 从 GitBook 迁移到 Astro
- 从Gridsome迁移到Astro
- 从 Hugo 迁移
- 从 Jekyll 迁移
- 从 Pelican 迁移
- 从 SvelteKit 迁移
- 从VuePress迁移
- 从 WordPress 迁移
- 状态共享
- Storyblok 与 Astro
- Contentful 与 Astro
- ButterCMS & Astro
- Builder.io & Astro
- Cosmic 与 Astro
- DatoCMS 与 Astro
- Front Matter CMS 与 Astro
- Ghost & Astro
- Hashnode & Astro
- Hygraph 与 Astro
- Keystatic & Astro
- Kontent.ai 与 Astro
- 无头模式的 Statamic 与 Astro
- Strapi 与 Astro
- Tina CMS 与 Astro
- Umbraco & Astro
- 无头(headless)模式的 WordPress 与 Astro
- ApostropheCMS 与 Astro
- Caisy & Astro
- CloudCannon与Astro
- Crystallize 与 Astro
- Decap CMS 与 Astro
- Directus 与 Astro
- KeystoneJS 与 Astro
- microCMS & Astro
- Payload CMS 与 Astro
- Prepr CMS & Astro
- Prismic & Astro
- Sanity & Astro
- Sitecore 体验管理器 & Astro
- Spinal & Astro
- 创作内容
- Firebase 与 Astro
- Supabase 与 Astro
- Turso 和 Astro
- Xata 与 Astro
- Appwrite & Astro
- 部署你的 Astro 站点至 Netlify
- 部署你的 Astro 站点至 Vercel
- 如何将你的 Astro 网站部署到 Deno
- 部署你的 Astro 站点至 GitHub Pages
- 部署你的 Astro 站点至 GitLab Pages
- 部署你的 Astro 站点至 Cloudflare Pages
- 将你的 Astro 网站部署到 AWS
- 将你的 Astro 网站通过 Flightcontrol 部署到 AWS
- 将你的 Astro 网站通过 SST 部署到 AWS
- 将你的 Astro 网站部署至 Google Cloud
- 部署你的 Astro 站点至 Google Firebase 托管
- 将你的 Astro 网站部署到 Heroku
- 将你的 Astro 网站部署到 Microsoft Azure
- 部署你的 Astro 站点至 Buddy
- 将你的 Astro 网站部署到 Edgio
- 将你的 Astro 站点部署到 Fly.io
- 将你的 Astro 网站部署到 Render
- 将你的 Astro 网站部署到 Stormkit
- 将你的 Astro 网站部署到 Surge
- 通过 Cleavr 部署你的 Astro 网站
- 将你的 Astro 站点部署到 Kinsta 应用托管
- 将你的 Astro 网站部署到 Space
- 将你的 Astro 站点部署到 Zeabur
- 将你的 Astro 网站部署到 Zerops
- 添加 RSS 摘要
- 安装一个 Vite 或 Rollup 插件
- 构建自定义图像组件
- 使用 API 路由构建表单
- 在 Astro 页面中构建 HTML 表单
- 在 Astro 中使用 Bun
- 调用服务器端点
- 校验验证码
- 用 Docker 来构建你的 Astro 网站
- 动态导入图片
- 为链接添加图标
- 添加 i18n 功能
- 添加最后修改时间
- 在 Astro 组件中共享状态
- 使用 Tailwind Typography 美化渲染后的 Markdown
- Unknown compiler error.
- Astro.redirect is not available in static mode.
- Astro.clientAddress is not available in current adapter.
- Astro.clientAddress cannot be used inside prerendered routes.
- Astro.clientAddress is not available in static mode.
- No static path found for requested path.
- Invalid type returned by Astro page.
- Missing value for client:media directive.
- No matching renderer found.
- No client entrypoint specified in renderer.
- Missing hint on client:only directive.
- Invalid value returned by a getStaticPaths path.
- Invalid entry inside getStaticPath's return value
- Invalid value returned by getStaticPaths.
- getStaticPaths RSS helper is not available anymore.
- Missing params property on getStaticPaths route.
- Invalid value for getStaticPaths route parameter.
- getStaticPaths() function required for dynamic routes.
- Invalid slot name.
- Cannot use Server-side Rendering without an adapter.
- No import found for component.
- Invalid prerender export.
- Invalid component arguments.
- Page number param not found.
- Image missing required "alt" property.
- Error while loading image service.
- Missing image dimensions
- Failed to retrieve remote image dimensions
- Unsupported image format
- Unsupported image conversion
- Prerendered dynamic endpoint has path collision.
- Expected src to be an image.
- Expected image options.
- Cannot set both densities and widths
- Image not found.
- Could not process image metadata.
- Image not found.
- Could not transform image.
- Unable to set response.
- The middleware didn't return a Response.
- The middleware returned something that is not a Response object.
- The endpoint did not return a Response.
- Value assigned to locals is not accepted.
- Astro.response.headers must not be reassigned.
- Can't load the middleware.
- Local images must be imported.
- Astro.glob() used outside of an Astro file.
- Astro.glob() did not match any files.
- A redirect must be given a location with the Location header.
- Invalid dynamic route.
- Could not find Sharp.
- Unknown Vite Error.
- Could not import file.
- Invalid glob pattern.
- Astro couldn't find the correct page to render
- The provided locale does not exist.
- Index page not found.
- You can't use the current function with the current strategy
- Prerendered routes aren't supported when internationalization domains are enabled.
- 启用了手动国际化路由但没有提供中间件。
- Astro can't render the route.
- Unhandled rejection
- i18n Not Enabled
- Route not found.
- Unknown CSS Error
- CSS Syntax Error
- Unknown Markdown Error.
- Failed to parse Markdown frontmatter.
- Invalid frontmatter injection.
- MDX integration missing.
- Unknown configuration error.
- Specified configuration file not found.
- Legacy configuration detected.
- Unknown CLI Error.
- Failed to generate content types.
- Unknown Content Collection Error.
- Content entry frontmatter does not match schema.
- Invalid content entry slug.
- Content Schema should not contain slug.
- Collection does not exist
- Content and data cannot be in same collection.
- Collection contains entries of a different type.
- Data collection entry failed to parse.
- Duplicate content entry slug.
- Actions must be used with server output.
- Unsupported transform in content config.
开发者工具栏应用 API
Astro 开发者工具栏应用 API 允许你创建 Astro 集成,以便在 Astro 开发者工具栏中添加应用。这使你可以添加新功能并与第三方服务进行集成。
相关操作指南: 创建开发者工具栏应用开发者工具栏应用集成设置
集成可以在 astro:config:setup
钩子 中向开发者工具栏添加应用。
/**
* @type {() => import('astro').AstroIntegration}
*/
export default () => ({
name: "my-integration",
hooks: {
"astro:config:setup": ({ addDevToolbarApp }) => { addDevToolbarApp({ id: "my-app", name: "My App", icon: "<svg>...</svg>", entrypoint: "./my-app.js", });
},
},
});
addDevToolbarApp()
这是一个可用于 astro:config:setup
钩子 的函数,用于添加开发者工具栏应用。它接受一个对象,该对象包含定义工具栏应用所需的以下属性:id
、name
、icon
和 entrypoint
。
id
应用的唯一标识符。这将用于在钩子和事件中唯一的标识应用。
my-integration.js{ id: '我的应用',
// ...
}
name
应用的名称。每当需要使用人类可读的名称引用应用时,都会向用户显示此名称。
my-integration.js{
// ... name: '我的应用',
// ...
}
icon
用于在工具栏中显示应用的图标。可以是 图标列表 中的图标,或包含图标 SVG 标记的字符串。
my-integration.js{
// ... icon: '<svg>...</svg>', // 或例如 'astro:logo'
// ...
}
entrypoint
导出开发者工具栏应用的文件路径。
my-integration.js{
// ... entrypoint: './my-app.js',
}
开发者工具栏应用的结构
开发者工具栏应用是一个 .js
或 .ts
文件,它默认导出一个对象,该对象使用来自 astro/toolbar
模块的 defineToolbarApp()
函数。
import { defineToolbarApp } from "astro/toolbar";
export default defineToolbarApp({
init(canvas) {
const text = document.createTextNode('Hello World!');
canvas.appendChild(text);
}
beforeTogglingOff() {
const confirmation = window.confirm('Really exit?');
return confirmation;
}
});
defineToolbarApp()
添加于: astro@4.7.0
一个在你的工具栏应用加载和关闭时定义逻辑的函数。
此函数接收一个对象,其中包含一个 init()
函数,该函数将在开发者工具栏应用加载时被调用。它还可以包含一个 beforeTogglingOff()
函数,该函数将在点击工具栏应用以关闭其活动状态时运行。
init()
签名: init(canvas: ShadowRoot, app: ToolbarAppEventTarget, server: ToolbarServerHelpers) => void
虽然不是必需的,但大多数应用会使用这个函数来定义应用的核心行为。这个函数只会在应用加载时被调用一次,具体是在浏览器空闲时或用户在 UI 中点击应用时,具体取决于哪个先发生。
该函数接收三个参数来定义你的应用逻辑:canvas
(用于向屏幕渲染元素),app
(用于从开发者工具栏发送和接收客户端事件),和 server
(用于与服务器通信)。
canvas
一个标准的 ShadowRoot,应用可以用来渲染其 UI。可以使用标准的 DOM API 创建元素并添加到 ShadowRoot 中。
每个应用都会接收到一个专用的 ShadowRoot 用于渲染其 UI。此外,父元素使用 position: absolute;
进行定位,因此应用的 UI 不会影响 Astro 页面的布局。
export default defineToolbarApp({
init(canvas) { canvas.appendChild(document.createTextNode('你好,世界!'))
}
});
app
添加于: astro@4.7.0
一个标准的 EventTarget
,附带一些额外的 客户端事件,可用于从开发者工具栏发送和接收事件。
export default defineToolbarApp({
init(canvas, app) { app.onToggled(({ state }) => { const text = document.createTextNode( `The app is now ${state ? "enabled" : "disabled"}!`, );
canvas.appendChild(text);
});
},
});
server
添加于: astro@4.7.0
一个用于与服务器通信的对象。
src/my-app.jsexport default defineToolbarApp({
init(canvas, app, server) { server.send('my-message', { message: 'Hello!' });
server.on('server-message', (data) => { console.log(data.message); });
},
});
beforeTogglingOff()
签名: beforeTogglingOff(canvas: ShadowRoot): boolean | void
astro@4.7.0
当用户在 UI 中点击应用图标来关闭应用时,将调用此可选函数。例如,此函数可以用于执行清理操作,或在关闭应用前要求用户确认。
如果返回 false
值,将取消关闭操作,应用将保持启用状态。
export default defineToolbarApp({
// ... beforeTogglingOff() { const confirmation = window.confirm('你确定要禁用这个应用吗?'); return confirmation; }
});
canvas
应用的 ShadowRoot 可用于在关闭前渲染所需的任何 UI。与 init
函数的 canvas
参数 相同。
客户端事件
除了 EventTarget
的标准方法(addEventListener
、dispatchEvent
、removeEventListener
等),app
对象还包括以下方法:
onToggled()
签名: onToggled(callback: (options: {state: boolean})) => void
astro@4.7.0
当用户在 UI 中点击应用图标以开启或关闭应用时,注册一个回调函数。
src/my-app.jsapp.onToggled((options) => {
console.log(`应用现在${options.state ? '已启用' : '已禁用'}!`);
});
onToolbarPlacementUpdated()
签名: onToolbarPlacementUpdated(callback: (options: {placement: 'bottom-left' | 'bottom-center' | 'bottom-right'})) => void
astro@4.7.0
当用户更改 Dev Toolbar 的位置时,将触发此事件。例如,这可以用来在工具栏移动时重新定位应用的 UI。
src/my-app.jsapp.onToolbarPlacementUpdated((options) => {
console.log(`工具栏现在位于 ${options.placement}!`);
});
toggleState()
签名: toggleState(options: {state: boolean}) => void
astro@4.7.0
更改应用的状态。例如,当用户在应用的 UI 中点击按钮时,可以通过编程方式启用或禁用应用。
src/my-app.jsapp.toggleState({ state: false });
toggleNotification()
签名: toggleNotification(options: {state?: boolean, level?: 'error' | 'warning' | 'info'}) => void
astro@4.7.0
在应用图标上切换通知。这可以用来通知用户应用需要关注,或者移除当前的通知。
src/my-app.jsapp.toggleNotification({
state: true,
level: 'warning',
});
state: boolean
指示应用是否有针对用户的通知。当 true
时,应用图标将被高亮显示。相反,当 false
时,将移除高亮显示。如果未指定此属性,默认为 true
。
level: 'error' | 'warning' | 'info'
指示通知的级别。这将用于确定应用图标上高亮显示的颜色和形状(深粉色圆圈、金色三角形或蓝色正方形)。如果未指定此属性,将默认为 'error'
。
客户端 - 服务器通信
使用 Vite 的客户端 - 服务器通信方法,Dev Toolbar Apps 和服务器可以相互通信。为了便于发送和接收自定义消息,提供了辅助方法,可在你的工具栏应用(客户端)和你的集成(服务器端)中使用。
在客户端
在你的应用中,使用 init()
钩子上的 server
对象 来发送和接收服务器的消息。
export default defineToolbarApp({
init(canvas, app, server) { server.send('my-message', { message: '你好!' });
server.on('server-message', (data) => { console.log(data.message); });
},
});
send()
Signature: send<T>(event: stringify, data: T) => void
astro@4.7.0
从你的工具栏应用中定义的逻辑发送数据到服务器。
src/my-app.jsinit(canvas, app, server) {
server.send('my-app:my-message', { message: '你好!' });
}
在从客户端向服务器发送消息时,最好在事件名称前加上应用 ID 或其他命名空间,以避免与可能正在监听消息的其他应用或其他集成发生冲突。
on()
签名: on<T>(event: string, callback: (data: T) => void) => void
astro@4.7.0
注册一个回调函数,当服务器发送带有指定事件的消息时调用此函数。
src/my-app.jsinit(canvas, app, server) {
server.on('server-message', (data) => {
console.log(data.message);
});
}
在服务器端
在一个集成中,例如添加你的工具栏应用的集成,使用 astro:server:setup
钩子 来访问 toolbar
对象,以便向你的应用发送和接收消息。
export default () => ({
name: "my-integration",
hooks: {
"astro:config:setup": ({ addDevToolbarApp }) => {}, "astro:server:setup": ({ toolbar }) => {},
},
});
send()
签名: send<T>(event: string, data: T) => void
astro@4.7.0
向客户端发送数据。
my-integration.js'astro:server:setup': ({ toolbar }) => {
toolbar.send('server-message', { message: '你好!' });
},
on()
签名: on<T>(event: string, callback: (data: T) => void) => void
astro@4.7.0
注册一个回调函数,当客户端发送带有指定事件的消息时调用此函数。
my-integration.js'astro:server:setup': ({ toolbar }) => {
toolbar.on('my-app:my-message', (data) => {
console.log(data.message);
});
},
onInitialized()
签名: onInitialized(appId: string, callback: () => void) => void
astro@4.7.0
注册一个回调函数,当应用初始化时调用此函数。
my-integration.js'astro:server:setup': ({ toolbar }) => {
toolbar.onInitialized('my-app', () => {
console.log('应用现在已初始化!');
});
},
onAppToggled()
签名: onAppToggled(appId: string, callback: (options: {state: boolean}) => void) => void
astro@4.7.0
当用户在 UI 中点击应用图标以开启或关闭应用时,注册一个回调函数。
my-integration.js'astro:server:setup': ({ toolbar }) => {
toolbar.onAppToggled('my-app', ({ state }) => {
console.log(`应用现在已${state ? '启用' : '禁用'}!`);
});
},
组件库
Dev Toolbar 包含一套可以用来构建具有一致外观和感觉的应用的 web 组件。
astro-dev-toolbar-window
显示窗口。
组件的插槽将被用作窗口的内容。
<astro-dev-toolbar-window>
<p>我的内容</p>
</astro-dev-toolbar-window>
使用 JavaScript 构建窗口时,插槽内容必须放在组件的 light DOM 内。
const myWindow = document.createElement('astro-dev-toolbar-window');
const myContent = document.createElement('p');
myContent.textContent = '我的内容';
// 直接在 `window` 上使用 appendChild,不要使用 `myWindow.shadowRoot`
myWindow.appendChild(myContent);
astro-dev-toolbar-button
显示按钮。
组件的插槽将被用作按钮的内容。
const myButton = document.createElement('astro-dev-toolbar-button');
myButton.textContent = '点击我!';
myButton.buttonStyle = "purple";
myButton.size = "medium";
myButton.addEventListener('click', () => {
console.log('被点击了!');
});
size
按钮的大小(small
,medium
,large
)。
button-style
按钮的样式(ghost
,outline
,purple
,gray
,red
,green
, yellow
, blue
)。当使用 ghost
时,按钮本身是不可见的,只会显示按钮的内容。
在 JavaScript 中,使用 buttonStyle
属性设置此属性以避免与原生 style
属性冲突。
button-border-radius
添加于: astro@4.8.0
按钮的边框半径(normal
, rounded
)。使用 rounded
时,按钮将具有圆角和四周均匀的填充。
在 JavaScript 中,使用 buttonBorderRadius
属性设置此属性。
astro-dev-toolbar-badge
显示徽章。
组件的插槽将被用作徽章的内容。
<astro-dev-toolbar-badge>我的徽章</astro-dev-toolbar-badge>
size
徽章的大小(small
,large
)。
badge-style
徽章的样式(颜色)(purple
,gray
,red
,green
,yellow
,blue
)。
在 JavaScript 中,使用 badgeStyle
属性设置此属性以避免与原生 style
属性冲突。
astro-dev-toolbar-card
显示一张卡片。指定可选的 link
属性使卡片像 <a>
元素一样行动。
当使用 JavaScript 制作卡片时,可以指定 clickAction
属性使卡片像 <button>
元素一样行动。
组件的插槽将被用作卡片的内容。
<astro-dev-toolbar-card icon="astro:logo" link="https://github.com/withastro/astro/issues/new/choose">报告问题</astro-dev-toolbar-card>
card-style
卡片的样式(purple
,gray
,red
,green
,yellow
,blue
)。这些颜色只会在鼠标悬停时应用于卡片的边框上。
在 JavaScript 中,使用 cardStyle
属性来设置这个属性。
astro-dev-toolbar-toggle
显示切换元素,作为复选框。这个元素内部是简单的包装器,围绕着原生的 <input type="checkbox">
元素。可以使用 input
属性访问复选框元素。
const toggle = document.createElement('astro-dev-toolbar-toggle');
toggle.input.addEventListener('change', (evt) => {
console.log(`现在的切换状态是 ${evt.currentTarget.checked ? '启用' : '禁用'}!`);
});
astro-dev-toolbar-radio-checkbox
添加于: astro@4.8.0
展示一个单选框。类似于 astro-dev-toolbar-toggle
组件,这个元素是围绕原生 <input type="radio">
元素的简单包装器。可以通过 input
属性访问单选框元素。
const radio = document.createElement('astro-dev-toolbar-radio-checkbox');
radio.input.addEventListener('change', (evt) => {
console.log(`单选框现在${evt.currentTarget.checked ? '启用' : '禁用'}了!`);
});
toggle-style
切换的样式(purple
,gray
,red
,green
,yellow
,blue
)。
在 JavaScript 中,使用 toggleStyle
属性来设置这个属性。
astro-dev-toolbar-highlight
可以用来高亮显示页面上的元素。在大多数情况下,你会想要使用 top
,left
,width
和 height
CSS 属性来定位和调整这个元素的大小,以匹配你想要高亮的元素。
<!-- 高亮整个页面 -->
<astro-dev-toolbar-highlight style="top: 0; left: 0; width: 100%; height: 100%;"></astro-dev-toolbar-highlight>
const elementToHighlight = document.querySelector('h1');
const rect = elementToHighlight.getBoundingClientRect();
const highlight = document.createElement('astro-dev-toolbar-highlight');
highlight.style.top = `${Math.max(rect.top + window.scrollY - 10, 0)}px`;
highlight.style.left = `${Math.max(rect.left + window.scrollX - 10, 0)}px`;
highlight.style.width = `${rect.width + 15}px`;
highlight.style.height = `${rect.height + 15}px`;
highlight.icon = 'astro:logo';
style
高亮显示的样式(purple
,gray
,red
,green
,yellow
,blue
)。
icon
用于在高亮显示的右上角展示的 图标。
astro-dev-toolbar-tooltip
显示带有不同 sections 的工具提示。此组件默认设置为 display: none;
,可以使用 data-show="true"
属性使其可见。
使用 sections
属性定义 sections。此属性是具有以下形状的对象的数组:
{
title?: string; // sections 的标题
inlineTitle?: string; // sections 的标题,显示在标题旁边
icon?: Icon; // sections 的图标
content?: string; // sections 的内容
clickAction?: () => void | Promise<void>; // 点击 sections 时执行的操作
clickDescription?: string; // 点击 sections 时执行的操作的描述
}
const tooltip = document.createElement('astro-dev-toolbar-tooltip');
tooltip.sections = [{
title: '我的部分',
icon: 'astro:logo',
content: '我的内容',
clickAction: () => {
console.log('点击了!')
},
clickDescription: '点击我!'
}]
此组件通常与 astro-dev-toolbar-highlight
组件结合使用,当鼠标悬停在高亮的元素上时显示工具提示:
const highlight = document.createElement('astro-dev-toolbar-highlight');
// 定位高亮...
const tooltip = document.createElement('astro-dev-toolbar-tooltip');
// 向工具提示添加部分...
highlight.addEventListener('mouseover', () => {
tooltip.dataset.show = 'true';
});
highlight.addEventListener('mouseout', () => {
tooltip.dataset.show = 'false';
});
astro-dev-toolbar-icon
显示图标。可以使用 icon
属性指定图标列表中的图标,或者将图标的 SVG 标记作为插槽传递。
<astro-dev-toolbar-icon icon="astro:logo" />
<astro-dev-toolbar-icon>
<svg>...</svg>
</astro-dev-toolbar-icon>
图标
目前,可以在任何接受图标的组件中使用以下图标:
astro:logo
warning
arrow-down
bug
file-search
check-circle
gear
lightbulb
checkmark
dots-three
copy
以上所有图标默认设置为 fill="currentColor"
,并将从父元素继承其颜色。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论