Environment

Environment 类用来管理模板,使用他可以加载模板,模板之间可以继承和包含,上面提到的 api 都是调用了 Environment 的 api。

你可以根据需要来定制,比如定制模板加载。

constructor

new Environment([loaders], [opts])

实例化 Environment 时传入两个参数,一组 loaders 和配置项 opts。如果 loaders 不存在,则默认从当前目录或地址加载。loaders 可为一个或多个,如果传入一个数组,nunjucks 会按顺序查找直到找到模板。更多查看 Loader

opts 的配置有 autoescapethrowOnUndefinedtrimBlockslstripBlocks,在 configure 查看具体配置(express 和 watch 配置在这里不适用,而是在 env.express 进行配置)。

在 node 端使用 FileSystemLoader 加载模板,浏览器端则使用 WebLoader 通过 http 加载(或使用编译后的模板)。如果你使用了 configure 的 api,nunjucks 会根据平台(node 或浏览器)自动选择对应的 loader。查看更多 Loader

  1. // the FileSystemLoader is available if in node
  2. var env = new nunjucks.Environment(new nunjucks.FileSystemLoader('views'));
  3. var env = new nunjucks.Environment(new nunjucks.FileSystemLoader('views'),
  4. { autoescape: false });
  5. var env = new nunjucks.Environment([new nunjucks.FileSystemLoader('views'),
  6. new MyCustomLoader()]);
  7. // the WebLoader is available if in the browser
  8. var env = new nunjucks.Environment(new nunjucks.WebLoader('/views'));

render

env.render(name, [context], [callback])

渲染名为 name 的模板,使用 context 作为数据,如果 callback 存在,在完成时会调用,回调有两个参数:错误和结果( 查看 asynchronous support)。如果 callback 不存在则直接回返结果。

  1. var res = nunjucks.render('foo.html');
  2. var res = nunjucks.render('foo.html', { username: 'James' });
  3. nunjucks.render('async.html', function(err, res) {
  4. });

renderString

env.renderString(src, [context], [callback])

render 相同,只是渲染一个字符串而不是加载的模块。

  1. var res = nunjucks.renderString('Hello {{ username }}', { username: 'James' });

addFilter

env.addFilter(name, func, [async])

添加名为 name 的自定义过滤器,func 为调用的函数,如果过滤器需要异步的,async 应该为 true (查看 asynchronous support)。查看 Custom Filters

getFilter

env.getFilter(name)

获取过滤器,传入名字返回一个函数。

addExtension

env.addExtension(name, ext)

添加一个名为 name 的扩展,ext 为一个对象,并存在几个指定的方法供系统调用,查看 Custom Tags

removeExtension

env.removeExtension(name)

删除之前添加的扩展 name

getExtension

env.getExtension(name)

获取扩展,传入名字返回一个函数。

hasExtension

env.hasExtension(name)

如果 name 扩展已经被添加,那返回 true。

addGlobal

env.addGlobal(name, value)

添加一个全局变量,可以在所有模板使用。注意:这个会覆盖已有的 name 变量。

getGlobal

env.getGlobal(name)

返回一个名为 name 的全局变量。

getTemplate

env.getTemplate(name, [eagerCompile], [callback])

获取一个名为 name 的模板。如果 eagerCompiletrue,模板会立即编译而不是在渲染的时候再编译。如果 callback 存在会被调用,参数为错误和模板,否则会直接返回。如果使用异步加载器,则必须使用异步的 api,内置的加载器不需要。查看 asynchronous supportloaders

  1. var tmpl = env.getTemplate('page.html');
  2. var tmpl = env.getTemplate('page.html', true);
  3. env.getTemplate('from-async-loader.html', function(err, tmpl) {
  4. });

express

env.express(app)

使用 nunjucks 作为 express 的模板引擎,调用后可正常使用 express。你也可以调用 configure,将 app 作为 express 参数传入。

  1. var app = express();
  2. env.express(app);
  3. app.get('/', function(req, res) {
  4. res.render('index.html');
  5. });

opts.autoescape

env.opts.autoescape

你可以通过这个配置控制是否全局开启模板转义,这对于创建高级过滤(如 html 操作)非常有用。正常情况你可以返回 SafeString,输出保持和输入一致不做任何处理,但这只在很少场景下有用。