Skip to content

Astro ​

什么是 Astro ​

Astro 是一款面向内容驱动场景的现代化静态站点框架,由 Astro 团队于 2021 年正式发布,是近年前端生态中热度增长最快的静态站点生成器(SSG)之一。

它以「内容优先、性能优先」为核心设计理念,独创的群岛架构从根本上解决了传统前端框架默认全量加载 JavaScript 的性能问题,默认输出零客户端 JS 的纯静态 HTML,仅在需要交互的位置按需加载脚本,在保持现代组件化开发体验的同时,让站点首屏性能与 SEO 表现接近原生静态页面的天花板。

目前 Astro 已成为内容博客、营销官网、技术文档、品牌展示站等场景的主流选型,被众多企业与开源项目采用。

Astro核心架构 ​

群岛架构(也译作岛屿架构)是 Astro 最核心的技术创新,也是它与其他所有静态站点框架最本质的区别。该概念最早由 Etsy 架构师 Katie Sylor-Miller 提出,经 Preact 作者 Jason Miller 推广,最终由 Astro 实现并带向主流。

1. 核心原理 ​

可以用「静态海洋 + 交互岛屿」来直观理解:

  • 静态海洋:页面绝大多数内容(文章正文、标题、图片、导航等纯展示内容)都会被渲染为纯静态 HTML/CSS,不携带任何 JavaScript,加载速度极快。
  • 交互岛屿:页面中少数需要交互的组件(评论区、搜索框、轮播图、点赞按钮等)作为独立的「岛屿」存在,只有这些岛屿会加载对应的 JS 并独立激活交互能力。

传统前端框架(React/Vue 全家桶)采用全量水合(Hydration):即使页面 90% 是静态内容,也要加载完整的运行时,重建整个页面的虚拟 DOM 才能实现交互。而 Astro 采用部分水合(Partial Hydration),只给真正需要交互的组件加载 JS,其余内容完全静态,首屏交互时间(TTI)可获得数倍提升。

2. 客户端水合指令 ​

Astro 通过 client:* 指令精确控制每个岛屿组件的加载时机,开发者可以根据组件优先级灵活选择:

指令触发时机适用场景
client:load页面加载完成后立即加载首屏关键交互组件,如导航栏、搜索框
client:idle浏览器空闲时加载非紧急交互,如评论区、分享按钮
client:visible组件滚动到可视区域时加载页面下方的组件,如底部表单、推荐卡片
client:media满足指定媒体查询时加载响应式组件,如移动端专属菜单
client:only仅在客户端渲染,跳过服务端渲染纯客户端交互、依赖浏览器 API 的组件

3. 进阶:服务器群岛(Server Islands) ​

在 Astro 5.0 中,群岛架构进一步扩展出服务器群岛能力,将静态与动态的边界从客户端延伸到了服务端。

  • 页面主体内容依然以静态 HTML 形式缓存于 CDN 边缘节点,保证极速访问
  • 少数需要动态个性化的内容(用户头像、购物车、实时评论等)作为独立的服务器岛屿,按需从服务端渲染并注入页面
  • 静态缓存与动态内容互不干扰,既保证了页面整体性能,又解决了纯静态站点无法实现个性化的痛点

Astro核心特性 ​

1. 默认零客户端 JavaScript,极致性能 ​

Astro 构建产物默认是纯 HTML + CSS,没有一行运行时 JavaScript,无需额外优化就能获得极高的 Lighthouse 性能得分,Core Web Vitals 指标天然优秀,是内容站性能的第一梯队方案。只有当你主动为组件添加 client:* 指令时,才会产生 JS 加载。

2. 多框架无感混用,不锁定技术栈 ​

这是 Astro 独有的巨大优势:同一个项目里可以同时使用 React、Vue、Svelte、Preact、Solid、Lit 等任意主流前端框架的组件,无需额外配置,也不会互相冲突。

