Mozilla/Nunjucks 模板引擎 API 深度解析

Mozilla/Nunjucks 模板引擎 API 深度解析

nunjucks A powerful templating engine with inheritance, asynchronous control, and more (jinja2 inspired) nunjucks 项目地址: https://gitcode.com/gh_mirrors/nu/nunjucks

Nunjucks 是一个功能强大、灵活的 JavaScript 模板引擎,由 Mozilla 开发并维护。本文将深入解析 Nunjucks 的核心 API,帮助开发者全面掌握其使用方法。

安全警告:用户自定义模板风险

在使用 Nunjucks 时,绝对不要运行用户定义的模板或将用户内容注入模板定义。这会导致严重的安全问题:

  • 服务器端:可能导致数据泄露和代码执行风险
  • 客户端:即使使用预编译模板,也可能存在跨站脚本问题

基础 API 快速入门

对于不需要深度定制的场景,Nunjucks 提供了一组简单易用的高级 API。

模板渲染方法

render - 渲染模板文件
// 同步方式
const result = nunjucks.render('template.html', { username: '张三' });

// 异步方式
nunjucks.render('template.html', { username: '李四' }, (err, res) => {
  if (err) console.error(err);
  else console.log(res);
});
renderString - 渲染字符串模板
const result = nunjucks.renderString('你好 {{ name }}', { name: '王五' });
compile - 预编译模板
const template = nunjucks.compile('{{ greeting }} 世界!');
template.render({ greeting: '你好' });  // 输出: "你好 世界!"

环境配置

configure 方法用于设置模板路径和配置选项:

nunjucks.configure('views', {
  autoescape: true,      // 自动转义HTML
  trimBlocks: true,      // 去除块后的换行符
  lstripBlocks: true,    // 去除块前的空格
  watch: true            // 监听文件变化(需安装chokidar)
});

常用配置选项说明:

| 选项 | 类型 | 默认值 | 说明 | |------|------|--------|------| | autoescape | boolean | true | 自动转义HTML特殊字符 | | throwOnUndefined | boolean | false | 遇到未定义变量时抛出错误 | | trimBlocks | boolean | false | 去除模板标签后的换行符 | | lstripBlocks | boolean | false | 去除模板标签前的空格 | | watch | boolean | false | 监听模板文件变化 | | noCache | boolean | false | 禁用模板缓存 |

高级环境控制

对于需要精细控制的场景,可以直接操作 Environment 类。

创建环境实例

// Node.js环境
const env = new nunjucks.Environment(
  new nunjucks.FileSystemLoader('views'),
  { autoescape: false }
);

// 浏览器环境
const env = new nunjucks.Environment(
  new nunjucks.WebLoader('/templates')
);

加载器(Loader)详解

Nunjucks 提供了几种内置加载器:

  1. FileSystemLoader - 文件系统加载器(Node.js专用)

    new nunjucks.FileSystemLoader('views', {
      watch: true,    // 监听文件变化
      noCache: true   // 禁用缓存
    })
    
  2. WebLoader - 网络加载器(浏览器专用)

    new nunjucks.WebLoader('/templates', {
      useCache: false,  // 禁用缓存
      async: true       // 异步加载
    })
    
  3. NodeResolveLoader - Node模块解析加载器

    new nunjucks.NodeResolveLoader()
    

自定义扩展

添加全局变量
env.addGlobal('companyName', 'Acme Inc.');
添加自定义过滤器
// 同步过滤器
env.addFilter('shorten', str => str.slice(0,50));

// 异步过滤器
env.addFilter('asyncFilter', asyncFunc, true);
添加自定义标签
env.addExtension('customTag', {
  tags: ['custom'],
  parse: function(parser, nodes) {
    // 解析逻辑
  },
  run: function(context) {
    // 执行逻辑
  }
});

模板继承与包含

Nunjucks 支持强大的模板继承系统:

<!-- base.html -->
<html>
<head>
  {% block head %}
  <title>{% block title %}默认标题{% endblock %}</title>
  {% endblock %}
</head>
<body>
  {% block content %}{% endblock %}
</body>
</html>

<!-- child.html -->
{% extends "base.html" %}

{% block title %}子页面标题{% endblock %}

{% block content %}
  <h1>页面内容</h1>
{% endblock %}

异步支持

Nunjucks 提供了完整的异步支持:

// 异步渲染
env.render('async.html', { data }, (err, res) => {
  // 处理结果
});

// 异步过滤器
env.addFilter('asyncLookup', function(name, callback) {
  database.lookup(name, callback);
}, true);

性能优化建议

  1. 生产环境预编译:使用 Nunjucks 的预编译功能可以显著提高性能
  2. 合理使用缓存:在开发环境禁用缓存,生产环境启用缓存
  3. 避免同步阻塞:在高并发场景下使用异步API
  4. 精简模板复杂度:减少模板中的复杂逻辑

常见问题解决方案

问题1:模板修改后不生效

  • 解决方案:确保配置了 watch: true 并安装了 chokidar 依赖

问题2:包含或继承模板失败

  • 解决方案:检查加载器配置和模板路径是否正确

问题3:特殊字符被转义

  • 解决方案:使用 safe 过滤器或调整 autoescape 配置

通过深入理解 Nunjucks 的 API 和运行机制,开发者可以构建出既安全又高效的模板系统。无论是简单的页面渲染还是复杂的应用架构,Nunjucks 都能提供强大的支持。

nunjucks A powerful templating engine with inheritance, asynchronous control, and more (jinja2 inspired) nunjucks 项目地址: https://gitcode.com/gh_mirrors/nu/nunjucks

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔡妙露Percy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值