- 起步
- 核心概念
- 教程
- 基础内容
- 内置功能
- 集成
- 操作指南
- 使用指南
- 配置
- 参考
- 社区资源
- 其他
- 为文档做出贡献
- 手动安装 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.
升级到 Astro v4
本指南将帮助你从 Astro v3 迁移到 Astro v4。
需要将旧项目升级到 v3 吗?请参阅我们的 旧版本迁移指南。
需要查阅 v3 的文档?请访问这个旧版本文档站 (不被维护的 v3.6 快照)。
升级 Astro
使用你的包管理器将项目的 Astro 和所有官方集成升级到最新版本。
- npm
- pnpm
- Yarn
# 同时升级 Astro 和官方集成
npx @astrojs/upgrade
# 同时升级 Astro 和官方集成
pnpm dlx @astrojs/upgrade
# 同时升级 Astro 和官方集成
yarn dlx @astrojs/upgrade
如果需要的话,你也可以手动升级 Astro 集成,你可能还需要升级项目中的其他依赖。
Astro v4.0 包含潜在的破坏性,以及一些之前被弃用的功能被移除。
如果你的项目在升级后的行为不符合预期,请参考本指南,了解所有破坏性更改的概述以及如何修改你的代码的说明。
完整的发行说明请参阅 changelog。
Astro v4.0 移除的实验性标志
从 astro.config.mjs
中移除 devOverlay
实验性标志并把 i18n
移到最外层:
import { defineConfig } from 'astro/config';
export default defineConfig({
experimental: { devOverlay: true, i18n: { defaultLocale: "en", locales: ["en", "fr", "pt-br", "es"], }
}, i18n: { defaultLocale: "en", locales: ["en", "fr", "pt-br", "es"], },
})
这些功能现已可在 Astro v4.0 中使用。
了解更多关于这两个令人兴奋的功能以及更多内容,请阅读 v4.0 博客文章!
升级
可能导致你的项目中出现不兼容的 major 版本更新。
已升级:Vite 5.0
在 Astro v3.0 中,开发服务器和生产打包工具使用的是 Vite 4。
Astro v4.0 从 Vite 4 升级到了 Vite 5。
我应该做什么?
如果你使用了 Vite 的插件、配置或 API,请查看 Vite 迁移指南中的破坏性更改并根据需要升级你的项目。Astro 本身没有任何破坏性更改。
已升级:unified、remark、和 rehype 依赖
在 Astro v3.0 中,处理 Markdown 和 MDX 使用的是 unified v10 和与它关联、兼容的 remark/rehype 包。
Astro v4.0 把 unified 升级到了 v11 并把其他 remark/rehype 包升级到了最新版本。
我应该做什么?
如果你使用了自定义的 remark/rehype 包,请使用你的包管理器将它们全部升级到最新版本,以确保它们支持 unified v11。你使用了的包可以在 astro.config.mjs
中找到。
如果你使用的是有被积极更新的包,那么不应该有任何重大的破坏性更改,但是一些包可能还不兼容 unified v11。 在部署前,检查你的 Markdown/MDX 页面,确保你的站点按预期运行。
破坏性更改
下面的这些更改被认为是 Astro 中的破坏性的更改。破坏性更改可能会提供临时的向后兼容性,所有文档都会被更新为仅引用当前支持的代码。
如果你需要参考 v3.x 项目的文档,你可以浏览这个(不再维护的) v4.0 之前的文档快照。
重命名:entrypoint
(集成 API)
在 Astro v3.0 中,集成 API injectRoute
用于指定路由入口点的的属性名字是 entryPoint
。
Astro v4.0 为了与其他 Astro API 的一致性把它改为 entrypoint
。entryPoint
属性已被弃用,它还能被使用但会输出一条警告提醒你更新你的代码。
我应该做什么?
如果你有使用了 injectRoute
API 的集成,请把 entryPoint
属性改为 entrypoint
。如果你是一个库的作者,想要同时支持 Astro 3 和 4,你可以同时指定 entryPoint
和 entrypoint
,这样就不会输出警告。
injectRoute({
pattern: '/fancy-dashboard', entryPoint: '@fancy/dashboard/dashboard.astro' entrypoint: '@fancy/dashboard/dashboard.astro'
});
改动:集成 API app.render
的函数签名
在 Astro v3.0 中,app.render()
方法接收互相独立独立、可选的 routeData
和 locals
参数。
Astro v4.0 修改了 app.render()
的函数签名。这两个属性现在在同一个对象里。这个对象和这两个属性仍旧是可选的。
我应该做什么?
如果你维护了一个适配器,当前的函数签名将会继续工作到下一个 major 版本。要迁移到新的签名,把 routeData
和 locals
作为一个对象的属性传递,而不是作为多个独立的参数。
app.render(request, routeData, locals)app.render(request, { routeData, locals })
改动:适配器现在必须指定所支持的功能
在 Astro v3.0 中,适配器不需要指定它们所支持的功能。
Astro v4.0 要求适配器通过传入 supportedAstroFeatures{}
属性来指定它们所支持的功能列表。这个属性不再是可选的。
我应该做什么?
适配器作者需要传入 supportedAstroFeatures{}
属性来指定它们所支持的功能列表。
export default function createIntegration() {
return {
name: '@matthewp/my-adapter',
hooks: {
'astro:config:done': ({ setAdapter }) => {
setAdapter({
name: '@matthewp/my-adapter',
serverEntrypoint: '@matthewp/my-adapter/server.js', supportedAstroFeatures: { staticOutput: 'stable' }
});
},
},
};
}
移除:Shiki 语言 path
属性
在 Astro v3.0 中,一个传入 markdown.shikiConfig.langs
的 Shiki language 会被自动转换成一个兼容 Shikiji 的语言。Shikiji 是 Astro 内部使用的语言高亮工具。
Astro v4.0 移除了对 Shiki 语言的 path
属性的支持,这个属性配置起来令人困惑。它被一个可以直接传入 langs
的导入替代。
我应该做什么?
语言 JSON 文件应该被导入并传入到选项中。
astro.config.js import customLang from './custom.tmLanguage.json'
export default defineConfig({
markdown: {
shikiConfig: {
langs: [ { path: '../../custom.tmLanguage.json' }, customLang,
],
},
},
})
弃用
下面的这些功能在 Astro v4.0 中已不再被支持,也不再被文档记录。请相应地更新你的项目。
部分弃用的功能可能暂时会在 Astro v4.0 中继续工作,直到它们被完全移除。其他的可能会默默地没有任何效果,或者抛出一个错误提示你更新你的代码。
弃用:视图过渡 submit
事件的 handleForms
在 Astro v3.0 中,使用了 <ViewTransitions />
组件的项目必须 opt-in 处理 form
元素的 submit
事件。这是通过传入一个 handleForms
参数实现的。
Astro v4.0 在使用 <ViewTransitions />
时默认处理 form
元素的 submit
事件。handleForms
参数已被弃用且没有任何效果。
我应该做什么?
从你的 ViewTransitions
组件中移除 handleForms
属性。它已不被需要。
---
import { ViewTransitions } from "astro:transitions";
---
<html>
<head>
<ViewTransitions handleForms />
</head>
<body>
<!-- 一些内容 -->
</body>
</html>
要 opt-out 处理 form
元素的 submit
事件,请在对应的 form
元素上添加 data-astro-reload
属性。
<form action="/contact" data-astro-reload>
<!-- -->
</form>
之前弃用的功能已被移除
下面的这些被弃用的功能现已被从代码中完全删除,不能再使用。部分功能可能在之前弃用了之后仍然在你的项目中工作。其他的可能在被弃用后默默地没有任何效果。
使用了这些已被移除的功能的项目将无法构建,并且也不再有提醒你移除这些功能的文档。
移除:从端点返回简单对象
在 Astro v3.0 中,从端点返回简单对象被弃用,但为了与 Astro v2 保持兼容依旧可以使用。我们提供了一个便于迁移的 ResponseWithEncoding
。
Astro v4.0 移除了对简单对象的支持并要求端点必须返回一个 Response
。ResponseWithEncoding
也被 Response
类型所替换并被移除。
我应该做什么?
更新你的端点,直接返回一个 Response
对象。
export async function GET() { return { body: { "title": "小明的博客" }}; return new Response(JSON.stringify({ "title": "小明的博客" }));
}
要移除对 ResponseWithEncoding
的使用,重构你的代码为使用 ArrayBuffer
:
export async function GET() {
const file = await fs.readFile('./bob.png'); return new ResponseWithEncoding(file.toString('binary'), undefined, 'binary'); return new Response(file.buffer);
}
移除:build.split
和 build.excludeMiddleware
在 Astro v3.0 中,build.split
和 build.excludeMiddleware
构建配置项被弃用,它们被实现相同功能的适配器配置选项替代。
Astro v4.0 完全移除了这些属性。
我应该做什么?
如果你在使用被弃用的 build.split
或 build.excludeMiddleware
,你必须移除它们,因为它们已经不存在了。
请参考 v3 迁移指南修改这些被弃用的中间件属性为使用适配器配置选项。
移除:Astro.request.params
在 Astro v3.0 中,Astro.request.params
API 被弃用,但为了兼容性被保留。
Astro v4.0 完全移除了这个选项。
我应该做什么?
把所有的 Astro.request.params
修改为受支持的 Astro.params
。
const { id } = Astro.request.params;const { id } = Astro.params;
移除:markdown.drafts
在 Astro v3.0 中,使用 markdown.drafts
来控制是否构建草稿文章被弃用。
Astro v4.0 完全移除了这个选项。
我应该做什么?
如果你在使用被弃用的 markdown.drafts
,你必须移除它们,因为它们已经不存在了。
要继续标记部分页面为草稿,请迁移到内容集合并使用 draft: true
frontmatter 属性手动过滤掉页面。
移除:getHeaders()
在 Astro v3.0 中,getHeaders()
Markdown 导出被弃用并被 getHeadings()
替代。
Astro v4.0 完全移除了这个选项。
我应该做什么?
如果你在使用被弃用的 getHeaders()
,你必须移除它们,因为它们已经不存在了。把它们全部替换为受支持的 getHeadings()
。
const posts = await Astro.glob('../content/blog/*.mdx');const firstPostHeadings = posts.at(0).getHeaders();const firstPostHeadings = posts.at(0).getHeadings();
移除:在 getStaticPaths()
里使用 rss
在 Astro v3.0 中,在 getStaticPaths()
中使用被弃用的 rss
会抛出一个错误。
Astro v4.0 完全移除了它。
我应该做什么?
如果你在使用不受支持的方法生成 RSS 订阅,你现在必须使用 @astrojs/rss
集成来实现完善的 RSS。
移除:小写的 HTTP 方法名
在 Astro v3.0 中,使用小写的 HTTP 请求方法名 (get
, post
, put
, all
, del
) 被弃用。
Astro v4.0 完全移除了对小写名字的支持。所有的 HTTP 请求方法现在必须使用大写。
我应该做什么?
如果你在使用被弃用的小写名字,你现在必须把它们换成对应的大写格式。
请参考 v3 迁移指南使用大写的 HTTP 请求方法名。
移除:缺少 base
前缀时的 301 跳转
在 Astro v3.0 中,Astro 预览服务器会在不带 base 路径请求 public 文件夹资源时返回一个 301 跳转。
Astro v4.0 在预览服务器运行时会给没有 base 路径前缀的 public 文件夹资源返回 404 状态码,与开发服务器的行为一致。
我应该做什么?
当使用 Astro 预览服务器时,所有从 public 文件夹导入的静态资源和 URL 都必须在路径前加上 base。
下面的示例展示了如何在配置了 base: '/docs'
时从 public 文件夹显示图片的 src
属性:
// To access public/images/my-image.png:
<img src="/docs/images/my-image.png" alt="">
移除:astro/client-image
自动转换
在 Astro v3.0 中,astro/client-image
类型(由被弃用的图片集成使用)被移除了,但如果在你的 env.d.ts
文件中的话会被自动转换成最新的默认 Astro 类型 astro/client
。
Astro v4.0 忽略 astro/client-image
且不再会自动更新你的 env.d.ts
。
我应该做什么?
如果你有给配置 @astrojs/image
在 src/env.d.ts
中配置类型,且升级到 v3.0 时没有自动为你转换类型,你需要手动把 astro/client-image
类型替换为 astro/client
。
/// <reference types="astro/client-image" /> /// <reference types="astro/client" />
社区资源
知道一个关于 Astro v4.0 的好资源? 编辑此页面 并在下面添加链接!
已知问题
请在 Astro 在 GitHub 上的 Issues 中查看任何反馈的问题,或者提交一个 issue。
Upgrade Guides如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论