你可以用 Vue 写导航栏,用 React 写评论区,用 Svelte 写动画组件,所有组件最终都会被统一渲染为静态 HTML,仅在激活时加载对应框架的运行时。团队无需统一技术栈,也能复用各生态的成熟组件资源。

3. 原生内容管理:内容集合 + Markdown/MDX ​

Astro 原生深度支持内容创作场景,是所有通用框架中内容管理能力最完善的方案之一:

  • 原生支持 Markdown、MDX(在 Markdown 中嵌入组件),支持 GFM 语法、代码高亮、数学公式等扩展
  • 内置内容集合(Content Collections)系统,支持用 Zod Schema 对文章 Front Matter 做类型校验与自动补全,构建时自动检查内容格式错误,避免线上出现字段缺失
  • 支持按目录组织内容,自动生成分类、标签、归档等页面,无需手动配置路由

4. 多渲染模式灵活切换 ​

Astro 不局限于纯静态生成,支持多种渲染模式按需切换,满足不同业务需求:

  • SSG(静态站点生成):默认模式,构建时生成全部静态页面,性能最高,适合内容稳定的站点
  • SSR(服务端渲染):通过适配器部署到 Node.js、Deno 或边缘运行时,支持动态接口、用户登录等能力
  • ISR(增量静态再生成):已发布的静态页面可在后台按需重新渲染,兼顾静态性能与内容时效性
  • 边缘渲染:部署到 Cloudflare Workers、Vercel Edge 等边缘节点,实现全球低延迟动态响应

5. 内置生产级优化 ​

  • 原生图片优化:自动压缩、格式转换、响应式尺寸、懒加载,无需额外插件
  • CSS 作用域:组件样式默认隔离,避免全局污染,自动合并与压缩
  • SEO 友好:静态 HTML 天然利于爬虫抓取,内置站点地图、RSS 生成、元数据管理能力
  • 资源预加载、自动内联关键 CSS 等优化开箱即用

6. 优秀的开发体验 ​

  • 基于 Vite 构建,热更新速度极快,开发过程流畅无等待
  • 原生支持 TypeScript,组件与内容均有完整类型提示
  • 统一的 .astro 组件语法,类 HTML 写法,学习门槛低
  • 官方 CLI 提供项目脚手架、集成一键安装等能力

Astro基础使用与核心语法 ​

1. 快速初始化 ​

环境要求:Node.js 18.17.0 及以上版本。 在终端执行官方脚手架命令,按提示选择即可创建项目:

bash
npm create astro@latest

启动本地开发服务器:

bash
npm run dev

默认访问 http://localhost:4321 即可预览站点。

2. 项目目录结构 ​

标准 Astro 项目的核心目录如下:

my-astro-site/
├── public/             # 静态资源目录,直接映射到站点根路径
├── src/
│   ├── components/     # 可复用组件(.astro / .vue / .jsx 等)
│   ├── content/        # 内容集合目录,存放 Markdown 文章
│   │   └── config.ts   # 内容集合 Schema 配置文件
│   ├── layouts/        # 页面布局模板
│   └── pages/          # 页面路由目录,文件路径即 URL 路径
├── astro.config.mjs    # Astro 全局配置文件
└── package.json

3. .astro 组件语法 ​

.astro 是 Astro 专属的组件文件格式,语法非常接近 HTML,学习成本极低,整体分为两部分:

astro
---
// 顶部代码围栏:服务端脚本,构建时执行,不会发送到客户端
const title = "我的博客";
const posts = await getCollection("blog");
---

<!-- 下方是模板部分,支持 HTML 语法 + JS 表达式 -->
<main class="container">
  <h1>{title}</h1>
  <ul>
    {posts.map(post => (
      <li><a href={`/post/${post.slug}`}>{post.data.title}</a></li>
    ))}
  </ul>
</main>

<style>
/* 组件内样式,默认作用域隔离 */
.container { max-width: 1200px; margin: 0 auto; }
</style>
  • 顶部 --- 包裹的代码仅在服务端/构建时运行,可直接读取文件、查询数据,不会暴露给客户端
  • 模板使用 {} 插入 JavaScript 表达式,支持循环、条件判断等逻辑
  • 样式默认局部作用域,不会污染全局

