Mojolicious模板渲染(十六)
一、将资产与插件绑定
模板和静态文件等资产可以很容易地与插件绑定在一起。我们先执行如下的命令,以创建js和html静态文件:
$ mojo generate plugin AlertAssets
$ mkdir Mojolicious-Plugin-AlertAssets/lib/Mojolicious/Plugin/AlertAssets
$ cd Mojolicious-Plugin-AlertAssets/lib/Mojolicious/Plugin/AlertAssets
$ mkdir public
$ echo 'alert("Hello World!");' > public/alertassets.js
$ mkdir templates
$ echo '%= javascript "/alertassets.js"' > templates/alertassets.html.ep
我们最好基于插件的名字来起一个唯一的名称,然后调用register时,将它们各自的目录添加到搜索路径列表中:
package Mojolicious::Plugin::AlertAssets;
use Mojo::Base 'Mojolicious::Plugin', -signatures;
use Mojo::File qw(curfile);
sub register ($self, $app, $conf) {
# 增加 "templates" 和 "public" 目录
my $base = curfile->sibling('AlertAssets');
#这是唯一名字
push @{$app->renderer->paths}, $base->child('templates')->to_string;
#将目录加入搜索路径列表中
push @{$app->static->paths}, $base->child('public')->to_string;
#将目录加入搜索路径列表中
}
1;
一旦我们安装并加载了插件,这两个(js和html的静态文件)都将像普通的template和pulic目录一样工作,只是优先级稍微低一些:
use Mojolicious::Lite;
plugin 'AlertAssets';
get '/alert_me';
app->start;
__DATA__
@@ alert_me.html.ep
<!DOCTYPE html>
<html>
<head>
<title>Alert me!</title>
%= include 'alertassets'
</head>
<body>You've been alerted.</body>
</html>
上面的代码例子的工作原理与插件放置于DATA节绑定是一样的:
package Mojolicious::Plugin::AlertAssets;
use Mojo::Base 'Mojolicious::Plugin', -signatures;
sub register ($self, $app, $conf) {
# Append class
push @{$app->renderer->classes}, __PACKAGE__;
push @{$app->static->classes}, __PACKAGE__;
}
1;
__DATA__
@@ alertassets.js
alert("Hello World!");
@@ alertassets.html.ep
%= javascript "/alertassets.js"