在使用 Eleventy(简称 11ty)构建中文博客或网站时,很多开发者喜欢在 front matter 或数据文件里使用中文标签(tags)来对文章进行分类。然而有时在构建过程中,会遇到如下类型的报错:
“Output conflict: multiple input files are writing to ./_site/tags/index.html.”
或 “DuplicatePermalinkOutputError” 提示不同输入文件写入了同一个输出路径,导致冲突。
这样的错误通常表明多个标签页面(或标签索引页)在构建时,生成了相同的 permalink,从而互相覆盖,Eleventy 检测到冲突便报错停止构建。
要修复这个问题,我们可以先分析它背后的主要原因,然后实施针对性的解决策略。
报错原因剖析:中文标签、slugify 与冲突
出现 “DuplicatePermalinkOutputError” 与 “multiple input files writing to same output” 的主要根因在于:
在标签页构建逻辑中,对中文 tags 名称通常会通过 slugify 或类似过滤器将标签名转为 URL 片段(slug)
如果 slugify 插件或过滤器不支持中文字符或处理不当(例如将中文标签转为空字符串、或所有中文标签都映射到一个空 slug),那么多个不同中文标签最终可能被“归一化”为同一个空 slug 或相同路径
当多个标签页面映射到同一个路径(比如 /tags/index.html 或 /tags//index.html),就会导致 Eleventy 认为有多个输入文件写入同一输出 文件,从而触发冲突报错
虽然 Eleventy 原生支持中文 URL(即允许 URL 路径中出现中文字符),但在使用某些 slugify 插件或自定义过滤器时可能破坏这种支持,使中文标签在路径处理阶段被“清空”或被替换为空,造成多个标签共用路径
简而言之,问题不是中文标签本身,而是 用于对标签生成 slug / permalink 的插件或过滤器对中文处理不当。
解决方案:移除或禁用 slugify 插件,使 Eleventy 原生支持中文标签
根据错误出现的根因,最直接和有效的解决方法是:不要使用那个导致中文标签映射出问题的 slugify 插件。也就是在项目中找到所有对 slugify 的引用或依赖,并将其卸载或禁用,让 Eleventy 使用其原生 URL / permalink 机制来支持中文标签。
以下是具体操作步骤:
1. 在项目中搜索 slugify 的使用位置
检查你的 Eleventy 配置文件(通常是 .eleventy.js 或类似文件)中是否手动引入或设置了 slugify 过滤器、插件或 alias。
也检查模板文件(如 .njk, .liquid, .md front matter)中是否有 | slugify, slugify(...)、slug 等调用。
2. 删除或注释掉 slugify 插件 / 过滤器引入
将配置中有关 slugify 的语句删去或注释掉,使得项目不再依赖该插件。
如果你是通过 npm 安装了 slugify 相关包,也可以执行卸载命令,如 npm uninstall slugify、npm uninstall @11ty/slugify-plugin 等(具体包名视你项目中使用的 slugify 插件而定)。
3. 确保标签页 / 分类页的构建逻辑使用默认路径或允许中文路径
在你的集合(collections)或标签页模板中,按如下思路确保每个标签有唯一路径:
- 在标签链接或 permalink 中直接使用中文标签名称作为路径片段(如果你的服务器 / 部署环境支持中文 URL),比如 /tags/中文标签/
- 或者,如果你仍需要做某种 slugify 处理,使用一个支持中文字符的 slugify 实现,确保它不会将中文字符清空
- 在模板生成标签页或标签索引时,确保每个标签对应不同的输出路径,不再有重复的 permalink
4. 构建并验证是否报错消失
完成上述修改后,重新运行 Eleventy 构建命令(通常是 npx eleventy 或 eleventy --serve 等)。
观察构建日志,看是否还有 “DuplicatePermalinkOutputError” 或 “multiple input files writing same output” 报错。
然后访问标签页面、标签索引页,检查中文标签分类页是否正常生成、链接是否正确。
总结
当你在 Eleventy 项目中使用中文 tags 并遇到 “DuplicatePermalinkOutputError” 或多文件写入冲突的报错时,不要一味怪中文本身。最常见的问题在于你项目中依赖了某个 slugify 插件或过滤器,而这个插件在处理中文字符时将其映射为空或处理不当。此时,禁用或卸载这个 slugify 插件,让 Eleventy 使用其原生中文 URL 支持,是最快、最可靠的修复方式。修改后重新构建应能消除报错,并恢复中文标签分类页的正常输出。