@jet-w/astro-blog 0.1.6 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/dist/chunk-6D3XRDNY.js +145 -0
  2. package/dist/chunk-A2E2VSAQ.js +246 -0
  3. package/dist/{chunk-GYLSY3OJ.js → chunk-TJTPX2WP.js} +1 -1
  4. package/dist/config/index.d.ts +3 -47
  5. package/dist/config/index.js +18 -2
  6. package/dist/i18n-PgMCFBw0.d.ts +222 -0
  7. package/dist/index.d.ts +204 -7
  8. package/dist/index.js +255 -3
  9. package/dist/integration.d.ts +9 -1
  10. package/dist/integration.js +2 -1
  11. package/dist/{sidebar-DNdiCKBw.d.ts → sidebar-Da-W_4Lr.d.ts} +1 -1
  12. package/dist/utils/sidebar.d.ts +1 -1
  13. package/package.json +1 -1
  14. package/src/components/blog/FloatingToc.vue +11 -3
  15. package/src/components/blog/Hero.astro +17 -2
  16. package/src/components/blog/NavigationTabs.vue +46 -15
  17. package/src/components/blog/PostCard.astro +28 -10
  18. package/src/components/blog/RelatedPosts.astro +23 -7
  19. package/src/components/blog/TableOfContents.astro +10 -4
  20. package/src/components/blog/TagCloud.astro +4 -3
  21. package/src/components/home/FeaturedPostsSection.astro +22 -6
  22. package/src/components/home/QuickNavSection.astro +33 -4
  23. package/src/components/home/RecentPostsSection.astro +22 -6
  24. package/src/components/home/StatsSection.astro +24 -6
  25. package/src/components/layout/Footer.astro +36 -20
  26. package/src/components/layout/Header.astro +75 -17
  27. package/src/components/layout/Sidebar.astro +40 -25
  28. package/src/components/ui/LanguageSwitcher.vue +183 -0
  29. package/src/components/ui/SearchBox.vue +13 -5
  30. package/src/components/ui/SearchInterface.vue +49 -25
  31. package/src/layouts/BaseLayout.astro +77 -52
  32. package/src/layouts/PageLayout.astro +22 -27
  33. package/src/layouts/SlidesLayout.astro +14 -2
  34. package/src/pages/archives/[year]/[month].astro +36 -17
  35. package/src/pages/archives/index.astro +36 -20
  36. package/src/pages/categories/[category].astro +33 -16
  37. package/src/pages/categories/index.astro +37 -14
  38. package/src/pages/posts/[...slug].astro +125 -18
  39. package/src/pages/posts/index.astro +59 -37
  40. package/src/pages/posts/page/[page].astro +65 -27
  41. package/src/pages/rss.xml.ts +18 -6
  42. package/src/pages/search.astro +50 -14
  43. package/src/pages/slides/index.astro +25 -6
  44. package/src/pages/tags/[tag].astro +32 -15
  45. package/src/pages/tags/index.astro +39 -16
  46. package/src/plugins/remark-containers.mjs +351 -322
  47. package/src/plugins/remark-protect-code.mjs +69 -0
  48. package/src/styles/global.css +35 -1
  49. package/templates/default/.claude/ralph-loop.local.md +48 -0
  50. package/templates/default/astro.config.mjs +33 -4
  51. package/templates/default/content/posts/blog_docs_en/01.get-started/01-intro.md +81 -0
  52. package/templates/default/content/posts/blog_docs_en/01.get-started/02-install.md +137 -0
  53. package/templates/default/content/posts/blog_docs_en/01.get-started/03-create-post.md +176 -0
  54. package/templates/default/content/posts/blog_docs_en/01.get-started/04-structure.md +173 -0
  55. package/templates/default/content/posts/blog_docs_en/01.get-started/05-deploy.md +208 -0
  56. package/templates/default/content/posts/blog_docs_en/01.get-started/README.md +52 -0
  57. package/templates/default/content/posts/blog_docs_en/02.guide/02-containers.md +245 -0
  58. package/templates/default/content/posts/blog_docs_en/02.guide/03-code-blocks.md +207 -0
  59. package/templates/default/content/posts/blog_docs_en/02.guide/03-mermaid.md +194 -0
  60. package/templates/default/content/posts/blog_docs_en/02.guide/04-icons.md +229 -0
  61. package/templates/default/content/posts/blog_docs_en/02.guide/06-latex.md +233 -0
  62. package/templates/default/content/posts/blog_docs_en/02.guide/07-video.md +184 -0
  63. package/templates/default/content/posts/blog_docs_en/02.guide/08-slides.md +359 -0
  64. package/templates/default/content/posts/blog_docs_en/02.guide/README.md +213 -0
  65. package/templates/default/content/posts/blog_docs_en/03.config/01-site.md +208 -0
  66. package/templates/default/content/posts/blog_docs_en/03.config/02-sidebar.md +240 -0
  67. package/templates/default/content/posts/blog_docs_en/03.config/03-i18n.md +349 -0
  68. package/templates/default/content/posts/blog_docs_en/03.config/README.md +85 -0
  69. package/templates/default/content/posts/blog_docs_en/README.md +79 -0
  70. package/templates/default/content/posts/blog_docs_zh/01.get-started/01-intro.md +81 -0
  71. package/templates/default/content/posts/blog_docs_zh/01.get-started/02-install.md +137 -0
  72. package/templates/default/content/posts/blog_docs_zh/01.get-started/03-create-post.md +176 -0
  73. package/templates/default/content/posts/blog_docs_zh/01.get-started/04-structure.md +173 -0
  74. package/templates/default/content/posts/blog_docs_zh/01.get-started/05-deploy.md +208 -0
  75. package/templates/default/content/posts/blog_docs_zh/01.get-started/README.md +52 -0
  76. package/templates/default/content/posts/blog_docs_zh/02.guide/02-containers.md +245 -0
  77. package/templates/default/content/posts/blog_docs_zh/02.guide/03-code-blocks.md +206 -0
  78. package/templates/default/content/posts/blog_docs_zh/02.guide/03-mermaid.md +194 -0
  79. package/templates/default/content/posts/blog_docs_zh/02.guide/04-icons.md +229 -0
  80. package/templates/default/content/posts/blog_docs_zh/02.guide/06-latex.md +233 -0
  81. package/templates/default/content/posts/blog_docs_zh/02.guide/07-video.md +184 -0
  82. package/templates/default/content/posts/blog_docs_zh/02.guide/08-slides.md +359 -0
  83. package/templates/default/content/posts/blog_docs_zh/02.guide/README.md +213 -0
  84. package/templates/default/content/posts/blog_docs_zh/03.config/01-site.md +208 -0
  85. package/templates/default/content/posts/blog_docs_zh/03.config/02-sidebar.md +240 -0
  86. package/templates/default/content/posts/blog_docs_zh/03.config/03-i18n.md +348 -0
  87. package/templates/default/content/posts/blog_docs_zh/03.config/README.md +85 -0
  88. package/templates/default/content/posts/blog_docs_zh/README.md +78 -0
  89. package/templates/default/package-lock.json +9667 -0
  90. package/templates/default/package.json +1 -1
  91. package/templates/default/src/config/footer.ts +14 -11
  92. package/templates/default/src/config/locales/en/footer.ts +17 -0
  93. package/templates/default/src/config/locales/en/index.ts +20 -0
  94. package/templates/default/src/config/locales/en/menu.ts +14 -0
  95. package/templates/default/src/config/locales/en/sidebar.ts +34 -0
  96. package/templates/default/src/config/locales/en/site.ts +7 -0
  97. package/templates/default/src/config/locales/en/ui.ts +29 -0
  98. package/templates/default/src/config/locales/index.ts +7 -0
  99. package/templates/default/src/config/locales/zh-CN/footer.ts +17 -0
  100. package/templates/default/src/config/locales/zh-CN/index.ts +20 -0
  101. package/templates/default/src/config/locales/zh-CN/menu.ts +14 -0
  102. package/templates/default/src/config/locales/zh-CN/sidebar.ts +34 -0
  103. package/templates/default/src/config/locales/zh-CN/site.ts +7 -0
  104. package/templates/default/src/config/locales/zh-CN/ui.ts +29 -0
  105. package/templates/default/src/config/sidebar.ts +10 -12
  106. package/templates/default/src/config/site.ts +2 -2
  107. package/templates/default/src/content.config.ts +15 -3
  108. package/templates/default/src/env.d.ts +7 -0
  109. package/dist/chunk-MQXPSOYB.js +0 -124
  110. package/templates/default/content/posts/blog_docs/01-quick-start.md +0 -162
  111. package/templates/default/content/posts/blog_docs/02-frontmatter.md +0 -277
  112. package/templates/default/content/posts/blog_docs/03-markdown-basic.md +0 -350
  113. package/templates/default/content/posts/blog_docs/04-containers.md +0 -331
  114. package/templates/default/content/posts/blog_docs/05-code-blocks.md +0 -388
  115. package/templates/default/content/posts/blog_docs/06-mermaid.md +0 -431
  116. package/templates/default/content/posts/blog_docs/07-video.md +0 -243
  117. package/templates/default/content/posts/blog_docs/08-latex.md +0 -382
  118. package/templates/default/content/posts/blog_docs/09-icons.md +0 -326
  119. package/templates/default/content/posts/blog_docs/10-sidebar.md +0 -445
  120. package/templates/default/content/posts/blog_docs/11-config.md +0 -334
  121. package/templates/default/content/posts/blog_docs/12-slides.mdx +0 -552
  122. package/templates/default/content/posts/blog_docs/README.md +0 -151
