Skip to content

Upgrade To Astro V5

发布于:编辑此页

2024 年 1 月,我用 Astro 重构了博客,当时 v3 已经很稳定,而 v4 还在 beta 中,

2025 年 1 月,v5 发布,经过四天的折腾,终于从 v3 跨版本升级到了 v5

🎉🎉🎉

我经常会将 lovchun.com-next 进行重构或者升级,对于框架升级、数据迁移都略有经验,

这篇文章将会以 upgrade to astro v5 为例,列举一些依赖库升级过程,我的一些习惯和经验。

Node.js

任何框架进行 major 的升级,都会带来一些 Breaking Changes

升级前首先要做的就是确定你的 Node.js 是否满足框架所要求的版本,

例如 Astro@v5 的要求:

v18.17.1 or v20.3.0, v22.0.0 or higher. ( v19 and v21 are not supported.)

如果你的版本和官方要求的不一致,及时更新即可,更新版本的原则:版本号选偶不选奇

Updated docs

任何框架进行 major 的升级,基本会出两个文档:

官方甚至会发布升级工具,例如 @astrojs/upgrade,帮助你自动升级,

基本上所有的文档都是指导你如何从 pre major 升级到 latest major

如果你想跨版本升级,要么一步步的升上来,要么浏览历史文档慢慢改造项目。

Dependencies

major 所带来的新特性,除了 Astro 计划中的新功能以外,

还有些是可能是由它的依赖所带来的。

Astro 核心依赖有 ViteContentLayer,稍加关注依赖的重大更新,才能更好的使用新版本。

Content Collections API 在从 Astro 2.x 引入后,一直持续到了 4.x 版本,

Astro 5.x 使用了全新的 Content Collections,参照 官方指引 对代码做了 改造和重构

Data Migration

lovchun.com 从 16 年到现在,重构了 5 次:

LNMPSSR,再到现在的 SSG

PHPPython,再到 Nextjs,最后到现在的 Astro

Today is Astro, tomorrow is anything!

只要我还愿意写代码,不管这次重构有多费劲,下个版本或者下下一个版本我总会想用新东西重新折腾,

除了数据,其他的都不重要,样式可以改、框架可以换,

我现在会更倾向于将内容以 .md 的形式存储,只让其支持自定义 frontmatter

注意是 .md,不是 .mdx,也不是其他的东西。

我也不会在 .md 里面使用任何 Astro Component,只有纯粹的 Markdown Syntax

所有静态资源:图片、视频、字体等都存储在 /public

我相信任何 Web Framework 都会支持 /public 目录。

数据迁移现在对我来说非常简单:

其他的小功能,例如归档、列表、标签等都是基于内容所实现的,

只需要保留 html structure,移植 tailwind.config.cjs,即可还原 UI,

剩下的就是根据 frontmatter 来填充内容,即可快速迁移这些功能。

unified

程序员所写的 .md,一个刚需的特性就是 语法高亮

整个前端有很多库可以让你的 .md 支持语法高亮,比较有代表性的是:

虽然 Astro 内置了 <Code /><Prism /> 组件,语法高亮可以做到开箱即用。

但是我不建议使用任何组件来实现语法高亮,这不利于数据迁移。

所有基于 *.md 内容来渲染的站点,都会使用 unified 将其转换为 AST

因此我建议永远使用 remark-pluginrehype-plugin 来转换内容

这里列举了一些我常用的 plugins,你可以参考:

Remark Plugins

Rehype Plugins

Route

路由非常宝贵,每次迁移需要保证新的站点地图和旧的站点地图完全一致。

如果你要舍弃一些旧文章,或者重构了整站的路由,你应该使用 301 将旧的路由重定向到新的路由:

vercel.json
{
  "git": {
    "deploymentEnabled": {
      "dev": false
    }
  },
  "redirects": [
    {
      "source": "/posts/2018/2/13/(.*)",
      "destination": "/posts/product-sku-model-design",
      "statusCode": 301
    },
    {
      "source": "/posts/83089735-9b7e-4d49-bc98-43cd243e226e.html",
      "destination": "/posts/product-sku-model-design",
      "statusCode": 301
    },
    {
      "source": "/posts/july-interview-experience.html",
      "destination": "/posts/july-interview-experience",
      "statusCode": 301
    }
  ]
}

下一篇
2024 End Of Year