
本文介绍如何修改 Eleventy 的 getAllTags 自定义过滤器,通过将标签统一转为小写并排序,避免因大小写差异(如 JavaScript / javascript)导致的输出冲突,同时提升标签列表的可读性与一致性。
本文介绍如何修改 eleventy 的 `getalltags` 自定义过滤器,通过将标签统一转为小写并排序,避免因大小写差异(如 javascript / javascript)导致的输出冲突,同时提升标签列表的可读性与一致性。
在 Eleventy 项目中,尤其是基于 eleventy-base-blog 模板时,getAllTags 过滤器常用于聚合全站所有文章的标签。但默认实现未处理大小写敏感问题——例如 JavaScript、Javascript 和 javascript 会被视为三个不同标签,不仅造成重复统计,还可能引发构建警告(如 “Output Conflict”),甚至影响归档页生成。
要彻底解决该问题,关键在于两处改造:
-
入库去重阶段:向
Set添加标签前,统一调用.toLowerCase(),确保语义相同的标签仅保留一个; -
输出准备阶段:将
Set转为数组后,使用.sort()按字典序升序排列,提升导航体验。
以下是优化后的完整过滤器代码:
eleventyConfig.addFilter("getAllTags", collection => {
let tagSet = new Set();
for (let item of collection) {
(item.data.tags || []).forEach(tag => tagSet.add(tag.toLowerCase()));
}
return Array.from(tagSet).sort();
});✅ 注意事项:
String.prototype.toLowerCase()安全兼容所有 ASCII 及常见 Unicode 字符(如带重音符号的字母),适用于多语言站点;.sort()默认按 UTF-16 编码排序,对纯英文标签完全适用;若需支持本地化排序(如中文拼音序或德语变音规则),可替换为Array.from(tagSet).sort(Intl.Collator().compare);- 原
filterTagList过滤器无需改动,它作用于已生成的标签数组,仍可正常过滤"all"或"no-show"等元标签。
最终效果:无论你在 front matter 中写 Frontend、frontend 还是 FRONTEND,它们都将被归一为 frontend 并出现在排序后的标签列表首位(取决于字母顺序)。这一改进既增强了数据一致性,也为后续实现标签云、筛选组件等高级功能打下坚实基础。

