@@ -0,0 +1,137 @@
1
+ ---
2
+ title: 安装
3
+ description: 设置你的开发环境并安装 Astro 博客
4
+ pubDate: 2025-01-01
5
+ author: jet-w
6
+ categories:
7
+ - 文档
8
+ tags:
9
+ - 入门
10
+ - 安装
11
+ ---
12
+
13
+ # 安装
14
+
15
+ 本指南将帮助你在电脑上设置 Astro 博客。
16
+
17
+ ## 前置要求
18
+
19
+ 在开始之前,请确保你已具备:
20
+
21
+ ### Node.js
22
+
23
+ 需要 Node.js 18.x 或更高版本。
24
+
25
+ ```bash
26
+ # 检查你的 Node.js 版本
27
+ node --version
28
+ # 应该输出:v18.x.x 或更高
29
+ ```
30
+
31
+ ::: tip 安装 Node.js
32
+ 如果你没有 Node.js,请从 [nodejs.org](https://nodejs.org) 下载。
33
+ 选择 **LTS** 版本以获得最佳稳定性。
34
+ :::
35
+
36
+ ### 包管理器
37
+
38
+ npm 随 Node.js 一起安装。你也可以使用 pnpm 或 yarn:
39
+
40
+ ```bash
41
+ # 检查 npm 版本
42
+ npm --version
43
+
44
+ # 或使用 pnpm(推荐,安装更快)
45
+ npm install -g pnpm
46
+ pnpm --version
47
+ ```
48
+
49
+ ## 安装依赖
50
+
51
+ 进入你的博客项目文件夹并安装依赖:
52
+
53
+ ```bash
54
+ # 使用 npm
55
+ npm install
56
+
57
+ # 或使用 pnpm
58
+ pnpm install
59
+ ```
60
+
61
+ 这将安装 `package.json` 中定义的所有必需包。
62
+
63
+ ## 启动开发服务器
64
+
65
+ 启动本地开发服务器:
66
+
67
+ ```bash
68
+ # 使用 npm
69
+ npm run dev
70
+
71
+ # 或使用 pnpm
72
+ pnpm dev
73
+ ```
74
+
75
+ 你应该看到类似这样的输出:
76
+
77
+ ```
78
+ 🚀 astro v5.x.x ready in 1234ms
79
+
80
+ ┃ Local http://localhost:4321/
81
+ ┃ Network use --host to expose
82
+ ```
83
+
84
+ ::: tip 热重载
85
+ 开发服务器支持热重载。当你保存文件时,浏览器会自动刷新以显示你的更改。
86
+ :::
87
+
88
+ ## 在浏览器中打开
89
+
90
+ 在浏览器中访问 `http://localhost:4321`。你应该能看到你的博客首页!
91
+
92
+ ## 验证安装
93
+
94
+ 检查一切是否正常工作:
95
+
96
+ 1. **首页加载** - 你看到博客首页
97
+ 2. **文章列表** - 导航到 `/posts` 查看文章
98
+ 3. **深色模式** - 切换顶部的主题开关
99
+ 4. **搜索** - 尝试搜索功能
100
+
101
+ ## 常见问题
102
+
103
+ ### 端口已被占用
104
+
105
+ 如果端口 4321 被占用,Astro 会使用其他端口。检查终端输出获取实际 URL。
106
+
107
+ 或者指定不同的端口:
108
+
109
+ ```bash
110
+ npm run dev -- --port 3000
111
+ ```
112
+
113
+ ### 依赖安装失败
114
+
115
+ 尝试清除缓存:
116
+
117
+ ```bash
118
+ # 删除 node_modules 和 lock 文件
119
+ rm -rf node_modules package-lock.json
120
+
121
+ # 重新安装
122
+ npm install
123
+ ```
124
+
125
+ ### Node.js 版本过旧
126
+
127
+ 将 Node.js 更新到 18 或更高版本。考虑使用 [nvm](https://github.com/nvm-sh/nvm) 来管理 Node 版本:
128
+
129
+ ```bash
130
+ # 安装 nvm 后:
131
+ nvm install 20
132
+ nvm use 20
133
+ ```
134
+
135
+ ---
136
+
137
+ 开发服务器运行起来了吗?太好了!让我们 [创建你的第一篇文章](./03-create-post)。
@@ -0,0 +1,176 @@
1
+ ---
2
+ title: 创建第一篇文章
3
+ description: 编写并发布你的第一篇博客文章
4
+ pubDate: 2025-01-01
5
+ author: jet-w
6
+ categories:
7
+ - 文档
8
+ tags:
9
+ - 入门
10
+ - 写作
11
+ ---
12
+
13
+ # 创建第一篇文章
14
+
15
+ 让我们来写你的第一篇博客文章!这才是真正有趣的开始。
16
+
17
+ ## 文章存放位置
18
+
19
+ 所有博客文章都放在 `content/posts/` 目录:
20
+
21
+ ```
22
+ content/
23
+ └── posts/
24
+ ├── my-first-post.md ← 你的文章放在这里
25
+ ├── another-post.md
26
+ └── tech/ ← 或者放在子目录中
27
+ └── tutorial.md
28
+ ```
29
+
30
+ ## 创建新文章
31
+
32
+ 在 `content/posts/` 中创建一个名为 `hello-world.md` 的文件:
33
+
34
+ ```markdown
35
+ ---
36
+ title: Hello World
37
+ description: 我的第一篇博客文章
38
+ pubDate: 2025-01-15
39
+ author: 你的名字
40
+ tags:
41
+ - 介绍
42
+ categories:
43
+ - 个人
44
+ ---
45
+
46
+ # Hello World
47
+
48
+ 欢迎来到我的博客!这是我的第一篇文章。
49
+
50
+ ## 我为什么开始写博客
51
+
52
+ 我开始写这个博客是为了:
53
+
54
+ 1. 分享我学到的东西
55
+ 2. 记录我的旅程
56
+ 3. 与他人建立联系
57
+
58
+ > 最好的开始时间是昨天,其次是现在。
59
+
60
+ ## 接下来
61
+
62
+ 敬请期待更多关于以下内容的文章:
63
+
64
+ - Web 开发
65
+ - 我的项目
66
+ - 经验教训
67
+
68
+ 感谢阅读!
69
+ ```
70
+
71
+ ## 查看你的文章
72
+
73
+ 保存文件后访问:
74
+
75
+ ```
76
+ http://localhost:4321/posts/hello-world
77
+ ```
78
+
79
+ 你的文章应该会以完整的样式呈现!
80
+
81
+ ## 理解 Frontmatter
82
+
83
+ `---` 标记之间的部分称为 **frontmatter**。它包含文章的元数据:
84
+
85
+ ```yaml
86
+ ---
87
+ title: Hello World # 必填 - 文章标题
88
+ description: 我的第一篇文章 # 用于 SEO 和预览
89
+ pubDate: 2025-01-15 # 发布日期
90
+ author: 你的名字 # 作者名称
91
+ tags: # 标签(数组)
92
+ - 介绍
93
+ categories: # 分类(数组)
94
+ - 个人
95
+ draft: false # true = 从列表中隐藏
96
+ star: false # true = 精选文章
97
+ ---
98
+ ```
99
+
100
+ ::: tip 必填与可选
101
+ 只有 `title` 是必填的。其他字段都是可选的,但建议填写以便更好地组织和优化 SEO。
102
+ :::
103
+
104
+ ## 使用子目录
105
+
106
+ 使用子目录来组织相关文章:
107
+
108
+ ```
109
+ content/posts/
110
+ ├── tutorials/
111
+ │ ├── README.md ← 显示在 /posts/tutorials
112
+ │ ├── javascript.md ← 显示在 /posts/tutorials/javascript
113
+ │ └── css.md ← 显示在 /posts/tutorials/css
114
+ └── projects/
115
+ └── my-app.md ← 显示在 /posts/projects/my-app
116
+ ```
117
+
118
+ ### 目录 README
119
+
120
+ 每个目录可以有一个 `README.md` 作为该目录的索引页面:
121
+
122
+ ```markdown
123
+ ---
124
+ title: 教程
125
+ description: 一步步学习 Web 开发
126
+ ---
127
+
128
+ # 教程
129
+
130
+ 欢迎来到我的教程专区!
131
+
132
+ - [JavaScript 基础](./javascript)
133
+ - [CSS 技巧](./css)
134
+ ```
135
+
136
+ ## URL 路径规则
137
+
138
+ 你的文件路径决定了 URL:
139
+
140
+ | 文件路径 | URL |
141
+ |----------|-----|
142
+ | `posts/hello.md` | `/posts/hello` |
143
+ | `posts/tech/intro.md` | `/posts/tech/intro` |
144
+ | `posts/tech/README.md` | `/posts/tech` |
145
+
146
+ ::: info 大小写不敏感
147
+ URL 会自动转为小写。`Hello-World.md` 变成 `/posts/hello-world`。
148
+ :::
149
+
150
+ ## 添加图片
151
+
152
+ 将图片放在 `public/images/` 目录并引用:
153
+
154
+ ```markdown
155
+ ![我的照片](/images/photo.jpg)
156
+ ```
157
+
158
+ 对于文章专用的图片,你可以创建一个文件夹:
159
+
160
+ ```
161
+ public/
162
+ └── images/
163
+ └── posts/
164
+ └── hello-world/
165
+ └── cover.jpg
166
+ ```
167
+
168
+ 然后使用:
169
+
170
+ ```markdown
171
+ ![封面](/images/posts/hello-world/cover.jpg)
172
+ ```
173
+
174
+ ---
175
+
176
+ 恭喜你发布了第一篇文章!接下来,让我们了解 [项目结构](./04-structure)。
@@ -0,0 +1,173 @@
1
+ ---
2
+ title: 项目结构
3
+ description: 了解文件和文件夹的组织方式
4
+ pubDate: 2025-01-01
5
+ author: jet-w
6
+ categories:
7
+ - 文档
8
+ tags:
9
+ - 入门
10
+ - 结构
11
+ ---
12
+
13
+ # 项目结构
14
+
15
+ 了解项目结构有助于你知道在哪里查找和放置文件。
16
+
17
+ ## 概览
18
+
19
+ ```
20
+ your-blog/
21
+ ├── content/ # 你的内容
22
+ │ ├── posts/ # 博客文章
23
+ │ └── pages/ # 独立页面
24
+ ├── public/ # 静态资源
25
+ │ ├── images/ # 图片
26
+ │ └── videos/ # 视频
27
+ ├── src/
28
+ │ ├── config/ # 配置文件
29
+ │ │ ├── locales/ # 语言配置
30
+ │ │ ├── site.ts # 站点设置
31
+ │ │ └── ...
32
+ │ └── ...
33
+ ├── astro.config.mjs # Astro 配置
34
+ └── package.json # 依赖
35
+ ```
36
+
37
+ ## 内容目录
38
+
39
+ 这是你的内容存放的地方:
40
+
41
+ ### posts/
42
+
43
+ Markdown 或 MDX 格式的博客文章:
44
+
45
+ ```
46
+ content/posts/
47
+ ├── hello-world.md # 单篇文章
48
+ ├── tutorials/ # 分类文件夹
49
+ │ ├── README.md # 分类索引
50
+ │ └── getting-started.md
51
+ └── blog_docs_zh/ # 文档
52
+ └── ...
53
+ ```
54
+
55
+ ### pages/
56
+
57
+ 独立页面,如关于、联系:
58
+
59
+ ```
60
+ content/pages/
61
+ ├── about.md # /about
62
+ └── contact.md # /contact
63
+ ```
64
+
65
+ ## Public 目录
66
+
67
+ 直接提供的静态文件:
68
+
69
+ ```
70
+ public/
71
+ ├── images/ # 图片
72
+ │ ├── avatar.jpg # /images/avatar.jpg
73
+ │ └── posts/ # 文章图片
74
+ ├── videos/ # 视频
75
+ ├── favicon.svg # 站点图标
76
+ └── robots.txt # SEO 文件
77
+ ```
78
+
79
+ ::: tip 直接访问
80
+ `public/` 中的文件在根 URL 提供。
81
+ `public/images/cat.jpg` → `https://yoursite.com/images/cat.jpg`
82
+ :::
83
+
84
+ ## 配置目录
85
+
86
+ 站点配置文件:
87
+
88
+ ```
89
+ src/config/
90
+ ├── locales/ # 语言特定配置
91
+ │ ├── en/ # 英文
92
+ │ │ ├── index.ts
93
+ │ │ ├── site.ts
94
+ │ │ ├── menu.ts
95
+ │ │ ├── footer.ts
96
+ │ │ └── sidebar.ts
97
+ │ └── zh-CN/ # 中文
98
+ │ └── ...
99
+ ├── site.ts # 默认站点配置
100
+ ├── menu.ts # 默认菜单
101
+ ├── sidebar.ts # 侧边栏设置
102
+ ├── footer.ts # 页脚设置
103
+ └── social.ts # 社交链接
104
+ ```
105
+
106
+ ## 关键配置文件
107
+
108
+ ### astro.config.mjs
109
+
110
+ 主要 Astro 配置:
111
+
112
+ ```javascript
113
+ export default defineConfig({
114
+ integrations: [
115
+ astroBlog({ i18n: i18nConfig }),
116
+ vue(),
117
+ tailwind(),
118
+ ],
119
+ site: 'https://yourdomain.com',
120
+ });
121
+ ```
122
+
123
+ ### src/config/site.ts
124
+
125
+ 站点元数据:
126
+
127
+ ```typescript
128
+ export const siteConfig = {
129
+ title: '我的博客',
130
+ description: '一个关于...',
131
+ author: '你的名字',
132
+ avatar: '/images/avatar.jpg',
133
+ };
134
+ ```
135
+
136
+ ### src/config/menu.ts
137
+
138
+ 导航链接:
139
+
140
+ ```typescript
141
+ export const menu = [
142
+ { name: '首页', href: '/', icon: 'home' },
143
+ { name: '文章', href: '/posts', icon: 'posts' },
144
+ { name: '关于', href: '/about', icon: 'about' },
145
+ ];
146
+ ```
147
+
148
+ ## 文件命名规范
149
+
150
+ | 类型 | 规范 | 示例 |
151
+ |------|------|------|
152
+ | 文章 | 小写加短横线 | `my-first-post.md` |
153
+ | 配置 | camelCase 或 kebab | `site.ts`, `menu.ts` |
154
+ | 图片 | 描述性名称 | `hero-banner.jpg` |
155
+
156
+ ::: warning 避免空格
157
+ 不要在文件名中使用空格。使用短横线代替:
158
+ - ❌ `my first post.md`
159
+ - ✅ `my-first-post.md`
160
+ :::
161
+
162
+ ## 各文件夹的作用
163
+
164
+ | 文件夹 | 用途 | 你应该... |
165
+ |--------|------|-----------|
166
+ | `content/posts/` | 博客文章 | 在这里添加你的文章 |
167
+ | `content/pages/` | 静态页面 | 添加关于、联系页面 |
168
+ | `public/` | 静态资源 | 放置图片、文件 |
169
+ | `src/config/` | 设置 | 自定义你的站点 |
170
+
171
+ ---
172
+
173
+ 现在你了解了结构!让我们学习如何 [部署你的博客](./05-deploy)。
@@ -0,0 +1,208 @@
1
+ ---
2
+ title: 部署
3
+ description: 构建并部署你的博客到 GitHub Pages
4
+ pubDate: 2025-01-01
5
+ author: jet-w
6
+ categories:
7
+ - 文档
8
+ tags:
9
+ - 入门
10
+ - 部署
11
+ ---
12
+
13
+ # 部署
14
+
15
+ 是时候与世界分享你的博客了!本指南介绍如何部署到 GitHub Pages。
16
+
17
+ ## 构建生产版本
18
+
19
+ 首先,创建生产构建:
20
+
21
+ ```bash
22
+ npm run build
23
+ ```
24
+
25
+ 这会创建一个包含静态文件的 `dist/` 文件夹:
26
+
27
+ ```
28
+ dist/
29
+ ├── index.html
30
+ ├── posts/
31
+ │ └── hello-world/
32
+ │ └── index.html
33
+ ├── assets/
34
+ │ ├── styles.css
35
+ │ └── scripts.js
36
+ └── ...
37
+ ```
38
+
39
+ ## 本地预览
40
+
41
+ 部署前测试构建:
42
+
43
+ ```bash
44
+ npm run preview
45
+ ```
46
+
47
+ 访问 `http://localhost:4321` 验证一切正常。
48
+
49
+ ## 部署到 GitHub Pages
50
+
51
+ ### 步骤 1: 配置 Astro
52
+
53
+ 更新你的 `astro.config.mjs`:
54
+
55
+ ```javascript
56
+ import { defineConfig } from 'astro/config';
57
+
58
+ export default defineConfig({
59
+ site: 'https://username.github.io',
60
+ base: '/repo-name/', // 仅在不使用自定义域名时需要
61
+ });
62
+ ```
63
+
64
+ ::: tip 自定义域名
65
+ 如果使用自定义域名(如 `myblog.com`),设置 `base: '/'` 或完全移除它。
66
+ :::
67
+
68
+ ### 步骤 2: 创建 GitHub Actions 工作流
69
+
70
+ 创建 `.github/workflows/deploy.yml`:
71
+
72
+ ```yaml
73
+ name: Deploy to GitHub Pages
74
+
75
+ on:
76
+ push:
77
+ branches: [main]
78
+ workflow_dispatch:
79
+
80
+ permissions:
81
+ contents: read
82
+ pages: write
83
+ id-token: write
84
+
85
+ concurrency:
86
+ group: "pages"
87
+ cancel-in-progress: false
88
+
89
+ jobs:
90
+ build:
91
+ runs-on: ubuntu-latest
92
+ steps:
93
+ - name: Checkout
94
+ uses: actions/checkout@v4
95
+
96
+ - name: Setup Node
97
+ uses: actions/setup-node@v4
98
+ with:
99
+ node-version: 20
100
+ cache: 'npm'
101
+
102
+ - name: Install dependencies
103
+ run: npm ci
104
+
105
+ - name: Build
106
+ run: npm run build
107
+
108
+ - name: Upload artifact
109
+ uses: actions/upload-pages-artifact@v3
110
+ with:
111
+ path: dist/
112
+
113
+ deploy:
114
+ needs: build
115
+ runs-on: ubuntu-latest
116
+ environment:
117
+ name: github-pages
118
+ url: ${{ steps.deployment.outputs.page_url }}
119
+ steps:
120
+ - name: Deploy to GitHub Pages
121
+ id: deployment
122
+ uses: actions/deploy-pages@v4
123
+ ```
124
+
125
+ ### 步骤 3: 启用 GitHub Pages
126
+
127
+ 1. 在 GitHub 上打开你的仓库
128
+ 2. 导航到 **Settings** → **Pages**
129
+ 3. 在 "Build and deployment" 下,选择 **GitHub Actions** 作为来源
130
+ 4. 将代码推送到 `main` 分支
131
+
132
+ 你的站点将可在 `https://username.github.io/repo-name/` 访问
133
+
134
+ ### 步骤 4: 自定义域名(可选)
135
+
136
+ 要使用自定义域名:
137
+
138
+ 1. **添加 CNAME 文件**: 创建 `public/CNAME` 并写入你的域名:
139
+ ```
140
+ myblog.com
141
+ ```
142
+
143
+ 2. **配置 DNS**: 在你的域名注册商添加以下记录:
144
+ - **A 记录**(用于顶级域名如 `myblog.com`):
145
+ ```
146
+ 185.199.108.153
147
+ 185.199.109.153
148
+ 185.199.110.153
149
+ 185.199.111.153
150
+ ```
151
+ - **CNAME 记录**(用于 `www` 子域名):
152
+ ```
153
+ www -> username.github.io
154
+ ```
155
+
156
+ 3. **更新 Astro 配置**:
157
+ ```javascript
158
+ export default defineConfig({
159
+ site: 'https://myblog.com',
160
+ // 自定义域名不需要 base
161
+ });
162
+ ```
163
+
164
+ 4. **在 GitHub 中启用**: 在仓库 Settings → Pages 中,添加你的自定义域名
165
+
166
+ ::: info SSL 证书
167
+ GitHub 会自动提供免费的 SSL 证书。可能需要最多 24 小时生效。
168
+ :::
169
+
170
+ ## 部署清单
171
+
172
+ 部署前验证:
173
+
174
+ - [ ] `npm run build` 无错误完成
175
+ - [ ] `npm run preview` 正确显示站点
176
+ - [ ] 所有链接正常工作(无断链)
177
+ - [ ] 图片正确加载
178
+ - [ ] Meta 标签已设置(标题、描述)
179
+ - [ ] Favicon 已配置
180
+
181
+ ## 持续部署
182
+
183
+ 配置完成后,你的站点会自动更新:
184
+
185
+ ```bash
186
+ git add .
187
+ git commit -m "添加新博客文章"
188
+ git push origin main
189
+ # 站点在约 1-2 分钟内自动更新!
190
+ ```
191
+
192
+ ## 其他部署选项
193
+
194
+ 这个博客可以部署到任何静态托管平台:
195
+
196
+ - **Vercel** - 零配置 Astro 支持,全球 CDN
197
+ - **Netlify** - 简单设置,支持表单处理
198
+ - **Cloudflare Pages** - 快速边缘网络,免费套餐
199
+ - **AWS S3 + CloudFront** - 可扩展的云托管
200
+ - **Firebase Hosting** - Google 的托管平台
201
+
202
+ 有关这些平台的详细说明,请参阅 [Astro 部署指南](https://docs.astro.build/en/guides/deploy/)。
203
+
204
+ ---
205
+
206
+ 恭喜!你已完成快速入门指南。
207
+
208
+ 继续学习 [写作指南](/posts/blog_docs_zh/02.guide) 来掌握内容创作。