4. 文件路由系统 ​

Astro 采用基于文件的自动路由,src/pages/ 目录下的文件路径直接对应页面 URL:

  • src/pages/index.astro → 站点首页 /
  • src/pages/about.astro → /about
  • src/pages/blog/[slug].astro → 动态路由,如 /blog/hello-world
  • src/pages/blog/[...slug].astro → 捕获所有路由,支持多级路径

Astro核心能力 ​

内容集合是 Astro 管理结构化内容的官方标准方案,相当于为你的 Markdown 内容建立了一张「类型安全的数据表」,是搭建博客、文档站的核心功能。

1. 核心价值 ​

  • 构建时校验:通过 Schema 定义文章必须的字段(标题、日期、标签等),字段缺失或类型错误会在构建时报错,避免线上异常
  • 类型自动推导:TypeScript 自动补全所有内容字段,开发时无需手动定义类型
  • 统一内容查询:通过统一 API 查询所有文章,支持筛选、排序、分页,无需手动读取文件
  • 多内容类型隔离:博客文章、作者信息、文档手册可分为不同集合,各自独立管理

2. 基础配置与使用 ​

  1. 创建内容目录:在 src/content/ 下新建集合文件夹,如 blog/,放入所有 Markdown 文章
  2. 定义 Schema:在 src/content/config.ts 中配置集合规则:
ts
import { defineCollection, z } from 'astro:content';

const blog = defineCollection({
  type: 'content',
  // 用 Zod 定义文章 Front Matter 的字段与类型
  schema: z.object({
    title: z.string(),
    description: z.string(),
    pubDate: z.coerce.date(),
    tags: z.array(z.string()).default([]),
    draft: z.boolean().default(false),
  }),
});

// 导出所有集合
export const collections = { blog };
  1. 查询内容:在页面或组件中通过 API 获取文章数据:
ts
import { getCollection, getEntry } from 'astro:content';

// 获取博客集合下所有非草稿文章
const allPosts = await getCollection('blog', ({ data }) => !data.draft);

// 根据 slug 获取单篇文章
const post = await getEntry('blog', 'hello-world');

Astro生态与部署 ​

1. 集成系统(Integrations) ​

Astro 采用官方统一的集成体系,无需手动配置,一键开启扩展能力:

  • 框架集成:@astrojs/react、@astrojs/vue、@astrojs/svelte 等,启用后即可直接使用对应框架组件
  • 功能集成:@astrojs/sitemap(自动生成站点地图)、@astrojs/rss(RSS 订阅)、@astrojs/mdx(MDX 支持)
  • 部署适配器:@astrojs/vercel、@astrojs/cloudflare、@astrojs/node 等,一键适配对应平台的 SSR 部署
  • CMS 集成:支持 Contentful、Sanity、Strapi、Notion 等主流内容管理系统

2. 主题与模板 ​

Astro 官方提供了主题市场,涵盖博客、文档、官网、作品集等多种场景,既有免费开源主题,也有商业高质量主题。相比 Hexo 等老牌工具,Astro 主题的现代化程度与定制灵活性更高。

3. 主流部署方案 ​

Astro 生成的纯静态站点支持所有静态托管平台,SSR 模式可通过适配器部署到对应运行环境:

  • 静态部署:Vercel、Netlify、Cloudflare Pages、GitHub Pages,绑定仓库后自动构建部署,零配置
  • SSR/边缘部署:Vercel Edge、Cloudflare Workers、Netlify Edge Functions、Node.js 服务器
  • 国内部署:阿里云 OSS + CDN、腾讯云 COS + CDN,也可通过 Docker 部署到自有服务器

Astro优缺点分析 ​

