使用 jinja2 兼容模式预编译 Nunjucks 模板

Precompiling Nunjucks templates with jinja2 compatibility mode

Nunjucks 越来越强大jinja compatibility mode。如果我包含完整的 nunjucks,我可以在渲染模板之前使用它调用 nunjucks.installJinjaCompat()(见下面的代码片段):

nunjucks.installJinjaCompat();
var res = nunjucks.renderString(
  '{% for i in list[0:2] %}' +
  '  count: {{ i }}' +
  '{% endfor %}',
  {list: [1, 2, 3, 4]}
);
document.write(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/nunjucks/3.0.1/nunjucks.min.js"></script>

虽然我不知道如何预编译相同的代码。有文件 list.njk:

{% for i in list[0:2] %}
    count: {{ i }}
{% endfor %}

precompile使用默认的nunjucks-precompile list.njk > list.js命令,但它引发:

/usr/local/lib/node_modules/nunjucks/src/precompile.js:130
        throw lib.prettifyError(name, false, err);
        ^

Template render error: (list.njk) [Line 1, Column 15]
  parseAggregate: expected comma after expression
    at Object.exports.prettifyError (/usr/local/lib/node_modules/nunjucks/src/lib.js:34:15)
    at _precompile (/usr/local/lib/node_modules/nunjucks/src/precompile.js:130:19)
    at precompile (/usr/local/lib/node_modules/nunjucks/src/precompile.js:79:27)
    at Object.<anonymous> (/usr/local/lib/node_modules/nunjucks/bin/precompile:62:13)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Function.Module.runMain (module.js:441:10)
    at startup (node.js:139:18)

如果我使用与 jinja 兼容的特定构造的数组拼接,则会出错。如果我删除 [0:2].

它会编译

如何使用 jinja compat 模式预编译模板?

我已经尝试在文档、nunjucks 问题和检查 nunjucks-precompile 节点脚本中找到 nunjucks 变量,这样我就可以对其进行 monkeypatch,包括 nunjucks.installJinjaCompat() 调用;遗憾的是它不存在,它只使用 Environment.

nunjucks-precompile 似乎没有可用于 nunjucks.installJinjaCompat() 的开关,但您可以很容易地添加它:

复制现有的 CLI 文件并修改它以更正要求源并安装兼容层:

cp node_modules/.bin/nunjucks-precompile .
<edit nunjucks-precompile>
./nunjucks-precompile list.njk
...

搭配 nunjucks 3.0.1 ./nunjucks-precompile 应该看起来像

#!/usr/bin/env node
var path = require('path');
var precompile = require('nunjucks/src/precompile').precompile;
var Environment = require('nunjucks/src/environment').Environment;
var lib = require('nunjucks/src/lib');
var nunjucks = require('nunjucks');
nunjucks.installJinjaCompat();
...

或者您可以从 here 下载它。