模板编译

v2.0.0 开始,jntemplate 正式支持模板编译功能,在默认配置下,引擎将在第一次执行模板时自动进行编译。

同时也支持用户手动对模板进行预编译:

编译模板文件

对指定的模板文件进行编译, 方法: Engine.CompileFile(...)

参数说明

name

模板名称,必须是唯一不重复的字符,如果为null,默认会使用模板文件的绝对路径做为模板的name。

WARNING

  1. name 会做为模板缓存键使用,如果重复会导致使用异常。
  2. 如果指定了自定义的name,在使用对应的Engine.LoadTemplate(...)方法加载模板时,必须指定同样的name

fileName

模板路径,可以使用相对路径或者绝对路径。如:

  • /var/wwwroot/index.html linux 系统绝对路径
  • c:\wwwroot\index.html windows 系统绝对路径
  • template/index.html 相对路径。注意相对路径不要在前面加其它符号,比如/

TIP

如果使用的是相对路径,引擎会去ResourceDirectories里面按顺序寻找模板文件,如果未配置该参数,或者文件不存在,则会引发资源未发现的异常。

action

编译变量配置Action,通过action可以为模板中用到的变量指定类型。该类型必须与实际参数类型一致。

示例

以下代码演示如何编译一个模板文件demo.html:

    Engine.CompileFile("demo", @"c:\wwwroot\index.html", (ctx) =>
    {
        ctx.Set("name",typeof(string));
        ctx.Set("id", typeof(int));
        //..其它参数 此处只需要指定类型即可,不需要传实际的值
        ctx.CurrentPath = @"c:\wwwroot\"; //当前模板文件目录
    });

此处指定了模板名称demo,在使用LoadTemplate时,也必须指定该名称:Engine.LoadTemplate('demo',@"c:\wwwroot\index.html")

编译模板内容

如果模板不是来源于文件,而是来源于字符串,可以使用Engine.Compile(...)进行字符串编译。

参数说明

name

模板名称,必须是唯一不重复的字符,如果为null,默认会使用模板内容的HashCode做为名称。

WARNING

  1. name 会为做模析缓存键使用,如果重复会导致异常。
  2. 如果指定了自定义的name,在使用对应的Engine.CreateTemplate(...)方法加载模板时,必须指定同样的name

content

模板内容,不能为空或者null.

action

编译变量配置Action,通过action可以为模板中用到的变量指定类型。该类型必须与实际参数类型一致。

示例

以下代码演示如何编译一个模板内容字符串:

    Engine.Compile("hello", @"hello, $name", (ctx) =>
    {
        ctx.Set("name",typeof(string));
        //..其它参数 此处只需要指定类型即可,不需要传实际的值
    });

此处指定了模板名称hello,在使用CreateTemplate时,也必须指定该名称:Engine.CreateTemplate('hello',@"hello, $name")

TIP

执行编译成功后,在使用Engine.CreateTemplate时,模板内容可以传空.

模板变更处理

引擎基于性能考虑,不会追踪模板内容的变更。如果在模板编译完成后,模板内容发生了变动,可以重新调用对应的编译方法(考见上面的编译模板内容编译模板文件项)重新编译模板,使变更内容生效,也可以直接使用IEngine.Clean()Engine.Current.Clean()清空编译对象。

注意:Clean会清除所有编译对象,不建议频繁使用。

其它事项

如果你的模板不是来源于文件(比如来源于数据库),可以通过自定义资源加载器(IResourceLoader)并在配置中指定该类型来支持。

Last Updated:
Contributors: 翅膀的初衷, hnvvv