优点 ​

  1. 性能天花板级表现:默认零 JS 输出 + 部分水合,内容站性能表现碾压传统全栈框架,SEO 友好度拉满
  2. 技术栈灵活度极高:支持多框架组件混用,不绑定单一技术生态,团队复用成本低
  3. 内容管理能力完善:内容集合 + 原生 Markdown/MDX 支持,非常适合内容创作场景
  4. 渲染模式全面:从纯静态到服务端渲染、边缘渲染无缝切换,站点可从小到大一脉相承
  5. 开发体验优秀:基于 Vite 的热更新、原生 TypeScript、简洁的组件语法,上手平滑

缺点 ​

  1. 生态成熟度仍在发展:相比 Next.js、Hexo 等老牌工具,第三方插件、主题数量仍有差距,复杂功能可能需要自行开发
  2. 动态能力有边界:核心定位是内容站,复杂的全栈应用(如后台管理系统、电商交易系统)不如 Next.js/Nuxt 顺手
  3. 存在一定学习曲线:新手需要理解群岛架构、水合时机、服务端/客户端代码边界等概念,比纯开箱即用的博客工具门槛略高
  4. 依赖 Node.js 环境:需要 Node.js 构建,相比 Hugo、Zola 等单二进制工具便携性稍差

Astro与主流静态站点工具横向对比 ​

对比维度AstroVitePressNext.js (SSG)HugoHexo
核心定位通用高性能内容站技术文档专用全栈 React 框架通用极速静态站个人博客专用
默认 JS 体积零 JS少量运行时80KB+ React 运行时零 JS少量主题 JS
组件能力多框架混用Vue 组件React 组件Go 模板EJS 等模板
构建速度快极快一般极快(天花板)一般
内容管理内容集合(类型安全)简易 Markdown需自行实现分类/标签体系Front Matter
动态扩展SSR/边缘渲染弱全栈能力完善无无
学习成本中等低较高中等低
最佳场景博客、营销官网、内容站技术项目文档全栈应用、复杂官网大内容量博客新手个人博客

Astro适用场景与选型建议 ​

推荐使用场景 ​

  1. 个人/团队博客:追求加载速度与 SEO,同时希望保留组件化定制能力,比 Hexo 上限更高
  2. 企业营销官网 / 品牌落地页:对首屏性能、SEO、视觉效果要求高,有少量交互组件需求
  3. 技术文档 / 知识手册:内容集合适合结构化管理文档,配合 MDX 可嵌入交互演示
  4. 媒体资讯 / 内容站:文章数量多、注重访问性能与搜索引擎收录
  5. 作品集 / 产品展示站:需要高颜值与动画效果,同时保证加载速度

不推荐场景 ​

  1. 重度交互的 Web 应用:如后台管理系统、SaaS 产品、在线工具等,优先选择 Next.js 或 Nuxt
  2. 完全零代码纯写作需求:如果完全不想写代码、只想要开箱即用的主题,Hexo 或 Hugo 上手更直接
  3. 超大规模内容站(数千篇以上):构建速度相比 Hugo 等编译型工具仍有差距,内容量极大时优先选 Hugo

整体而言,Astro 是当前静态站点领域的「全能优等生」——在性能、灵活性、开发体验三者之间做到了极佳的平衡,既解决了传统框架性能冗余的痛点,又保留了现代前端的组件化能力,是绝大多数内容型站点的优质选型。

Astro 从零搭建个人博客 ​

一、前置环境准备 ​

Astro 基于 Node.js 运行,搭建前需要先准备好基础环境。

1. 安装 Node.js ​

要求 Node.js 版本 ≥ 18.17.0,推荐安装 LTS 长期支持版,稳定性最好。

  • 下载地址:Node.js 官网
  • 安装全程默认下一步即可,完成后打开终端执行以下命令验证:
bash
node -v
npm -v

输出版本号即说明安装成功。

2. 安装 Git ​

用于后续代码提交、部署和主题克隆,新手可直接默认安装。

bash
git --version

二、初始化 Astro 博客项目 ​

我们从零开始搭建一个基础博客,不依赖预制模板,方便你理解每一部分的原理。

