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包含了可用选项的完整列表。