Table of Contents
785 words
4 minutes
Fuwari 屎山修复记录
gemini-aiAI Summary
Gemini 2.5 Pro

这个博客用的是Fuwari模板…

当然,是魔改过的。

开始修复屎山#

在开始前,大家得先知道这是个怎么样的屎山吧…

事情的起因是我尝试优化原版Fuwari的ImageWrapper组件,注意到一个TODO,似乎是动态import资源的临时实现,十分暴力,直接在项目根目录遍历所有文件强制触碰一遍,但是这临时实现在github挂了一年了。我不敢删这东西,只敢优化一下——我从在项目根目录疯狂遍历改为了在src/下遍历后缀为.jpeg .jpg .png .webp…这些图片格式的

结果没想到!直接!把站点样式干报废了!#

我对比前后dist,注意到少了一个CSS引入——让整个站点坏得这么彻底,大概是main.css。

然后我就运行了grep -r main.css,这令我大吃一惊:啊?根本没有引入啊!!!

所以问题来了,之前博客样式到底是怎么渲染的呢?我查看了我修改的ImageWrapper源码。

// ...
// TODO temporary workaround for images dynamic import
// https://github.com/withastro/astro/issues/3373
// biome-ignore lint/suspicious/noImplicitAnyLet: <check later>
let img;
if (isLocal) {
const files = import.meta.glob<ImageMetadata>("../../**", {
import: "default",
});
let normalizedPath = path
.normalize(path.join("../../", basePath, src))
.replace(/\\/g, "/");
const file = files[normalizedPath];
if (!file) {
console.error(
`\n[ERROR] Image file not found: ${normalizedPath.replace("../../", "src/")}`,
);
}
img = await file();
}
// ...

所以…这东西在…暴力import.meta.glob时触发了某种特性,加载了遍历到的main.css?虽然这很猎奇,但是我试了一下给扩展名匹配加上.css,居然真的成了…但是很显然这就是屎,不可能一直用。

所以Layout.astro是必改的,加入

import "@/styles/main.css";

然后修改ImageWrapper消除屎山:

const files = import.meta.glob<ImageMetadata>("/src/{assets,content}/**/*.{jpg,jpeg,png,gif,webp,avif}", { import: "default" });

这里做了后缀名和扫描路径限制,显著加快构建。

至此屎山修复完成。

后记#

我复盘了一下,整件事最离谱的地方在于:由于 MainGridLayout.astro 全局引用了背景 Banner,而 Banner 又恰好包裹在 ImageWrapper 里,导致这个“全盘扫描”成了维持全站样式的唯一呼吸机。

这意味着:

  • 隐性耦合:魔改者以为只是在修一个图片组件,实际上是在修整个项目的“生命维持系统”。
  • 性能债:Vite 每次构建都要被迫扫描成百上千个无关文件,仅仅是为了在混乱中“偶遇”那一个 main.css。
  • 架构隐患:万一哪天我想搞个极简模式把 Banner 关了,整个博客就会瞬间退化回原始人时代。

实在是太猎奇了…不过好歹这屎山也是被删掉了,对吧?

好吧,还有高手。别的css也是这样!特大好消息!(误)

总之真是令人大吃一惊…我看了一下Fuwari的Github仓库,注意到去年已经有人发现这个问题了(2025):https://github.com/saicaca/fuwari/issues/624

总之就写到这里了,我去改Layout.astro了,bye

Fuwari 屎山修复记录
https://wtada233.top/en/posts/fuwari-bug-css/
Author
Wtada233
Published at
2026-05-01
License
CC BY-NC-SA 4.0

Last modified on 2026-05-01

Webmentions

0 Comments

Cover
Cover
0:00 / 0:00