1. 创建项目 ​

打开终端,进入你想存放项目的文件夹,执行官方脚手架命令:

bash
npm create astro@latest

执行后会出现交互式引导,按以下选择即可:

  1. Where would you like to create your new project? → 输入项目名,例如 my-astro-blog
  2. How would you like to set up your new project? → 选择 Empty(空项目,从零搭建)
  3. Would you like to install dependencies? → 选择 Yes
  4. Would you like to initialize a new git repository? → 可选 Yes
  5. How would you like to configure TypeScript? → 选择 Strict(严格模式,类型提示更完善)

2. 启动本地预览 ​

项目创建完成后,进入项目目录并启动开发服务:

bash
cd my-astro-blog
npm run dev

启动成功后,打开浏览器访问 http://localhost:4321,就能看到 Astro 默认的欢迎页面。

提示:Astro 基于 Vite 构建,修改文件会毫秒级热更新,开发体验非常流畅。

三、项目核心目录结构 ​

初始化完成后,项目的核心文件和目录如下,日常开发主要操作 src 目录:

my-astro-blog/
├── public/                # 静态资源目录(图片、字体等),直接映射到站点根路径
├── src/
│   ├── components/        # 可复用组件(导航栏、卡片等)
│   ├── content/           # 内容集合目录,存放所有 Markdown 博客文章
│   ├── layouts/           # 页面布局模板,统一头部、底部结构
│   ├── pages/             # 页面路由目录,文件路径 = 访问 URL
│   └── styles/            # 全局样式文件
├── astro.config.mjs       # Astro 全局配置文件
└── package.json           # 项目依赖与脚本

四、全局基础配置 ​

打开项目根目录的 astro.config.mjs,这是 Astro 的主配置文件,我们先配置最基础的站点信息:

javascript
import { defineConfig } from 'astro/config';

// https://astro.build/config
export default defineConfig({
  // 站点正式域名,用于生成 sitemap、RSS 和绝对路径(部署前改成你的真实域名)
  site: 'https://你的域名.com',
  // 输出格式:静态站点模式
  output: 'static',
  // 启用 Markdown 代码高亮(内置 Shiki,支持百余种语言)
  markdown: {
    shikiConfig: {
      theme: 'github-dark', // 代码高亮主题
      wrap: true,
    },
  },
});

五、创建内容集合(核心功能) ​

内容集合(Content Collections)是 Astro 管理博客内容的官方标准方案,它可以给你的 Markdown 文章加上类型校验,避免字段缺失、格式错误等问题。

1. 创建内容目录 ​

在 src 目录下新建 content/blog 文件夹,所有博客文章都放在这里。

2. 配置内容集合规则 ​

在 src/content/ 目录下新建 config.ts 文件,定义博客文章的字段规范:

typescript
import { defineCollection, z } from 'astro:content';

// 定义博客集合
const blog = defineCollection({
  type: 'content',
  // 用 Zod 定义文章 Front Matter 的字段和类型
  schema: z.object({
    title: z.string(),           // 文章标题(必填)
    description: z.string(),     // 文章摘要(必填)
    pubDate: z.coerce.date(),    // 发布日期(必填)
    tags: z.array(z.string()).default([]), // 标签,默认空数组
    draft: z.boolean().default(false),     // 是否为草稿,默认 false
  }),
});

// 导出所有集合
export const collections = { blog };

配置完成后,只要文章的 Front Matter 字段不符合规则,构建时就会直接报错,从根源避免线上出现格式问题。

六、编写第一篇博客文章 ​

在 src/content/blog/ 目录下新建 hello-astro.md 文件,写入以下内容:

markdown
---
title: 你好,Astro
description: 这是我的第一篇 Astro 博客文章
pubDate: 2026-08-17
tags:
  - Astro
  - 静态站点
draft: false
---

## 欢迎来到我的博客

这是使用 **Astro** 搭建的个人博客,默认零 JavaScript 加载,速度极快。

