如何在Nunjucks中判断字符串及front matter字段是否为空
Nunjucks 判空功能实现方案
Nunjucks 没有原生内置等同于 JavaScript 中 isEmpty() 的通用判空方法,你可以通过原生语法直接实现常用场景判空,也可以在 Eleventy 中自定义过滤器实现全场景通用判空,具体方法如下:
方案1:使用 Nunjucks 原生语法实现常用场景判空
不需要额外配置,直接在模板中编写判断逻辑即可覆盖绝大多数日常需求:
- 普通字符串判空(覆盖undefined、null、空字符串、全空白字符串场景)
写法:{% if targetStr and targetStr.trim() %}
示例:{% if title and title.trim() %} <h1>{{ title }}</h1> {% else %} <h1>默认标题</h1> {% endif %} - Front matter 字段判空
写法和普通字符串一致,直接引用front matter中声明的字段即可:{% if description and description | trim %} <meta name="description" content="{{ description }}"> {% endif %} - 数组判空
写法:{% if targetArr and targetArr.length %} - 数值/布尔值判空(需要保留0、false为有效值的场景)
写法:{% if targetVal !== undefined and targetVal !== null %}
方案2:Eleventy 中自定义全场景通用 isEmpty 过滤器
如果需要统一的判空逻辑,推荐在Eleventy配置中添加自定义过滤器,适配所有数据类型:
- 打开项目根目录下的
.eleventy.js配置文件,添加如下代码:
module.exports = function(eleventyConfig) { // 其他已有配置保持不变 eleventyConfig.addFilter('isEmpty', function(value) { // 处理 null 和 undefined if (value == null) return true // 处理字符串(自动忽略首尾空白) if (typeof value === 'string') return value.trim().length === 0 // 处理数组 if (Array.isArray(value)) return value.length === 0 // 处理普通对象 if (typeof value === 'object') return Object.keys(value).length === 0 // 其他类型(数字、布尔值等)默认非空 return false }) }
- 在Nunjucks模板中直接使用过滤器:
{% if yourField | isEmpty %} <p>字段为空</p> {% else %} <p>{{ yourField }}</p> {% endif %} <!-- 取反判断非空 --> {% if not (yourField | isEmpty) %} <p>字段非空</p> {% endif %}
注意事项
Nunjucks 原生 if 判断存在隐式真值转换,0、false、空字符串、null、undefined 都会被判定为假值,如果你的业务场景中需要将0、false判定为有效值,使用自定义过滤器调整逻辑即可。
内容的提问来源于stack exchange,提问作者kuwts
相关产品推荐
相关产品推荐

