Mojolicious模板渲染(十八)

一、分块传输编码

对于非常动态的内容,我们可能事先不知道响应内容的长度,这时Mojolicious::Controller模块的write_chunk方法派上用场了。一种常见的用法是提前将HTML文档的head部分发送到浏览器,从而加速引用图像和样式表的预加载:

use Mojolicious::Lite -signatures;
 
get '/' => sub ($c) {
  $c->write_chunk('<html><head><title>Example</title></head>' => sub ($c) {
    $c->finish('<body>Example</body></html>');
  });
};
 
app->start;

上例子中回调函数是可选的,确保在继续处理之前已经写入了所有我们需要发送给浏览器的块。

HTTP/1.1 200 OK
Date: Sat, 13 Sep 2014 16:48:29 GMT
Transfer-Encoding: chunked
Server: Mojolicious (Perl)
 
29
<html><head><title>Example</title></head>
1b
<body>Example</body></html>
0

特别是结合长时间的非活动超时,这对Comet(长轮询)非常有用。由于某些web服务器的限制,这并不能在所有部署环境中完美地工作。

二、编码

存储在文件中的模板默认是UTF-8,但可以通过Mojolicious::Renderer中的“encoding”轻松更改。

$app->renderer->encoding('koi8-r');

DATA部分中的所有模板都绑定到Perl脚本的编码。

use Mojolicious::Lite;
 
get '/heart';
 
app->start;
__DATA__
 
@@ heart.html.ep
I ♥ Mojolicious!

三、Base64编码的数据文件

使用Base64编码的静态文件(如图像)可以很容易地存储在应用程序的DATA部分,类似于模板。

use Mojolicious::Lite;
 
get '/' => {text => 'I ♥ Mojolicious!'};
 
app->start;
__DATA__
 
@@ favicon.ico (base64)
...base64 encoded image... #把图片的base64编码字符串放置于此处

四、膨胀DATA模板

膨胀,官方的英文词汇为inflate。这是一个很实用的命令,会将单文件mojolicious应用中的DATA部分的模板、静态文件分别迁移到templates和public文件夹下生成独立的文件:

$ ./myapp.pl inflate

五、自定义模板语法

我们可以通过自定义配置加载Mojolicious::Plugin::EPRenderer来轻松改变整个模板语法。

use Mojolicious::Lite;
 
plugin EPRenderer => {
  name     => 'mustache',
  template => {
    tag_start => '{{',
    tag_end   => '}}'
  }
};
 
get '/:name' => {name => 'Anonymous'} => 'index';
 
app->start;
__DATA__
 
@@ index.html.mustache
Hello {{= $name }}.

Mojo::Template包含了可用选项的完整列表。

标签