
本文介绍如何修改 Eleventy 的 getAllTags 自定义过滤器,通过将标签统一转为小写并排序,消除大小写差异导致的重复(如 JavaScript/JavaScript/javascript),提升标签集合的准确性与可读性。
本文介绍如何修改 eleventy 的 `getalltags` 自定义过滤器,通过将标签统一转为小写并排序,消除大小写差异导致的重复(如 javascript/javascript/javascript),提升标签集合的准确性与可读性。
Eleventy 默认不规范处理标签大小写,这会导致同一语义标签因大小写不同(如 JavaScript、Javascript、javascript)被识别为多个独立标签,不仅造成数据冗余,还可能触发构建时的“Output Conflict”错误——即多个页面尝试输出到同一 URL(例如 /tags/JavaScript/ 和 /tags/javascript/)。解决这一问题的关键在于标准化输入与规范化输出。
最稳妥的做法是在标签收集阶段就完成标准化:使用 String.prototype.toLowerCase() 统一转小写,再借助 Set 的唯一性自动去重;最后用 Array.prototype.sort() 对结果数组进行字典序升序排列。以下是优化后的 getAllTags 过滤器实现:
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();
});✅ 说明:
tag.toLowerCase()确保所有标签以小写形式存入Set,自然合并大小写变体;Array.from(tagSet)将去重后的集合转为数组;.sort()默认按字符串 Unicode 编码排序,对纯英文标签即为标准字母序(如css,html,javascript,typescript);- 原有的
filterTagList过滤器(用于排除"all"和"no-show")仍可照常链式调用,例如:{{ collections.posts | getAllTags | filterTagList | join: ", " }}。
⚠️ 注意事项:
- 若项目中存在含空格或特殊字符的标签(如
"web dev"),toLowerCase()同样适用,但需确保模板中渲染逻辑能正确处理; - 如需支持国际化排序(如中文、带重音符号的西文),应改用
localeCompare:.sort((a, b) => a.localeCompare(b)); - 此方案不影响原始 front matter 中的标签书写形式——仅作用于生成的标签集合,保持源内容的可读性与作者习惯。
通过这一简明改造,你不仅能彻底规避大小写引发的冲突,还能获得结构清晰、便于导航的标签列表,为博客的分类体系打下坚实基础。

