### 代码高亮示例
```javascript
function sayHello() {
  console.log("Hello Astro!");
}

列表功能 ​

  • 极速静态渲染
  • 多框架组件混用
  • 类型安全的内容管理
文章顶部 `---` 包裹的部分是 Front Matter(元数据),对应我们刚才定义的 Schema;下方就是正常的 Markdown 正文。


## 创建页面与布局
### 1. 全局布局组件
布局组件用于统一所有页面的头部、底部、全局样式,避免重复代码。

在 `src/layouts/` 目录下新建 `BaseLayout.astro`:
```astro
---
// 组件顶部:服务端代码,构建时执行
interface Props {
  title: string;
  description?: string;
}

const { title, description = "我的个人博客" } = Astro.props;
---

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta name="description" content={description} />
    <title>{title} | 我的博客</title>
  </head>
  <body>
    <header class="site-header">
      <a href="/" class="logo">我的博客</a>
      <nav>
        <a href="/">首页</a>
        <a href="/about">关于</a>
      </nav>
    </header>

    <main class="container">
      <!-- slot 是插槽,页面内容会渲染到这里 -->
      <slot />
    </main>

    <footer class="site-footer">
      <p>© 2026 我的博客 · Powered by Astro</p>
    </footer>
  </body>
</html>

<style>
/* 组件样式默认隔离,不会污染全局 */
.site-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 1rem 0;
  border-bottom: 1px solid #eee;
  margin-bottom: 2rem;
}
.logo {
  font-size: 1.2rem;
  font-weight: bold;
  text-decoration: none;
  color: #333;
}
nav a {
  margin-left: 1.5rem;
  color: #666;
  text-decoration: none;
}
.container {
  max-width: 800px;
  margin: 0 auto;
  padding: 0 1rem;
}
.site-footer {
  text-align: center;
  padding: 2rem 0;
  margin-top: 3rem;
  color: #999;
  border-top: 1px solid #eee;
}
</style>

2. 首页(文章列表页) ​

打开 src/pages/index.astro,替换为以下内容,实现博客文章列表:

astro
---
import BaseLayout from '../layouts/BaseLayout.astro';
import { getCollection } from 'astro:content';

// 获取所有非草稿的博客文章,并按日期倒序排列
const posts = (await getCollection('blog', ({ data }) => !data.draft))
  .sort((a, b) => b.data.pubDate.getTime() - a.data.pubDate.getTime());
---

<BaseLayout title="首页" description="我的个人技术博客">
  <h1>最新文章</h1>
  <ul class="post-list">
    {posts.map((post) => (
      <li class="post-item">
        <a href={`/blog/${post.slug}/`}>
          <h2>{post.data.title}</h2>
          <p class="post-date">
            {post.data.pubDate.toLocaleDateString('zh-CN')}
          </p>
          <p class="post-desc">{post.data.description}</p>
        </a>
      </li>
    ))}
  </ul>
</BaseLayout>

<style>
.post-list {
  list-style: none;
  padding: 0;
}
.post-item {
  padding: 1.5rem 0;
  border-bottom: 1px solid #f0f0f0;
}
.post-item a {
  color: inherit;
  text-decoration: none;
}
.post-item h2 {
  margin: 0 0 0.5rem 0;
  font-size: 1.3rem;
}
.post-date {
  color: #999;
  font-size: 0.9rem;
  margin: 0 0 0.5rem 0;
}
.post-desc {
  color: #666;
  margin: 0;
}
</style>

保存后刷新首页,就能看到我们刚才写的第一篇文章了。

3. 文章详情页(动态路由) ​

我们需要通过动态路由,让每篇文章都能自动生成对应的页面。

在 src/pages/blog/ 目录下新建 [...slug].astro 文件([] 代表动态参数):

astro
---
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getCollection, getEntry } from 'astro:content';

// 静态生成所有博客文章的路径(SSG 模式必须)
export async function getStaticPaths() {
  const posts = await getCollection('blog');
  return posts.map((post) => ({
    params: { slug: post.slug },
    props: { post },
  }));
}

