Eleventy重命名index.html为index.njk报错及reverse过滤器失效问题
问题根因
两个问题完全关联,核心是Eleventy未正确识别Nunjucks模板引擎:
- 改后缀后抛出
str.indexOf is not a function,是因为.njk文件没有匹配到Nunjucks编译流程,编译函数接收到的入参不是字符串类型,调用字符串原生方法indexOf时直接触发类型错误。 reverse过滤器失效是模板语法未被解析的连带问题,和过滤器本身无关,不需要单独注册自定义过滤器。
修复步骤
按以下顺序排查调整,不需要引入额外第三方依赖:
- 补全
.eleventy.js的引擎映射配置
你使用的eleventyone脚手架默认没有显式声明Nunjucks的文件映射规则,改后缀后Eleventy无法自动匹配正确的编译器。在配置的返回对象中补充以下字段,目录路径和你项目实际结构保持一致:module.exports = function(eleventyConfig) { // 原有配置(静态资源复制、自定义过滤器等)全部保留 return { dir: { input: "src", // 替换为项目实际的源码输入目录 includes: "_includes", data: "_data" }, // 以下为必须补充的核心配置 templateFormats: ["html", "njk", "md"], htmlTemplateEngine: "njk", markdownTemplateEngine: "njk" } }; - 校验
index.njk的文件格式
确认文件最开头没有多余空行、BOM头或者特殊字符,front matter必须从第一行开始书写,格式如下:
Front matter格式不合法会导致Eleventy解析文件元数据失败,同样会触发类型错误。--- layout: base.njk title: 首页 --- <!-- 页面正文写在分隔线下方 --> - 检查文章集合配置
reverse是Nunjucks内置的数组过滤器,引擎正常加载即可直接使用。如果配置完引擎后过滤器仍不生效,检查所有博客文章的front matter是否都添加了tags: post声明:collections.post集合只有在存在对应标签的内容时才会生成,集合本身不存在时过滤器调用自然失败。
文章遍历的循环标签不需要额外加空白控制符,基础写法即可正常运行:{% for post in collections.post | reverse %} <article> <h2>{{ post.data.title }}</h2> </article> {% endfor %} - 版本兼容处理
以上步骤完成后仍报错的,检查本地Eleventy版本。eleventyone脚手架默认绑定0.x旧版本Eleventy,和新版Nunjucks语法存在兼容问题,执行以下命令升级到最新稳定版后重新构建:npm install @11ty/eleventy@latest --save-dev
内容的提问来源于stack exchange,提问作者CWebba1
相关产品推荐
相关产品推荐

