- 起步
- 核心概念
- 教程
- 基础内容
- 内置功能
- 集成
- 操作指南
- 使用指南
- 配置
- 参考
- 社区资源
- 其他
- 为文档做出贡献
- 手动安装 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.
TypeScript
Astro 内置了对 TypeScript 的支持。你可以在 Astro 项目中导入 .ts
和 .tsx
文件,甚至可以直接在 Astro 组件 中编写 TypeScript 代码。如果你愿意,你甚至可以使用 astro.config.ts
。
使用 TypeScript,你可以通过约束代码中对象和组件的类型来防止运行时的错误。例如,如果你使用了 TypeScript 来定义组件参数;而如果你在使用时不小心传入了一个与之不匹配的参数,编辑器将会报错。
你无需在 Astro 项目中编写 TypeScript 代码也可从中受益。Astro 始终将你的组件代码视为 TypeScript,并且 Astro 的 VSCode 扩展 将尝试尽可能多地推断,以便在编辑器中提供自动完成、提示和错误。
Astro 的开发服务器不会进行任何类型检查,但你可以编辑 package.json
中的 scripts
属性来通过命令行工具检查代码中的类型错误。
设置
Astro 入门项目在你的项目中包含一个名为 tsconfig.json
的文件。即使你不编写 TypeScript 代码,这个文件也很重要;通过这个文件,可以让 Astro 和 VSCode 等工具知道应当如何理解你的项目。如果没有 tsconfig.json
文件,编辑器将不能对某些功能提供完整支持(比如 npm 包导入)。如果你手动安装的 Astro,请务必自己创建此文件。
Astro 中包含三个可扩展的 tsconfig.json
模板:base
、strict
和 strictest
。base
模板开启了对现代 JavaScript 的相关特性的支持,也可用作其他模板的基础。但如果你打算在项目中编写 TypeScript,我们建议使用 strict
或 strictest
。你可以在 astro/tsconfigs/ 中查看和比较这三个配置模板。
要继承其中某个模板,请使用 设置项 extends
:
{
"extends": "astro/tsconfigs/base"
}
此外,我们的模板在 src
文件夹中包含一个名为 env.d.ts
的文件,它为你的项目提供 Vite 的客户端类型:
/// <reference types="astro/client" />
如果你不使用 VSCode,那可以安装 Astro TypeScript plugin 插件来支持从 .ts
文件导入 .astro
文件。 (这对于别名导出非常有用)。
- npm
- pnpm
- Yarn
npm install @astrojs/ts-plugin
pnpm add @astrojs/ts-plugin
yarn add @astrojs/ts-plugin
然后,将下面内容添加到你的 tsconfig.json
:
"compilerOptions": {
"plugins": [
{
"name": "@astrojs/ts-plugin"
},
],
}
要检查插件是否正常工作,创建一个 .ts
文件,并在里面导入一个 Astro 组件。你的编辑器应该没有警告消息。
UI 框架
如果你的项目使用了 UI 框架,则可能需要根据框架的不同进行额外的设置。请参阅你使用的框架的文档中关于 TypeScript 的相关文档以获取更多信息。(Vue、React、Preact、Solid)
类型导入
尽可能显式的导入和导出类型。
import { SomeType } from './script';import type { SomeType } from './script';
通过这种方式,你可以避免让 Astro 的打包程序将导入的类型误以为是 JavaScript,从而错误地被打包。
你可以在 tsconfig.json
文件配置 TypeScript 强制执行类型导入。设置 verbatimModuleSyntax
为 true
。TypeScript 会检查你的导入并告诉你什么时候应该使用 import type
。这个设置在我们所有的预设里都是默认启用的。
{
"compilerOptions": { "verbatimModuleSyntax": true
}
}
导入别名
Astro 支持你在 tsconfig.json
和 jsconfig.json
文件里的 paths
配置所定义的 导入别名。阅读我们的指南以了解更多。
---
import HelloWorld from '@components/HelloWorld.astro';
import Layout from '@layouts/Layout.astro';
---
tsconfig.json{
"compilerOptions": {
"baseUrl": ".",
"paths": { "@components/*": ["src/components/*"], "@layouts/*": ["src/layouts/*"]
}
}
}
扩展 window
和 globalThis
你可能需要在全局对象中添加一项属性。可以通过在 env.d.ts
文件中使用 declare
关键字添加顶级声明来实现这一点:
declare const myString: string;
declare function myFunction(): boolean;
这将为 globalThis.myString
和 globalThis.myFunction
以及 window.myString
和 window.myFunction
提供类型。
注意, window
只能在客户端代码中访问。 globalThis
在服务器端和客户端上都可用,但服务器端值不会共享给客户端。
如果你只想为 window
对象中的一个属性提供类型注释,可以提供一个 Window
接口来实现:
interface Window {
myFunction(): boolean;
}
组件参数
Astro 支持通过 TypeScript 来定义你的组件参数。为了启动它,你需要将一个名为 Props
的 TypeScript 接口添加到你的的组件。你可以(可选的)使用 export
语句将其导出,但这不是强制的。Astro VSCode 扩展会自动寻找 Props
接口,并且当你在其他模板内使用该组件时,给你提供适当的 TS 支持。
---interface Props { name: string; greeting?: string;}
const { greeting = 'Hello', name } = Astro.props;
---
<h2>{greeting}, {name}!</h2>
常见的 Props 类型的套路
如果你的组件没有任何的参数或插槽,你可以使用
type Props = Record<string, never>
。如果你的组件必须将一个子组件传递给默认插槽,你可以使用
type Props = { children: any; };
。
类型工具包
添加于: astro@1.6.0
Astro 为常见的组件参数的类型模式准备了一些实用的类型工具集。这些可以通过在代码中引入 astro/types
来使用。
内置的属性类型
Astro 提供 HTMLAttributes
类型,以检查你的类型是否使用有效的 HTML 属性。你可以使用这些类型来帮助构建组件参数。
例如,如果你正在构建一个 <Link>
组件,你可以通过以下语法来为组件的 Props 类型镜像 <a>
的默认的 HTML 属性。
---
import { HTMLAttributes } from 'astro/types';
// 使用 `type`
type Props = HTMLAttributes<'a'>;
// 或者通过 `interface` 继承
interface Props extends HTMLAttributes<'a'> {
myProp?: boolean;
}
const { href, ...attrs } = Astro.props;
---
<a href={href} {...attrs}>
<slot />
</a>
也可以通过在 .d.ts
文件中重新声明命名空间 astroHTML.JSX
,来为默认的 JSX 定义扩展非标准属性。
declare namespace astroHTML.JSX {
interface HTMLAttributes {
'data-count'?: number;
'data-label'?: string;
}
// 添加一个 CSS 自定义属性到 style 对象中
interface CSSProperties {
'--theme-color'?: 'black' | 'white';
}
}
ComponentProps
类型
添加于: astro@4.3.0
这种导出类型允许你引用另一个组件所接收的 Props
,即使那个组件并没有直接导出 Props
类型。
下面的例子展示了如何使用来自 astro/types
的 ComponentProps
工具来引用一个 <Button />
组件的 Props
类型:
---
import type { ComponentProps } from 'astro/types';
import Button from "./Button.astro";
type ButtonProps = ComponentProps<typeof Button>;
---
多态类型
添加于: astro@2.5.0
Astro 包含一个辅助工具,使得构建能够以完全类型安全的方式渲染不同 HTML 元素的组件更加容易。这对于像 <Link>
这样的组件非常有用,它可以根据传递给它的 props 渲染为 <a>
标签或 <button>
标签。
下面的示例实现了一个完全类型化的多态组件,可以渲染为任何 HTML 元素。使用 HTMLTag
类型来确保 as
属性是一个有效的 HTML 元素。
---
import type { HTMLTag, Polymorphic } from 'astro/types';
type Props<Tag extends HTMLTag> = Polymorphic<{ as: Tag }>;
const { as: Tag, ...props } = Astro.props;
---
<Tag {...props} />
推断 getStaticPaths()
的类型
添加于: astro@2.1.0
Astro 中有帮助你处理动态路由 getStaticPaths()
函数返回类型的类型。
你可以使用 InferGetStaticParamsType
和 InferGetStaticPropsType
来获取 Astro.params
和 Astro.props
的类型。
---import type { InferGetStaticParamsType, InferGetStaticPropsType, GetStaticPaths } from 'astro';
export const getStaticPaths = (async () => {
const posts = await getCollection('blog');
return posts.map((post) => {
return {
params: { slug: post.slug },
props: { draft: post.data.draft, title: post.data.title },
};
});
}) satisfies GetStaticPaths;
type Params = InferGetStaticParamsType<typeof getStaticPaths>;type Props = InferGetStaticPropsType<typeof getStaticPaths>;
const { slug } = Astro.params as Params;
// ^? { slug: string; }
const { title } = Astro.props;
// ^? { draft: boolean; title: string; }
---
类型检验
要在编辑器中查看类型错误,请确保已安装 Astro VSCode 扩展。请注意,astro start
和 astro build
命令将使用 esbuild 转译代码,但不会运行任何类型检查。为了防止你的代码在包含 TypeScript 错误的情况下被构建,请将你 package.json
中的 build
脚本更改为以下内容:
"scripts": { "build": "astro build", "build": "astro check && astro build",
},
阅读更多关于 Astro 中的 .ts
文件导入 的内容。 阅读更多关于 TypeScript 配置 的内容。故障排除
同时使用多个 JSX 框架所带来的类型错误
在同一个项目中使用多个 JSX 框架时可能会出现问题,因为每个框架在 tsconfig.json
中的不同需求有时会相互冲突。
解决方案:根据你最常用的框架,将 jsxImportSource
这一设置项设置为 react
(默认)、preact
或 solid-js
。然后,在来自不同框架的任何冲突文件中使用编译指示(pragma comment)进行注释。
对于默认设置 jsxImportSource: react
,你可以使用:
// For Preact
/** @jsxImportSource preact */
// For Solid
/** @jsxImportSource solid-js */
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论