const { post } = Astro.props;
const { Content } = await post.render();
---

<BaseLayout title={post.data.title} description={post.data.description}>
  <article class="post-detail">
    <header class="post-header">
      <h1>{post.data.title}</h1>
      <p class="post-meta">
        {post.data.pubDate.toLocaleDateString('zh-CN')}
        {post.data.tags.length > 0 && (
          <span class="tags">
            · {post.data.tags.map(tag => `#${tag}`).join(' ')}
          </span>
        )}
      </p>
    </header>

    <!-- 渲染 Markdown 正文内容 -->
    <div class="post-content">
      <Content />
    </div>
  </article>
</BaseLayout>

<style>
.post-header {
  margin-bottom: 2rem;
  padding-bottom: 1rem;
  border-bottom: 1px solid #eee;
}
.post-header h1 {
  margin: 0 0 0.5rem 0;
  font-size: 1.8rem;
}
.post-meta {
  color: #999;
  font-size: 0.9rem;
  margin: 0;
}
.tags {
  margin-left: 0.5rem;
}
.post-content {
  line-height: 1.8;
  color: #333;
}
.post-content :global(img) {
  max-width: 100%;
  border-radius: 4px;
}
.post-content :global(code) {
  background: #f5f5f5;
  padding: 0.2rem 0.4rem;
  border-radius: 3px;
  font-size: 0.9em;
}
.post-content :global(pre) {
  padding: 1rem;
  border-radius: 6px;
  overflow-x: auto;
}
</style>

保存后,访问 http://localhost:4321/blog/hello-astro/ 就能看到完整的文章详情页了。

Astro一键安装常用官方集成 ​

Astro 提供了官方集成体系,一条命令就能安装并自动配置功能,无需手动改配置。

1. 站点地图(Sitemap) ​

自动生成 sitemap.xml,帮助搜索引擎收录:

bash
npx astro add sitemap

执行后选择确认,会自动安装依赖并写入配置。

2. RSS 订阅 ​

生成 RSS 订阅源,方便读者订阅更新:

bash
npx astro add rss

安装后在 astro.config.mjs 中配置站点信息即可使用。

3. MDX 支持 ​

支持在 Markdown 中嵌入 React/Vue 组件,实现交互式文章:

bash
npx astro add mdx

Astro部署上线(Vercel 免费方案) ​

本地调试完成后,就可以部署到线上让所有人访问了,推荐使用 Vercel,免费、速度快、自动构建。

1. 推送项目到 GitHub ​

  1. 在 GitHub 新建一个公开仓库
  2. 将本地项目代码推送到该仓库

2. 导入 Vercel 一键部署 ​

  1. 打开 Vercel 官网,用 GitHub 账号登录
  2. 点击 Add New → Project,导入刚才的博客仓库
  3. Vercel 会自动识别这是 Astro 项目,自动填好构建命令和输出目录
  4. 直接点击 Deploy 开始部署

等待 1-2 分钟构建完成,Vercel 会分配一个免费域名,直接就能访问你的博客。后续写新文章只需要提交代码到 GitHub,Vercel 会自动更新站点。

Astro日常常用命令汇总 ​

命令功能说明
npm run dev启动本地开发服务器,带热更新
npm run build构建生产环境静态文件到 dist 目录
npm run preview本地预览构建后的生产站点
npx astro add xxx安装官方集并自动配置
npx astro check检查类型错误和内容集合格式问题

Astro新手常见问题 ​

  1. 修改内容后页面没更新:确认开发服务正在运行,Astro 默认热更新;如果是配置文件修改,重启服务即可。
  2. 文章列表不显示新文章:检查 Front Matter 字段是否和 Schema 一致,draft 是否设为了 true。
  3. 部署后页面 404:检查链接路径是否正确,动态路由文件名必须是 [...slug].astro。
  4. 样式不生效:组件内样式默认隔离,要修改 Markdown 渲染的内容需要加 :global() 包裹。