757 字
4 分钟

Fuwari/Firefly 升级到 Content Layer API

📝 背景介绍#

Astro v5 引入了全新的 Content Layer API,取代了之前的 Content Collections API。新 API 提供了更强大的内容管理能力和更灵活的数据源支持。

Fuwari 虽然已经升级了Astro v5,但仍然是使用Astro v4的Content Collections API,这个API在Astro v5已经不推荐使用,其实在半年前 L4Ph 就已经提交了PR到Fuwari,但仍然有一个问题未能解决,导致一直未合并到主分支,那就是封面会无法显示,现在主要就是解决这个问题,你可以不浏览此文章,直接查看PR记录即可,我目前已经提交修复封面问题的PR到Fuwari,但并不代表我的这是最优的解决方案,可以等Fuwari最终的解决方案。

如果你是使用 Fuwari,根据上面两个PR的修改就可以完成升级

本博客使用的 Firefly 已经完成更新,直接拉取最新代码即可。

🎯 修复封面#

1. 新增一个URL工具#

src/utils/url-utils.ts
/**
* 从文件完整路径中提取相对于 src 的目录路径
* 例如:src/content/posts/guide/article.md -> content/posts/guide
*/
export function getFileDirFromPath(filePath: string): string {
return filePath.replace(/^src\//, '').replace(/\/[^\/]+$/, '');
}

2. 调用工具提取封面路径#

src/components/PostCard.astro
import { getDir } from "../utils/url-utils";
import { getDir, getFileDirFromPath } from "../utils/url-utils";
// 其他代码
<ImageWrapper src={image} basePath={path.join("content/posts/", getDir(entry.id))} alt="Cover Image of the Post" class="w-full h-full">
<ImageWrapper src={image} basePath={getFileDirFromPath(entry.filePath || '')} alt="Cover Image of the Post" class="w-full h-full">
src/pages/posts/[...slug].astro
import { getDir, getPostUrlBySlug } from "@utils/url-utils";
import { getDir, getPostUrlBySlug, getFileDirFromPath } from "@utils/url-utils";
// 其他代码
{entry.data.image &&
<ImageWrapper id="post-cover" src={entry.data.image} basePath={path.join("content/posts/", getDir(entry.id))} class="mb-8 rounded-xl banner-container onload-animation"/>
}
{entry.data.image &&
<ImageWrapper id="post-cover" src={entry.data.image} basePath={getFileDirFromPath(entry.filePath || '')} class="mb-8 rounded-xl banner-container onload-animation"/>
}

3.封面无法加载的原因#

路径处理不正确,entry.id 包含文件扩展名

  • 在 v4 中:entry.slug = "guide/article"getDir() 返回 "guide/"
  • 在 v5 中:entry.id = "guide/article.md"(包含扩展名),导致路径错误
  • 解决方案:使用 getFileDirFromPath(entry.filePath) 直接从文件路径提取目录
    • entry.filePath = "src/content/posts/guide/article.md"
    • getFileDirFromPath() 返回 "content/posts/guide"

✅ 升级检查清单#

完成升级后,请检查以下项目:

  • tsconfig.jsonmoduleResolution 改为 bundler
  • 配置文件移动到 src/content.config.ts 并添加 loader
  • 所有 entry.slug 替换为 entry.id
  • 所有 entry.render() 替换为 render(entry)
  • URL 生成时移除文件扩展名
  • 图片路径使用 getFileDirFromPath() 处理
  • 更新所有组件的 props(slugid
  • RSS 和其他页面中的链接更新
  • 测试所有文章页面是否正常显示
  • 测试图片资源是否正确加载
  • 测试导航和链接是否正常工作

🎨 关键差异对比#

特性Astro v4Astro v5
配置文件位置src/content/config.tssrc/content.config.ts
内容加载自动扫描显式 loader
文章标识符entry.slugentry.id
渲染方法entry.render()render(entry)
模块解析Nodebundler

📚 参考资料#


💡 提示:升级过程中建议先创建一个新分支,完成所有更改并测试通过后再合并到主分支。

赞助支持

如果这篇文章对你有帮助,欢迎赞助支持!

赞助
Fuwari/Firefly 升级到 Content Layer API
https://blog.cuteleaf.cn/posts/dev-notes/astro-v5-content-layer-update/
作者
夏叶
发布于
2025-11-17
许可协议
CC BY-NC-SA 4.0
最后更新于 2025-11-17,距今已过 19 天

部分内容可能已过时

评论区

目录